Vivado使用技巧(13):约束功能概述

vivado时序约束与管脚约束 阅读详情
AI摘要

本文深入探讨FPGA设计约束的概念,包括时序约束与时钟定义的重要性,如何使用XDC文件和Tcl脚本来管理约束,以及约束在综合与实现过程中的应用。文章还介绍了物理约束与平面规划,以及如何通过GUI工具进行管脚赋值和创建Pblock。

设计约束概述

设计约束就是定义编译过程中必须满足的需求,只有这样才能保证在板子上工作时功能正确;但不是全部约束在所有过程中都会使用,比如物理约束只用在布局和布线过程中;Vivado工具的综合和实现算法是时序驱动型的,因此必须创建合适的时序约束;我们必须根据应用需求选择合理的约束,过度约束或约束不足都会造成问题;

老版的ISE开发工具使用UCF(User Constraints File)文件进行约束;新的Vivado开发工具使用XDC(Xilinx Design Constraints)进行约束;在描述设计约束方面,标准SDC(Synopsys Design Constraints)格式已经发展超过了20年,且应用最为广泛,XDC约束正是基于SDC格式,再加入Xilinx的一些物理约束;

XDC约束可以用一个或多个XDC文件,也可以用Tcl脚本实现;XDC文件或Tcl脚本都要加入到工程的某个约束集(set)中;虽然一个约束集可以同时添加两种类型约束,但是Tcl脚本不受Vivado工具管理,因此无法修改其中的约束;


管理约束

Vivado支持使用一个或多个约束文件,对于大型设计来说,仅使用一个约束文件往往不便于维护;最好的做法是将时序约束和物理约束分别保存到不同的文件中,或者某些特定模块使用一个单独的约束文件 ;

约束文件(XDC文件或Tcl脚本)需要添加到约束集中,一个工程可以包含多个约束集,一个文件也可以添加到多个约束集中;下图显示了一个工程中的约束集,该约束集包括两个约束文件,分别为物理约束和时序约束:

另外注意,生成IP核时,IP核的约束文件不会显示在上图列表中,只会显示在IP Sources窗口中;

默认情况下,所有的XDC约束文件会同时应用于综合和实现过程中。在XDC文件的属性窗口中修改如下图中选项,可以选择XDC文件的使用阶段,对应的属性为USED_IN_SYNTHESIS和USED_IN_IMPLEMENTATION:

但是DONT_TOUCH属性不受上述设置的限制,比如在综合XDC中使用了DONT_TOUCH属性,即使Used In没有选中Implementation,该属性仍会传递到实现过程中 ;


排列约束的顺序

XDC约束会遵循一套优先级规则,按顺序应用于设计中;当多个物理约束之间产生矛盾时,顺序靠后的约束会覆盖之前的约束;比如一个I/O端口前后绑定了两个管脚位置,则顺序上靠后的约束会起作用;推荐的约束顺序如下:

  • 时序声明部分:主时钟、虚拟时钟、生成的时钟、时钟组、总线斜率约束、输入与输出延迟约束。
  • 时序异常部分:虚假路径、最大延迟/最小延迟、多时钟路径、个例分析、屏蔽的时序。
  • 物理约束部分:可以放在时序约束之前或之后,最好存储在一个单独的约束文件中

 约束应该以时钟定义开始,因为时钟必须在被其它约束引用之前定义好;如果在定义之前便引用了时钟,会导致错误发生,该约束将被忽略掉;约束文件的顺序相当重要,设计者应该确保每一个文件中的约束不依赖于其它文件中的约束;如果这种情况发生,应该考虑合并两个文件,或者按照更合理地方式重新组织约束文件;

所有新的约束都会保存到标记为target的XDC文件的末尾;如果约束集中有多个XDC文件,大多数情况下target文件不是最后一个XDC文件,这就导致保存到磁盘上的约束顺序和内存中的约束顺序并不相同(内存中执行相当于在最后插入一个新约束,而存储到磁盘中确是在中间插入了一个新约束),因此设计者需要验证最终存储的约束顺序可以正确工作;

