读论文10——Problem B: Routing with Cell Movement Advanced

innovus/ICC2:实际绕线层次有低于routing rule min layer的情况如何解决? 这是因为routing rule的min layer是soft rule,如果希望min layer严格按照设置的来,还需要手动添加如下命令: 阅读详情

前言

这是一个EDA设计大赛的文档。通过阅读它我们能够更好地理解布局和布线。
应该是ICCAD-2020的大赛。

Introduction

芯片设计的物理实现问题,被我们分成了两个子问题:布局和布线。一个常用的方法是将这两个子问题分解成更多子问题。这种分而治之的目的是保证复杂的问题在有限的时间内可解。
随着越来越多的子问题被定义出来,他们之间的关联和目的就不再相互支持。而且在一些特定的子问题中,会有意地保留一些余量,这种余量反而会成为分而治之方法的弱点。比如,在布局阶段,元器件的密度或者管脚密度会限制布局,那么就存在很保守的方法去维持大的余量,以保证在后面的布线阶段能够快速收敛。但是这样做的话,元器件密度或者引脚密度就不能很好地与实际布线问题相关联。
在这个比赛中,参赛者们需要努力探索一种有着布线引擎的方法,还能做元器件的移动。这样的话,就可以消除余量和失调问题了。

问题:
(1)什么是元器件的移动?我理解为参赛者可以把赛题中的某些已经布局好的元器件重新排放,也就是在布线的同时调整布局。

Contest Objective

开发一种全局路由的布线引擎,它还要遵守给出的布线限制。这种引擎还要能将元器件从一个gGrid移动到另一个(在满足布线限制的前提下),以获得更小的布线长度。为了简化问题,在题目的输入文件中将会给参赛者一个原始的布线结果。参赛者可以从这个最初结果出发,然后移动一些元器件并进行重连,以获得更小的布线长度。参赛者也可以丢弃初始的布线数据。值得说明的是,参赛者能移动的元器件的数量是有限的。

问题:
(1)对于芯片设计来说,什么是gGrid?我理解为网格空间。它是一个格子,而不是像围棋棋盘上那一个格点。它是一个三维的空间块。

Problem Formulation,Input/Output Format

Input data

  1. 能够移动的元器件的数量。(限制了数量而不限制移动距离)
  2. gGrids的行数和列数。gGrid也可以理解为问题的最小分辨率。然后有很多的布线层。整个布线空间就像是一个三维立方体。
  3. 有些层只能布水平线,有些层只能布竖直线。每一层的gGrid的默认供应值会给出来。M1层的布线方向总是水平的。两个相邻层的布线方向总是不同的。不同层的布线功率不同,所以用一个基于层的因素powerFactor去表示某一层的布线功率消耗。
  4. 有的gGrid的supply不是该层的默认值,所以就应该有一个增减值的偏移。
  5. 各种master cells的细节信息都会给出。master cell,我将其理解为一个元器件类,是被封装好了内部的管脚、堵塞(blockage)。而instcell则是这个类的具体实现对象。
  6. 被放置的单元实例和网表会被给出。网表可能有:最小路由层约束(min routing layer constraint).单元实例也有可移动和不可移动之分。
  7. 基于网络的权重这个概念也挺有趣。考虑到运行时间,用网络在关键路径上的时间来表示网络临界。对于不在关键路径上的网络,权值为1.鼓励参赛者为关键路径上的网络减少权值。
  8. 电压区域限制。一个单元实例只能被移动到电压相同的其他gGrid上。

问题:
什么是gGrid的供应值(supply value)? 我理解为一个gGrid的容量。这个gGrid最多只能容纳多少条线。与supply对应的概念是demand——对某一个gGrid的需求。
什么是最小路由层约束?

supply and demand

对于一个gGrid,demand不能大于supply。一个gGrid的demand为:该gGrid中有路由段的网络的数量加上该gGrid中所有单元实例的阻塞需求。

connectivity model

我们将要给routing segment看成一个路由线段(或者说是计算机网络中讲的一跳),这里讲了两个路由段如何称作被连接在一起。

Routing lengths

路由长度=路由片段产生的需求之和。

output data

输出文件应该有以下信息:
被移动过的元器件实例。最终完成的路由信息。

Example

举例说明了如何布线。

Evaluation

Program Requirements

讲了一些项目的要求。比如一个网络中所有引脚要相互连通。水平方向的路由段在奇数层而竖直方向的路有段在偶数层。
最终的评分法则:
在这里插入图片描述

