FPGA时序约束和timequest timing analyzer

FPGA时序约束

时钟约束

#**************************************************************

# Create Clock

#**************************************************************

create_clock -period 8 -name "ENET0_RX_CLK" [get_ports ENET0_RX_CLK]

create_clock -period 8 -name "ENET1_RX_CLK" [get_ports ENET1_RX_CLK]

create_clock -period 8 -name "ENET2_RX_CLK" [get_ports ENET2_RX_CLK]

 

get_portsget_netsget_pins区别

 

PLL时钟约束

# Uncommenting one of the following derive_pll_clocks lines

# will instruct the TimeQuest Timing Analyzer to automatically

# create derived clocks for all PLL outputs for all PLLs in a

# Quartus design.

# If the PLL inputs are constrained elsewhere, uncomment the

# next line to automatically constrain all PLL output clocks.

derive_pll_clocks

# If the PLL inputs are not constrained elsewhere, uncomment

# the next line to automatically constrain all PLL input and

# output clocks.

# derive_pll_clocks -create_base_clocks

 

方法 1 – 自动创建基时钟和 PLL 输出时钟
这一方法使您能够自动地约束 PLL 的输入和输出时钟。ALTPLL megafunction 中指定的
所有 PLL 参数都用于约束 PLL 的输入和输出时钟。自动更新了 ALTPLL megafunction
的修改。当创建 PLL 的输入和输出时钟时,不必跟踪 PLL 参数的更改或指定正确的值。
为了自动约束所有输入和输出 , 要将 derive_pll_clocks 命令和 -create_base_clocks
选项一起使用。基于 PLL MegaWizard TM  Plug-In Manager 例化,TimeQuest
analyzer
确定正确的设置。


derive_pll_clocks -create_base_clocks

 

方法 2 – 手动创建基时钟和自动创建 PLL 输出时钟
通过这种方法 , 可以手动约束 PLL 的输入时钟并且使 TimeQuest analyzer 能够自动
约束 PLL 的输出时钟。除此之外 , ALTPLL megafunction 中指定的输入时钟频率相
反,您可以指定一个不同的输入时钟频率。通过使用 ALTPLL megafunction 中指定的
参数自动创建 PLL 输出时钟。您可以尝试不同的输入时钟频率 , 同时保持相同的 PLL
输出时钟参数。
1
确保指定的所有输入时钟频率与当前配置的 PLL 相兼容
可以将此方法与 derive_pll_clocks 命令一起使用并且手动创建 PLL 的输入时钟。


create_clock -period 10.000 -name clk [get_ports {clk}]
derive_pll_clocks

 

方法 3 – 手动创建基时钟和 PLL 输出时钟
通过这种方法 , 可以手动约束 PLL 的输入时钟和输出时钟。指定了所有的 PLL 参数并
且参数值可以不同于 ALTPLL megafunction 中指定的参数值。除此之外 , 您可以尝试
各种 PLL 输入和输出频率以及参数。
您可以将该方法与 create_clock create_generate_clock 命令的组合一起使用。


create_clock -period 10.000 -name clk [get_ports {clk}]
create_generated_clock \
-name PLL_C0 \
-source [get_pins {PLL|altpll_component|pll|inclk[0]}] \
[get_pins {PLL|altpll_component|pll|clk[0]}]
create_generated_clock \
-name PLL_C1 \
-multiply_by 2 \
-source [get_pins {PLL|altpll_component|pll|inclk[0]}] \
[get_pins {PLL|altpll_component|pll|clk[1]}]

 

 

时钟约束出错

 

Warning (332174): Ignored filter at SDC1.sdc(1): CPU_clk could not be matched with a port

Warning (332049): Ignored create_clock at SDC1.sdc(1): Argument <targets> is an empty collection

Warning (332060): Node: SYS_clk was determined to be a clock but was found without an associated clock assignment.

没有对时钟进行约束设置

Node: <Node name> was determined to be a clock but was found without an associated clock assignment. (ID: 332060)

 