一般来说,在不包含IP核的工程中,所有的约束被放在一个约束集中,约束的排列顺序表明了约束的读取顺序,排在最前面的约束最先被读取,可以通过上下移动约束文件来改变约束读取的顺序,如下图所示:

许多IP核会自带一个或多个XDC文件,如下图所示:

 

默认情况下,IP核的XDC文件在用户编写的XDC文件之前读取,在该情况下允许IP核创建一个参考时钟,同时也允许用户XDC文件覆盖IP核的物理约束;但是也有例外,如IP核需要用到用户定义的时钟时,此时IP核的XDC文件在用户XDC文件之后读取! 

每个约束文件都有PROCESSING_ORDER属性,属性值可以是:EARLY,必须首先被读取;NORMAL,默认;LATE:必须最后被读取;

 注意IP核的XDC文件只会是early或者late,而不会是normal!对于包含依赖时钟的IP核,XDC文件的读取顺序属性设置为late;对于不包含依赖时钟的IP核,XDC文件的读取顺序设置为early;同时,对于多个IP核的XDC文件,如果他们有相同的PROCESSING_ORDER属性,则读取顺序由IP核的导入顺序决定,一般无法更改!

下面对XDC文件的读取顺序做一个总结,从上到下的读取顺序:

1.用户XDC文件,标记为early;

2.IP核XDC文件,标记为early;

3.普通的用户XDC文件(normal);

4.IP核XDC文件,标记为late(对用户时钟存在依赖);

5.用户XDC文件,标记为late;

属性值为LATE的IP核XDC文件名称为<IP_NAME>_clocks.xdc;在Tcl控制台中使用report_compile_order -constraints命令可以报告所有约束文件的状态,其中就包括PROCESSING_ORDER属性;


约束方法

完成约束有两种方法:(1).直接编辑XDC文件;(2).打开某一阶段的设计,Elaborated设计、综合后设计或实现后设计,直接对某对象进行约束;采用第2种方法,在编辑约束时,Tcl控制台中会显示等价的XDC命令,该命令是存储在内存中的,在综合或实现前,必须点击Save Constraints保存约束;如果是新的约束,则会添加到标记为target的约束文件中;如果是对已存在的约束进行修改,则会修改XDC文件中原来位置的命令;

上述两种约束方法最好不要同时使用,否则容易混淆导致约束没有起作用;如果需要在两种约束方法之间切换,要确保保存了当前约束,或者重新导入一下设计,下图给出了约束的流程图:


管脚赋值与平面规划

本节介绍两种使用GUI完成约束的方法。第一种是创建与编辑顶层端口位置,即通常所说的管脚赋值(Pin Assignment);打开某一阶段设计后,将视图切换为“I/O Planning”,如下图: 

切换到该视图后会自动打开如下4个窗口:

  • Device:编辑端口在器件平面规划图中的位置;
  • Package:编辑端口在器件封装中的位置;
  • I/O Ports:可以选择一个端口,拖动到Package或Device窗口中的某个位置,也可以观察每个端口的各个属性;
  • Package Pins:观察每个I/O Bank的资源利用率;

另一种是平面规划(Floorplanning),主要是创建和编辑Pblock来限制某些对象的布局范围;打开某一阶段设计后,将视图切换为“Floorplanning”,如上图;切换到该视图后会自动打开如下3个窗口: 

  • Netlist:选择赋值到某个Pblock的单元对象;
  • Physical Constraints:观察设计中的Pblock和各自的属性;
  • Device:创建或编辑Pblock在器件中的形状和位置;

在Netlist窗口中选择某些单元,将其拖动到Device窗口的目标位置中,即可将单元位置约束到某一特定的BEL或SITE。这两个部分都可以称作“物理约束”,另外还有“时序约束”,需要借助时序约束向导; 


XDC模板

vivado为verilog和XDC文件提供了大量的语言模板,如下图所示:

 

XDC模板主要分为三大类,如下图所示:时序约束;物理约束;配置

 


创建综合约束 