Evaluator

网上有相应的资源可以检验成果。

ICC2:Design Planning(02)Shaping Placement 阅读详情

相关推荐

ICC2 user guide (一) Preparing the Design

ICC2 Preparing the Design部分user guide解读

m0_61544122的博客 5075

不敢去争取,学不会珍惜,却难以忘记——dbGet(三)

我们继续上次,介绍dbGet剩余的object内容 inst flat design下的instance Parent Object group, hInst, instTerm, io, pBlkg, ptn, rBlkg, ...

IC后端小白的博客 3542

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 989

ICC II 8 Routing & Optimization(布线优化)

Object: 执行 布线前的检查和设置 使用 route_auto 布线signal nets 报告 修复 DRC 的违例 优化设计使用route_opt 布线阶段的目标 (routing phase goal) 布局和时钟树综合此时应该是完成的; 可接受的拥塞 setup/hold time 以及逻辑DRCs 时钟树网络已经被布线了; 布线阶段的目标是: 在最小化物理DRC违例情况下 将所有的signal nets 布线 选择性的执行 布线后的 时钟树优化或者CCD; 优化数据路径逻辑的 时序 DRC

旺旺家族的传说 1万+

1.用Python写了一个进销存管理的软件~需求分析&界面设计&数据库设计&技术路线选择~

前端也打算用Python来写,查了很多的python库,大家比较推荐的是wxpython和QPython,之前接触过一点点的QT,确实非常强大,但是库比较重量级,自己写的这个东西明显配不上QT,又详细调研了一下wxpython,就是它了!

pepper_lihui的专栏 4322

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 362

数字IC设计工艺库简介

介绍数字IC设计中逻辑综合使用的技术库和相关概念

qq_42922513的博客 1万+

模拟ic入门——设计一个带隙基准Bandgap(三)高阶温度补偿与启动电路设计

本节我们来介绍高阶温度补偿,以及一些启动电路的设计,附上一些经典的论文供大家学习

qq_64956710的博客 1万+

数字后端的各种cell简介

数字后端cell简介

zgr1379747458的博客 6136

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

WW、forever的博客 193

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3587

如何加快城市路网中最短路径查询效率?

一、介绍 最短路查询算法是图论中的经典算法,被广泛地应用在不同场景,例如计算机网络中的路由算法。在时空场景下,最短路算法更是支撑了很多应用,例如在路径规划和推荐中最短路是一种最直接的方案,而目前主流的基于隐马尔科夫模型的轨迹地图匹配算法也会产生大量的最短路查询 [1]。具体如图1所示,在计算相邻两个轨迹点之间可能的匹配路段时,地图匹配算法会首先做一个范围查询确定候选路段,为了计算候选路段之间的转移概率,地图匹配算法会对两个候选集合所有路段两两之间做最短路查询。然而,这些实际应用中的图往往规模巨大,未经优化

wangchewen的博客 794

【软件系统架构】系列四:嵌入式技术

嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软硬件集成于一体的专用计算机系统。它需要满足功能、可靠性、成本、体积、功耗等方面的严格要求。 嵌入式系统一般由以下组成部分构成:

moton2017的博客 1000

LBS之二:移动定位、导航与互联网地图

移动定位、导航与互联网地图的认知基础

whascj的博客 1373

Vue3 - Element Plus 全局修改更换主题色配置详细教程,element-plus自定义主题色全局替换主色调强力解决方案,支持动态修改主题颜色/动态皮肤,将默认蓝色主题色更换为其他颜色!

vue3,nuxt3,element-plus,组件库,主题色,修改主题颜色,更换主题色,如何修改组件默认主题蓝色,项目主题色定制,修改失败,主题色覆盖不了,:root直接修改,hover颜色没改,自定义主题色,vue3全局设置elementPlus主题色最新详细修改教程,怎么修改全局的颜色,scss变量,覆盖原来的主题色改为自己的颜色,统一替换,有没有好办法,颜色不变,失败,无效,动态主题切换,主题颜色怎么在项目里直接改,plus主题色更换,覆盖默认主题色,最强最好用,设置主题色,换肤,皮肤,动态更换

🏆 前端领域优质创作者 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

[读论文] Towards Machine Learning for Placement and Routing in Chip Design: a Methodological Overview