CAUSE: This can be caused in two ways: 1) A clock assignment was determined to be invalid, so its source objects no longer have a clock associated with them. 2) When analyzing the netlist, the node was found feeding a clock port with no other clocks feeding it.

ACTION: Use the derive_clocks command to automatically find all clock nodes in the design. Also, for any clocks that were ignored, review the warning or error message associated with the command to prevent the clock from being ignored.

 

Timequest timing analyzer使用方法

 

步骤1:执行初始编译

在应用时序约束设计之前,通过表1创建一个初始数据库。初始数据库从设计的post-map结过中生成。

 

表 1-1. 执行初始编译 (1)

Quartus II软件GUI

命令行

在Processing菜单上,指向Start,点击Start Analysis & Synthesis。

输入: quartus_map filtrefr

表 1-1注释:

  1. quartus_map用于创建一个post-map数据库。
  2. Analysis & Synthesis阶段生成post-map数据库。
  3. 您也可以为初始数据库创建一个post-fit网表。不过,创建一个post-map网表耗时较少,并且用于本教程的例子已经足够了。

图 1    Analysis & Synthesis

步骤2:运行TimeQuest Timing Analyzer

通过表 2-1中的程序,运行TimeQuest Timing Analyzer来创建和验证所有时序约束和例外。此命令将打开TimeQuest shell。

表 2-1. 运行TimeQuest Timing Analyzer

Quartus II软件GUI

命令行

在Tools菜单中,单击TimeQuest Timing Analyzer。

输入:

quartus_sta –sr

project_open fir_filter -revision filtrefr

1 当您直接从Quartus II软件中运行TimeQuest Timing Analyzer时,当前工程将会自动打开。如果使用GUI,那么当出现下面的消息时,请选择No:

"No SDC files were found in the Quartus Settings File and filtref.sdc doesn't exist. Would you like to generate an SDC file from the Quartus Settings File?"

图 2TimeQuest Timing Analyzer

步骤3:创建一个Post-map时序网表

在指定时序要求之前,请创建一个时序网表。您可以从post-map或post-fit数据库中创建一个时序网表。在这一步骤中,通过表 3-1中的程序,从"步骤1:执行初始编译"中创建的post-map数据库中创建一个时序网表。

表 3-1. 创建一个Post-Map时序网表

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Netlist菜单上,点击Create Timing Netlist。 出现 Create Timing Netlist对话框。

2.在Input netlist中,选择Post-Map。

3.点击OK。

输入:create_timing_netlist –post_map

1 您不能在Tasks面板中使用Create Timing Netlist命令来创建一个post-map时序网表。默认情况下,Create Timing Netlist需要一个post-fit数据库。

图 3Create Timing Netlist

图 4Input netlist

图 5waiting

 

图 6创建完毕

步骤4:指定时序要求

在设计中定义时钟。每个时钟的属性列表请参考表 4-1

表 4-1.设计中的时钟

时钟端口名称

要求

Cpsl_Clk25M_i

50/50占空比的25 MHz

在设计中创建时钟并通过表 4-2中的程序分配正确的时钟端口。要了解关于TimeQuest Timing Analyzer所支持的约束的详细信息,请参考Quartus II 手册 第3卷中的TimeQuest Timing Analyzer章节。

表 4-2. 创建时钟并分配时钟端口

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Constraints菜单中,点击 Create Clock。出现Create Clock对话框。对25 MHz时钟指定参数。单击RUN。

输入:

#create the 25 MHz (20 ns) clock create_clock –period 20 [get_ports Cpsl_Clk25M_i]

2. 在Constraints菜单中,点击Drive PLL clocks。出现Drive PLL clocks对话框,前面指定了PLL基时钟,什么都不选直接单击RUN即可。

 

1 默认情况下,如果未使用-waveform选项,那么create_clock命令假设50/50的占空比。

f 要了解关于创建不同占空比时钟的详细信息,请参考Quartus II手册 第3卷中的TimeQuest Timing Analyzer章节。