Vivado综合引擎将设计的RTL描述转换为一个工艺映射网表,在这个阶段可以使用约束来指导综合引擎解决设计需求。涉及到的约束包括4个方面:

  • RTL属性:综合属性在综合篇中有详细介绍,这些约束通常与某些逻辑部分的映射方式直接相关,比如保留特定的寄存器和网络防止被优化、控制最终网表中的设计层次等等;
  • 时序约束:可以在该阶段起作用的时序约束有create_clock、create_generated_clock、set_input_delay、set_output_delay、set_clock_groups、set_false_path、set_max_delay和set_multicyclye_path;
  • 物理与配置约束:这部分约束不会作用于该阶段,因此会被综合引擎忽略;
  • Elaborated设计约束:在综合阶段,网络延迟模型还不精确,因此主要目标是得到一个满足时序或时序违背程度较小的综合网表,可以对Elaborated设计分析RTL设计得到的对象进行约束;可以利用Tcl控制台来测试想要执行的XDC命令是否有语法错误,再保存到XDC文件中;
     

一些RTL名称在Elaborated设计中会被修改或删除,因此不能直接使用RTL设计中的对象名称;部分对象如顶层端口、实例化原语在RTL和Elaborated设计中总是相同的,下面给出一些名称会发生变化的例子,需要特别注意: 

  • 单bit寄存器:RTL中的信号名称添加后缀_reg,如RTL中定义reg data,则对应的寄存器名称为data_reg;
  • 多bit寄存器:与单bit寄存器相同,但约束时必须单独约束每个bit或直接当作一组约束,如定义reg [3:0] data,可以对reg[0]或reg[*]约束,但不能对reg[1:0]约束;
  • 合并的寄存器和网络:存储块、DSP、移位寄存器等接口会将几个设计对象合并到一个资源中,导致RTL源文件中的一些寄存器或网络不会出现在Elaboratd设计中,对于这类对象,无法直接约束,应该寻找与其相连的其它寄存器或网络;
  • 层次名称:默认情况下,综合可能会将某些层次结构展开,融为一体(可以用-flatten_hierarchy设置),约束时要使用完整的层次名称来指定对象,而不要使用通配符‘*’,如‘inst_A/inst_B/data_reg’;
     

总而言之,就是要明确约束的对象,否则很容易造成约束没有按设计者意图进行;比如不要对层次接口的管脚做约束,因为这些管脚仅仅起到了连接各个层次的作用;也不要对与组合逻辑运算符相连的网络做约束,因为组合逻辑运算会采用查找表方式实现,导致该网络并不会出现在综合网表中 ;


创建实现约束

综合过后,将综合网表和XDC文件(或Tcl脚本)一同导入到内存中,用于实现过程;导入时必须观察Vivado报告的消息,据此来验证和修改那些没有应用成功的约束;正如综合约束使用的Elaborated设计对象名称会和RTL中名称不同,实现约束使用的综合网表对象名称也可能会和Elaborated设计中的名称不同;如果发生上述情况,则必须重新创建某些约束,并仅作用于实现阶段;

前文也说过物理和配置约束仅会在实现阶段起作用,因此也最好存储到一个单独的XDC文件中,设置为仅作用于实现阶段。综合过程中可能会复制某些寄存器,以提高设计性能,必须使用get_cells/get_pins -include_replicated_objects命令获取对象,才能确保XDC约束也作用于复制出来的寄存器;当然很难直接感觉到哪个对象需要像上述这样做,幸好在Vivado中运行Methodology检查时,相关信息会报告在XDCV-1和XDCV-2检查信息中,供设计者参考;


约束作用域

 一个特定的XDC文件中的约束可以选择仅作用于一个特定的模块,或设计中的特定单元,这种约束方式可称作块级约束;实现机制称作约束作用域机制;默认情况下,IP Catalog中导出的所有IP核都采用这种约束方式;该机制通过设置XDC文件的两个属性实现:

  • SCOPED_TO_REF:设置模块名称,约束仅应用于设定模块中的所有实例;
  • SCOPED_TO_CELLS:给出应用约束的层次单元名称列表;

 导出IP核时,输出的XDC文件会自动完成上述两个属性的设置。如果设计中需要为某个子模块进行单独约束,也可以通过手动设置上述两个属性实现;