在现代芯片设计流程中,放置和布线是两个不可或缺且具有挑战性的 NP-hard 问题。与使用启发式算法或专家精心设计的算法的传统求解器相比,机器学习凭借其数据驱动的性质显示出了广阔的前景,它可以减少对知识和先验的依赖,并且通过其先进的计算范式具有更大的可扩展性 (例如 GPU 加速的深度网络)。本调查首先介绍了基本的布局(Placement)和布线(Routing),并简要介绍了经典的无学习解算器。

大家好~我是SP_FA~ 1597

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

tsmc std cell 命名规则

1. 命名规则 2. 特定功能前缀(CK)/特殊前缀 3. 存储功能前缀(reg/latch/scan) 4. 数据通路前缀 5. 附加功能命名(Clear/Set) 6. 输出命名 7. 组合逻辑前缀 ...

cy413026的博客 3万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

EDA冠军,首次参加比赛,就夺得全球第一,全网沸腾

平均年龄24岁,首次参加比赛,就夺得全球第一!记者11月8日从华中科技大学获悉,在11月4日结束的EDA领域国际会议ICCAD2021上,华中科技大学计算机学院吕志鹏教授团队获得了CADContest布局布线(RoutingwithCellMovementAdvanced)算法竞赛的第一名。 华中科技大学计算机学院吕志鹏教授团队。供图/华中科技大学   据介绍,EDA(Electronic design automation缩写)即电子设计自动化,是电子设计的基石产业,也被誉为“...

【优快云】 2909

markdown时间线,时序图

项目 时间时间管理,图是什么图? 甘特图 markdown可以绘制甘特图吗? #下边是时序图 Alice -> Bob:Hello Bob, How are you? Note right of Bob: Bob thinks Bob -> Alice: I am good thanks! ```sequence #下边是时序图 Alice -> Bob:Hello Bob, How are you? Note right of Bob: Bob think...

Kp0fS的草稿纸 6948

FPGA 帧长监视器:背压时不计数,过长时不回绕

用 SystemVerilog 构建被动帧长监视器,只统计 valid 与 ready 同时有效的传输,在接受 last 时报告短帧、正常帧或长帧。计数饱和避免超长回绕,附完整 RTL、测试台与复现脚本,并给出原生 XSim 及独立复核结果。

hxy_programmer的博客 466

FPGA 16 位 LFSR:先固定移位约定,再用 XSim 验证周期与暂停

固定一种 16 位右移 Galois LFSR,明确反馈掩码、种子、同步复位、装载与使能优先级。用原生 Vivado XSim 检查三种种子的 65535 状态周期、暂停和采样时刻,并通过独立测试台与故障变体验证。

hxy_programmer的博客 179

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 355

轨交车载 ARM+FPGA+AI 控制单元:宽温、振动、EMC、可靠性设计

❌ 把 EtherCAT 主站、安全采集放在 ARM Linux 里,PREEMPT_RT 再怎么调,振动 + EMC 叠加下依然有概率丢帧 ✅ 总线时序、同步采集交给 FPGA,ARM 只做协议栈解析❌ AI 算力卡直接挂在 ARM 总线上、无隔离,NPU 大电流波动污染电源,导致 FPGA 采集漂移 ✅ AI 卡独立隔离电源,PCIe 增加隔离 / 缓冲,FPGA 侧做电源质量监控❌ 盲目上全机冗余,成本暴涨;

szxinmai的博客 373

FPGA 与加密行业:从算法加速到可信硬件的完整技术图谱

本文系统探讨FPGA与密码学的深度交叉,揭示其在加密加速、区块链基础设施、零知识证明及后量子密码中的关键作用。从底层硬件特性到工程实践,分析对称加密、公钥算法、零知识证明等负载的FPGA加速优势,强调其高能效、低延迟与灵活可重构的特性。结合当前密码学复杂度上升与硬件竞争加剧的趋势,指出FPGA是算法验证与高性能实现的理想载体,为安全计算提供高效硬件支撑。

weixin_49780322的博客 251

FPGA 一路数据送两路接收端:独立背压下如何保证每路只收到一次

一个载荷寄存器和两个 pending 位,实现两路独立背压下的精确复制,解释最后副本与新输入同拍、复位边界和逐输出记分板。附完整 SystemVerilog 与可复现自检。本次XSim行为仿真与独立复核通过,未综合或上板。

hxy_programmer的博客 429
上一篇: 读论文9——On Joint Learning for Solving Placement and Routing in Chip Design
下一篇: 读论文11——Optimizing FPGA-based Accelerator Design for Deep Convolutional Neural Networks
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值