完成表 4-2中显示的程序后,时钟定义完成。

图 7Create clock

图 8设置参数

图 9指定时钟

图 10 Create clock设置完毕

图 11Drive PLL clocks

步骤5:更新时序网表(timing Netlist)

在您创建时序约束或例外后,通过表 5-1中的程序,对时序网表进行更新,将所有时序要求应用到时序网表(新的clkclkx2时钟约束)。

1 只要应用了新的时序约束,就必须对时序网表进行更新。

表 5-1. 更新时序网表(Timing Netlist)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Update Timing Netlist命令。

输入:update_timing_netlist

图 12Update Timing Netlist

步骤6:保存Synopsys Design Constraints(SDC)文件

在为设计指定时钟约束并更新时序网表后,您可以通过表 6-1中的程序来选择创建SDC文件。通过TimeQuest Timing Analyzer GUI或者在控制台(console)中指定的约束不会自动保存。

1 如果您在设计流程中无意覆盖任何约束,那么请使用这个初始SDC文件来恢复所有约束。初始SDC文件可作为包含设计的原始约束和例外的"golden" SDC文件。

表 6-1. 保存SDC文件

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,双击Write SDC File命令。出现Write SDC File对话框。

2.在File Name栏输入名称。

输入:write_sdc -name.sdc r

新的.sdc文件包含"步骤4:指定时序要求"中定义的时钟约束。Write SDC File命令可以覆盖任何现有的SDC文件。当这种情况出现时,新的SDC文件没有保持顺序或注释。因此,Altera建议单独保存利用文本编辑器可以手动编辑的一个golden SDC文件。这使您能够根据自身的规范输入注释并组织文件。

步骤7:对初始时时序网表生成时序报告

通过表 7-1中的程序定义的时钟,在指定时序约束和更新时序网表后,生成时序报告,这验证了时钟被正确地定义并应用到正确的节点。TimeQuest Timing Analyzer提供易于使用的报告生成命令,使您能够验证设计中的所有的时序要求。

表 7-1. 保存SDC命令

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report SDC命令。

输入:report_sdc

图 13生成SDC约束报告(SDC Assignments Report)

SDC Assignments报告了在指定设计中包含的所有时序约束和例外。生成两个报告:一个用于时钟和一个用于时钟组。

可以用表 7-2中的程序生成一个报告,来总结设计中所有的时钟。

表 7-2. 生成报告时钟报告(Report Clocks Report)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report Clocks命令。

输入:report_clocks

图 14时钟报告

 

通过表 7-3中的程序,使用Report Clock Transfers命令生成一个报告来验证所有的时钟到时钟传输都是有效的。这种报告包含设计中所有的时钟到时钟传输。

表 7-3. 生成报告时钟传输(Report Clock Transfers)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report Clock Transfers命令。

输入:report_clock_transfers

图 15时钟传输报告(Clock Transfers Report)

 

本环节只是告诉这个部分伪路径可以作为例外不进行分析。实际的时序要在做设计时保证其正确。So,不再详细描述,以后可能会补充。

 

Clock Transfers报告表明在clk(源时钟)和clkx2(目的时钟)之间存在跨时钟域路径。共有16条路径,其中clk为源节点提供时钟,clkx2为目的节点提供时钟。

在fir_filter设计中,不必分析clkclkx2的时钟传输,因为它们是忽略路径。通过表 7-4中的程序声明clkclkx2的路径为伪路径。当完成该程序后,TimeQuest Timing Analyzer表明Clock Transfers报告是过时的。

表 7-4. 声明伪路径

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Clock Transfers报告中,在From Clock列选择clk。

2.右击并选择Set False Paths Between Clock Domains。这个命令表明将所有由clk驱动的源寄存器到由clkx2驱动的目的寄存器之间的路径设为伪路径。

输入:

set_false_path -from [get_clocks clk] \

-to [get_clocks clkx2] r