约束效率

编写时序约束时,首要目标是让约束变得简单,仅为相关的网表对象设置约束,即为约束提供尽可能少的作用对象,以便精确并安全地覆盖到预期的时序路径;没有效率地约束会导致更长的运行时间、更大的内存占用率,最坏的情况是覆盖到比预期更多的路径从而与其它约束产生冲突,导致设计出现时序异常 ;

Vivado中Methodology检查的XDCB-1会报告涉及到超过1000个对象的时序约束,以防止出现时序异常情况。此外,还可以打开某一阶段设计后,使用如下命令查看相关报告:

  • report_exceptions -coverage:给出每个时序异常的逻辑路径范围,将该时序异常作用的对象数量,与起点到端点间以有效的方式覆盖的对象数目作比较;
  • report_exceptions -ignored:给出被其它时序约束覆盖掉的时序约束,如set_false_path会被set_clock_group覆盖而不起作用。应考虑修改约束或删掉不起作用的约束;
  • report_exceptions -ignored_objects:给出被忽略的起点与断点列表,如起点和断点之间不存在设定的路径,就会导致被忽略;
     

下面给出几种改善约束运行时间的方法:

1.优化管脚查询方式

使用get_pins代替get_cells会对运行时间有明显的影响。如果需要从设计的所有管脚中查找一个管脚列表,不要直接根据管脚名字查询,最好是先用get_cells定位管脚所在的单元,再从该单元中查找管脚,示例如下: 

get_pins –hier * -filter {NAME=~xx*/yy*} //不推荐的方式
get_pins –filter {REF_PIN_NAME=~yy*} –of [get_cells –hier xx*]  //最佳方式

2.不要使用all_registers查询

尽可能地将对all_registers的查询代替为对cells、pins的查询,因为使用all_registers会在大量对象中进行搜索,示例如下: 

set_multicycle_path –from [all_inputs] –to [all_registers –clock clk1]
set_multicycle_path –from [all_inputs] –to [get_clocks clk1]

这两条约束是等价的,但第二种方式的效率比第一种要高很多;

vivado基本使用流程(三、管脚约束) 一个vivado工程的创建、管脚、时钟约束,仿真,上板,信号抓取,全都包括了。 阅读详情

相关推荐

vivado约束方法

时钟约束是FPGA工程最基础也是最重要的约束。

weixin_48027403的博客 5330

vivado进行管脚约束(详细教程)

vivado进行管脚约束(详细教程)

weixin_62432906的博客 3万+

关于 vivado 的IO口约束

为什么要进行管脚约束。           刚做项目的时候,往往会忽略IO口的约束。每次稍微改动一些东西,就会发现 编译的结果不是自己想要的。 这样的现象一般来说,就是时序有问题。 一般 逻辑代码的约束还好做, IO口的约束有些麻烦。          解释一个名词。         为了改进系统同步接口中时钟频率受限的弊端,一种针对高速I/O的同步时序接口应运而生,在发送端将数据和时钟同步

视频拼接器 2万+

Vivado使用技巧:时钟的约束方法

Vivado使用技巧:时钟的约束方法

qq_33300585的博客 8717

vivado时序约束编写笔记

一:简述: 该文章将描述vivado时序约束编写简单流程并不涉及具体代码。 二:vivado时序约束文件编写 1:建立一个简单的vivado工程,编译运行通过。 2:时序约束文件在综合和布局布线都可以添加,因为我们小的工程综合的时候肯定没有任何问题,所以我们直接进入布局布线的环节。 如下图所示将Implement->open Implemented Design ->Edit Timing Constrants,随后打开时序约束入下图所示。 3:点击+来添加create clo.

Cowrie168的博客 4931

linux脚本运行vivado,Vivado使用技巧(一):使用Tcl在Shell中进行FPGA开发

概述通常我们使用的是Vivado IDE进行FPGA的开发,IDE提供了图形化的界面和自动化管理方案,我们只需要点击几个按钮就会得到结果。有时候还会用到另外一种开发方式:在Vivado Tcl Shell中使用Tcl命令的方式控制开发设计流程。使用Tcl的好处是每一个命令都有一个具体的操作,我们可以详细的控制设计过程中的每一步,设计更加灵活,也更有效率。通常的情况下都会根据需求事先编辑好一个完整的...

weixin_32966593的博客 2724

Vivado时序约束(转载)

Vivado时序约束 本文主要介绍如何在Vivado设计套件中进行时序约束,原文出自Xilinx中文社区。 Timing Constraints in Vivado -UCF to XDC Vivado软件相比于ISE的一大转变就是约束文件,ISE软件支持的是UCF(User Constraints File),而Vivado软件转换到了XDC(Xilinx Design Constrain...

wangyanchao151的专栏 1万+

Vivado进阶指南:物理约束实战与调试技巧

本文深入探讨Vivado物理约束的实战应用与调试技巧,涵盖网表约束、布局优化和布线策略。通过CLOCK_DEDICATED_ROUTE、MARK_DEBUG等核心约束的进阶用法,帮助工程师解决时序违例、信号完整性等常见问题,并分享Vivado 2023.1的最新改进与升级注意事项。

weixin_30374009的博客 643

13 FPGA时序约束之Vivado辅助工具

时序约束辅助工具   上面我们讲的都是xdc文件的方式进行时序约束,Vivado中还提供了两种图形界面的方式,帮我们进行时序约束:时序约束编辑器(Edit Timing Constraints )和时序约束向导(Constraints Wizard)。两者都可以在综合或实现后的Design中打开。 1. 时序约束编辑器   打开之后就可显示出我们之前做的所有约束,当然,还可以再添加、删除或修改时序...

zhanghaijun2013的博客 2661

(08)Vivado时钟约束

(08)Vivado时钟约束 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado时钟约束 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? 通俗来说:在输入信号到输出信号中,因为经过的传输路径、寄存器、门电路等器件的时间,这个时间就是时序。开发工具不知道我们路径上的要求,我们通过时序约束来告诉开发工具,根据要求,重新规划,从而实现我们的时序要求,达到时序的收敛。 2)什么是时序收敛? 一个好的FPGA设计一定是包含两个层

m0_46498597的博客 2591

(118)Vivado 时钟IP核主时钟约束技巧

(118)Vivado 时钟IP核主时钟约束技巧 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado 时钟IP核主时钟约束技巧 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? 通俗来说:在输入信号到输出信号中,因为经过的传输路径、寄存器、门电路等器件的时间,这个时间就是时序。开发工具不知道我们路径上的要求,我们通过时序约束来告诉开发工具,根据要求,重新规划,从而实现我们的时序要求,达到时序的收敛。 2)什么是时序收敛?

m0_46498597的博客 913

Vivado操作之时序约束介绍

介绍使用Vivado进行时序约束相关操作

zyp626的博客 9368

(77)Vivado设置伪路径约束

(77)Vivado设置伪路径约束 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado设置伪路径约束 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? 通俗来说:在输入信号到输出信号中,因为经过的传输路径、寄存器、门电路等器件的时间,这个时间就是时序。开发工具不知道我们路径上的要求,我们通过时序约束来告诉开发工具,根据要求,重新规划,从而实现我们的时序要求,达到时序的收敛。 2)什么是时序收敛? 一个好的FPGA设计一定

m0_46498597的博客 1117

FPGA Vivado XDC 约束文件编写方式语法笔记

参考手册: UG625:https://china.xilinx.com/support/documentation/sw_manuals/xilinx14_7/cgd.pdf 一、时钟约束 1.时钟clk0的周期为10ns占空比为50%相移为0其约束形式为: clk0: period = 10, waveform = {0 5} // {0, 5} 表示一个周期的波形中0ns - 5ns 为高。 2.时钟clk1的周期为8ns占空比为75%(6ns)相移为2ns其约束形式为: clk1: period