1 另外,也可以使用set_clock_groups命令来声明两个时钟域之间的路径为伪路径。例如,set_clock_groups -asynchronous -group [get_clocks clk] -group

[get_clocks clkx2]。该命令表明clkclkx2以及clkx2clk的所有路径为伪路径。此方法是优选的。

由于您添加了一个新的时序约束,通过表 2-14中的程序更新时序网表(timing netlist)。

表 2-14. 更新Timing Netlist

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Update Timing Netlist命令。

输入:update_timing_netlistr

在GUI中输入set_false_path后,所有生成的报告面板上都标有"Out of Date",这表明报告面板不包含反映TimeQuest Timing Analyzer中当前状态的约束或者例外的结果。要更新报告面板,必须重新生成所有的报告。

在命令行,重新输入命令。在GUI中,右击报告面板列表中任何过时(out-of-date) 的报告,并选择Regenerate或Regenerate all。

更新时序网表后,通过表 2-15中的程序验证时钟到时钟传输已经被声明为伪路径。

表 2-15. 验证使用Report SDC命令

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report SDC。

输入:report_sdcr

图 2-4显示了新的SDC Assignments报告。

图 2-4中显示的报告表明时钟约束和伪路径是正确的。

使用Report Clocks和Report Clock Transfers命令来验证这两个时钟已经从分析中移除了。图 2-5显示了Clock Transfers报告。

步骤8:保存约束到SDC文件

在指定设计中所有的时钟约束和伪路径后,通过表 8-1中的程序将时序约束和例外保存到SDC文件。

表 8-1. 保存约束到SDC文件

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,双击Write SDC File。出现Write SDC File对话框。

2.在File name栏,输入-name.sdc.

输入:write_sdc -name.sdc

1 这一过程覆盖之前所创建的filtref.sdc文件。如果通过Write SDC File命令覆盖SDC,那么在新的SDC文件中移除了定制的格式和注释。

.sdc 文件包含时钟约束伪路径例外

步骤9:执行Timing-Driven编译

保存约束到SDC文件后,在设计上运行一个全编译以优化布线,从而符合约束。不过,在开始全编译之前,通过表 9-1中的程序将SDC添加到工程中。

表 9-1. 添加SDC文件到工程中

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Project菜单中,点击Add/Remove Files In Project。出现Add/Remove Files In Project对话框。

2.通过浏览来选择.sdc。

3.点击OK。

输入:

set_global_assignment -name SDC_FILE \ -name.sdc

将SDC添加到工程后,通过表 9-2中的程序,在设计上运行一个全编译。

表 9-2. 运行一个全编译

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Processing菜单中,点击Start Compilation。

输入:quartus_sh --flow compile -name

完成编译后,TimeQuest Timing Analyzer在Compilation Report中生成时钟建立和时钟保持的检查总结报告。

步骤10:在TimeQuest Timing Analyzer中验证时序

要获得指定路径中详细的时序分析数据,请查看TimeQuest Timing Analyzer中的时序分析结果。

 

1 完全执行布线布局功能(place-and-route)后,运行"步骤2:运行TimeQuest Timing Analyzer"中所介绍的TimeQuest Timing Analyzer。生成一个post-fit时序网表,通过表 10-1中的程序,读取SDC文件并更新时序网表来生成关于最新编译的报告。

 

表 10-1. 生成关于Latest Compilation的报告

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击所需报告的命令。例如:Report All Summaries。

输入:

create_timing_netlist read_sdc filref.sdc update_timing_netlist report_clocks

create_timing_summary -setup create_timing_summary -hold create_timing_summary -recovery create_timing_summary -removal report_min_pulse_width -nworst 10

1 当双击其中一个报告命令时,Create Timing Netlist、Read SDC和Update Timing Netlist命令依次在Tasks面板中执行,自动生成时序网表。

时钟建立检查确保每个寄存器至寄存器的传输不违反SDC指定的时序约束。通过表 10-2中的程序,生成一个时钟建立总结,对设计中的所有时钟进行检查,来验证没有出现违规。

表 10-2. 生成时钟设置总结检查(Clock Setup Summary Check)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击 Report Setup Summary。

输入:create_timing_summary –setup

 

Summary (Setup)报告

1 clkx2时钟没有出现在Summary (Setup)报告中,这是因为clkclkx2之间所有的时钟路径已经声明是伪路径。此外,fir_filter设计不包含任何寄存器到寄存器的路径,其中目的寄存器路径由clkx2来驱动。

Summary (Setup)报告中的Slack列表明clk能满足约束,并有11.588 ns的余量。End Point TNS列是指定时钟域中所有的总负裕量(TNS)的总和。使用这个值来测量指定时钟域中失败路径的总数。

 

生成Summary (Setup)报告后,通过表 2-21中的程序,在设计中生成一个时钟保持检查总结。

表 10-3. 生成Summary (Hold) Report

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report Hold Summary。

输入:create_timing_summary –hold r

图 16Summary (Hold)报告

Summary (Hold)报告表明clk时钟节点符合时序约束,并有0.661 ns的余量。在执行全编译之前,通过表 10-4中的程序指定所有的时序约束和例外。这样可以确保 Fitter优化设计中的关键路径。

您可以使用Report Unconstrained Paths命令来验证已经约束fir_filter设计中的所有路径。

表 10-4. 指定时序约束和例外

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,双击Report Unconstrained Paths。

输入:report_ucp r

图 17Unconstrained Paths总结报告

Unconstrained Paths总结报告表明有大量的未约束路径,并详细介绍了这些路径的类型。

要充分约束此设计,利用由TimeQuest Timing Analyzer所提供的整套SDC约束。要充分约束fir_filter设计,约束所有的输入和输出端口。使用Set Input Delay和Set Output Delay对话框,或set_input_delayset_output_delay约束来指定输入和输出延迟值。

由于附加约束应用于设计,通过文本编辑器(例如:inout_delay.sdc)创建仅包含输入和输出约束的额外SDC。添加表 10-5所示的输入和输出延迟分配到"步骤8:保存约束到SDC文件"创建的新SDC中。

10-5. 输入和输出延迟分配

The TimeQuest Timing Analyzer GUI

The TimeQuest Timing Analyzer Console

1.Constraints菜单中,点击Set Input Delay。出现Set Input Delay对话框。

2.输入以下内容:

Clock name: clk

Delay value: 2

Targets: [get_ports {d[0] d[1] d[2] d[3] \

d[4] d[5] d[6] d[7] newt reset}]

3.Constraints菜单中,点击Set Output Delay。出现Set Output Delay对话框。

4.输入以下内容:

Clock name: clk

Delay value: 1.5

Targets: [get_ports {yn_out[0] yn_out[1] \ yn_out[2] yn_out[3] yn_out[4] yn_out[5] \ yn_out[6] yn_out[7] yvalid follow}]

要约束输入端口,输入:

set_input_delay -clock clk 2 \

[get_ports {d* newt reset}] r

要约束输出端口,输入:

set_output_delay -clock clk 1.5 \ [get_ports {yn_out* yvalid follow}] r

在读取包含输入和输出延迟约束的SDC后,所有设计中的端口应该都加上了约束。

1 记住读取新的约束后更新时序网表。要了解更多信息,请参考"步骤5:更新时序网表(Timing Netlist)"。要验证所有设计中的端口都已经加上了约束,重新生成Unconstrained Paths Summary 报告。

图 18重新生成Unconstrained Paths Summary报告

结论

通过表 10-6中的程序,对设计的时钟或节点生成特定的时序检查报告。表 10-6中的程序生成一个报告,其中clk驱动目的寄存器,并且目的寄存器为 acc:inst3|result,报告10条最差路径。

10-6. 生成Report Timing报告

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,双击Report Timing。出现Report Timing 对话框。

2.输入以下内容:

To Clock: clk

To: acc:inst3|result*

Report number of paths: 10

3.剩下其它的栏使用默认的设置。

输入:

report_timing -to_clock clk -to / acc:inst3|result* -setup -npaths 10

图 2-10显示了Report Timing报告。

使用Tasks面板中的Report Top Failing Paths命令来生成一个报告,该报告详细介绍了设计中的最差的失败路径。

 

根据Quartus_II_TimeQuest说明书_CH.pdf修改而成,因原教程使用的工程quartus中lisence不支持器件。

 

 

结论

您创建新的约束或例外,基于新的约束或例外重新运行Quartus II Fitter来优化设计。设计上的多个迭代对于完成所需的结果是必要的。

转载于:https://www.cnblogs.com/pejoicen/p/4194380.html

### 回答1: 这个错误信息出现在数字电路设计过程中,它意味着设计中有9个逻辑端口没有连接到其他器件或信号。在数字电路设计中,逻辑端口通常是在设计时定义并与其他器件或信号连接。如果有未连接的逻辑端口,可能会导致设计无法正常工作或出现其他问题。 要解决这个问题,设计师需要查看这9个逻辑端口的定义,并检查其是否需要连接其他器件或信号。如果需要连接,则需要添加相应的连接。如果这些逻辑端口没有用途,也可以将它们从设计中删除。 在数字电路设计中,确保所有逻辑端口都连接到正确的器件或信号是很重要的。这可以确保设计正常工作并符合预期。因此,设计师需要仔细查看错误信息并解决任何未连接的逻辑端口。 ### 回答2: 该错误提示意味着DRC检查器在检查设计时发现了一个未约束的逻辑端口。这意味着该逻辑端口未在设计中明确定义其电器特性和约束条件,因此可能会导致与其他电路中的逻辑端口或输入输出端口冲突,从而导致电路故障或不可预测的行为。 未约束的逻辑端口可能会引起许多问题,包括信号速度,功耗,电磁干扰和抖动等方面的问题。因此,设计者必须考虑在设计中完全约束每个逻辑端口。 要解决此问题,设计者可以通过以下步骤来约束逻辑端口: 1.明确定义端口的电气特性,如逻辑电平(高电平和低电平)、输出电流和输入电阻等。以及偏置电流,最大电压等等。 2.定义逻辑端口的时序约束,如最小输入保持时间,最小输入上升和下降时间,最大输出上升和下降时间等。 3.约束端口的负载,以确保逻辑门的负载特性与端口的负载相匹配。同时,您还需要考虑逻辑门的电容,以确保总线电容不会超过门的电容。 4.保证各个端口之间没有干扰信号,并保证其信号具有充分的抗噪声和抗干扰特性。 综上所述,设计者必须明确每个逻辑端口的电气特性和相关约束条件,以避免未约束的逻辑端口导致电路故障或不可预测的行为。 ### 回答3: 题目中提到的"drc ucio-1",是设计规则检查(DRC)中的一种规则。这个规则检查的是逻辑端口的连线是否正确。 在数字电路设计中,逻辑端口是指连接逻辑电路的输入和输出端口,其作用是传递输入信号,输出处理后的信号。此规则的作用是检查这些逻辑端口是否连接正确。对于这个规则而言,其中的"no us"指的是"没有未使用信号"的缩写,即如果逻辑端口上没有任何信号进行传输,则该规则会提示错误。 题目中的返回信息是"unconstrained logical port: 9 out of 9 logical ports have no us",意思是:一共有9个逻辑端口,其中所有的端口都没有未使用的信号。在数字电路设计中,如果逻辑端口没有正确连接,就会导致电路功能不正常,无法达到设计要求。这种情况下,设计师需要检查逻辑端口的连接是否正确,发现问题及时修改。 对于该规则的具体实现,设计师通常使用电路设计软件的DRC功能来检查电路是否符合设计要求。在输入设计文件之后,设计软件会对电路进行DRC检查,并输出检查结果。对于违反规则的部分,设计师需要进行修改,直到符合设计要求。因此,合理使用DRC功能,可以大大提高设计效率和设计质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值