Blaze_Xu的博客 5万+

Kylin V10 ARM64离线安装ffmpeg实战指南

在国产化替代浪潮下,基于银河麒麟V10和ARM架构(如飞腾、鲲鹏)的内网服务器部署音视频处理服务成为常态。由于系统默认软件源缺乏aarch64包且无法连接外网,常规yum安装方式难以奏效。本文从离线安装的通用概念出发,剖析了在Kylin V10上安装ffmpeg的三大路线及其原理,重点介绍了源码编译法,包括依赖梳理、工具链准备、编译参数配置、常见错误排查等关键环节。同时,将这套依赖管理与离线部署方法论延伸至nginx、node.js、Python库及docker等场景,帮助读者建立一套可复用的国产化系统离线

weixin_33417488的博客 148

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2102

vivado 时序约束

时序约束

cckkppll的博客 2291

ZYNQ Linux 应用层 利用 AXI DMA 进行数据传输

ZYNQ Linux应用层 利用 AXI DMA 进行数据传输 软件版本: VIVADO2018.2 操作系统: Debian 9 硬件平台: ZYNQ-MZ7100FA 嵌入式操作系统:Debian(4.19.0-xilinx) AXI-DMA驱动:GitHub:bperez77/xilinx_axidma 一、搭建硬件环境 参见:《ZYNQ 修炼秘籍裸机篇 2019 版》第21章:CH21 利用 AXI DMA 进行批量数据环路测试 参考文章: ZYNQ跑系统 系列(四) AXI-DMA的linux下运

jin787730090的博客 1万+

Vivado使用(1)——综合的约束与策略

综合是将寄存器传输级(RTL)描述的设计转换成门级表示的过程。Xilinx® Vivado® 综合是以时序为驱动的,针对内存使用和性能进行了优化。本文主要介绍Vivado综合的约束与策略制定

apple_53311083的博客 5132

本地AI助手部署指南:DeepSeek Harness与Ollama集成实践

AI Agent作为当前人工智能领域的热门技术,通过模拟人类决策过程,能够自主规划、调用工具并执行复杂任务。其核心原理在于将大语言模型的推理能力与外部工具API相结合,形成可闭环的工作流。这种技术架构的价值在于显著提升了AI系统的实用性和自动化水平,使其从单纯的对话工具转变为能够解决实际问题的智能助手。在应用场景上,AI Agent广泛应用于代码生成、数据分析、自动化办公等领域。本文聚焦于如何通过DeepSeek Harness平台与Ollama本地模型的集成,实现隐私安全、离线可用的AI助手部署方案,特别

dengjuanshou7445的博客 476

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 317

FPGADesigner《Vivado使用技巧系列》目录与传送门

本系列主要讲述Vivado各个方面的使用方法。文章内容和素材(图片、代码)大量参考了Xilinx官方文档,包括ug888到ug9xx和ug10xx的大量文档。本系列博客内容主要包括翻译官方文档、重新组织排版、修正少量官方文档中的错误、结合博主自己的Vivado使用经验。 Vivado使用技巧系列 1.Vivado使用技巧(一):使用Tcl在Shell中进行FPGA开发: https://blog.youkuaiyun.com/fpg...

FPGADesigner的博客 1万+

FAGLB03余额显示异常排查与修复指南

本文针对SAP新总账中FAGLB03报表余额显示异常问题,提供了专业的排查与修复指南。文章深入剖析了数据不一致的核心原因,如FAGLFLEXT汇总表与凭证明细不同步、年度余额结转(FAGLGVTR)失败等,并详细介绍了使用FAGLF03进行精准诊断、通过SE38执行标准调整程序TFC_ADJUST_VZ进行修复的标准操作流程,帮助用户快速恢复数据一致性,确保财务报表的准确性。

weixin_29313423的博客 307
上一篇: Vivado使用技巧(10):实现前的准备工作
下一篇: Vivado使用技巧(14):使用时序约束向导
bleauchat
博客等级 码龄9年 3925粉丝 239原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值