关于SDC时钟约束的事

1.quartus的SDC约束就跟xilinx的ucf约束文件一样

2.主要用途一般是:
一从输入端口到寄存器:
二寄存器到寄存器 通过设定时钟频率方式进行约束
三寄存器到输出
四创建时钟约束命令
五时钟延迟约束
六时钟抖动约束
七输入和输出延迟约束
八不关心数据传递路径和多拍路径

3.点击timequest,再依次点击左边tasks里面的create timing netlist,read sdc file, update timing netlist.
然后点击上面的菜单constraints-create clock
clock name :随便添
period: 时钟周期 (25MHz则对应40ns)
rising和falling是用来改变占空比的,一般点空比为50%,默认值,所以不填。
targets: 选右边的browns,collection 选get_pins中25MHz对应的模块的clk端口。可以多选。
然后OK,再回到create clock里选run。
再点击timequest里tasks里的write sdc file...
则写完sdc文件了

4.约束命令

Timequest共包括13条约束命令(从timequest工具constrants下拉菜单可选的约束命令,实际不止这么多),分别是:

           Creat clock

   Creat generated clock

   Set clock lantency

   Set clock uncertainty

   Set clock groups

   Remove clocks

   Set input delay

   Set output delay

   Set false path

   Set multicycle path

   Set muximum delay

   Set minimum delay

   Set muximum skew

5.timequest工具的简单使用

3.1 creat_clock约束命令

  相关代码:

图27

  第一步,在quartus ii软件tools下来菜单中找到timequest timing analyze选项并打开,出现如图27的会话框:

 

图 28

  报告窗口:通过这个窗口,我们可以知道timequest都执行了哪些任务。

  任务窗口:通过这个窗口,让timequest执行你要求的任务,比如点击report clocks,timequest就会在信息显示窗口你都约束了哪些时钟。

  控制台:可以输入tcl命令让timequest执行相应任务。

  信息显示窗口:timequest把当前任务的结果信息显示在该窗口。

  第二步,点击任务栏中的create_timing_netlist 或者在点击主菜单的netlist下拉菜单的create_timing_netlist选项,选择后面这种方式会出现如图28的会话框:

 

图29

  首先看最左边的input netlist有post-fit和post-map之分,post-fit更接近物理结果(有优化),post-map更接近原型(没有优化)。右边的delay model有slow-corner和fast-corner之分,slow指timequest分析很糟糕的情况,比如FPGA工作在环境很差的情况下的模型,fast指timequest分析FPGA工作在正常的环境下,更接近实际的一种情况。Zero IC delays会无视一些网标基本单位的延迟。

  通常情况下,我们会选择post-fit和slow-corner组合,如果在这样的情况下,设计都满足时序要求,那么我们的设计会更可靠。其实任务窗口中的create_timing_netlist默认就是这种组合,所以我们点击这个选项就可以了。

  第三步,建立好网表以后,我们来创建第一条约束命令。

 

图30

这里对输入时钟clk进行了约束,时钟周期40ns,时钟名clk,点击run后,我们找到主菜单的constrants下拉菜单的 write SDC file选项并点击生成名为t1.out.sdc的SDC文件。

  第四步,添加SDC文件,点击quartus ii里面主菜单assignments下拉菜单的setting选项弹出如图29的会话框,在会话框里找到timequest timing analyze选项,把SDC文件添加进来。

 

图31

  第五步,双击timequest timing analyzer任务窗口中的report clocks,然后在信息显示框里面可以看到我们刚刚约束的时钟,如图31:

 

图32

  生成SDC文件的方式有几种,我用的是自己比较喜欢的一种方式。

  在第二章说过 creat_clock还可以约束虚拟时钟,这种时钟不是FPGA内部使用的,它们是外部IC的时钟,在对I/O约束时要用到这样的时钟。由于之前已经生成了SDC文件,后面在添加约束命令的时候通过quartus ii软件主菜单edit选项下拉菜单的insert cronstrain选项中添加,这样添加的话命令就会直接添加进SDC文件里面,每次添加命令后,如果想要在timequest timing analyzer进行分析的话,必须从新加载SDC文件才行。如图33所示,依次双击Reset Design、Read SDC File、Update Timing Netlist即可。

 

图33

  通过creat_clock创建虚拟时钟,我这里创建了两个虚拟时序:ext1_clk和ext2_clk。看SDC文件和timequest timing analyzer信息显示框有什么变化,如图34:

 

图34

看type那列,ext1_clk和ext2_clk的类型是virtual。

 

 

3.2 creat_generated_clock

  通过代码可以知道,这里的时钟有第二章讲creat_generated_clock约束命令作用时的1,2,4条,sys_clk对应第1条作用,ext_div2对应第4条作用,ext_clk1和ext_clk2对应第2条作用。然后我们通过creat_generated_clock会话框对这3种进行约束,如图35:

SDC文件相应的约束命令

 

图35

  如图36,在任务窗口双击report clocks后观察信息显示窗口的时钟情况,这里能看到每一个被约束的时钟,它们各自的周期、频率、类型,源时钟等。

 

图36

  如图37,在任务窗口双击report timing后观察信息显示窗口的时钟情况,这里可以看到timequest都分析了哪些路径,可以发现,输入Din到rData1和rData2到输出Dout之间的路径没有分析,那是因为timequest在分析的时候都是分析两个寄存器间的路径,而不是分析寄存器到管脚的路径,FPGA管脚都是与外部IC打交道,所以这里需要添加set input delay和set output delay约束,timequest才能分析这些路径。

 

图37

现在来看看这几条命令都分别约束的哪几个时钟:

  约束pll,对应sys_clk: derive_pll_clocks  

  约束ext_div2 : create_generated_clock -name ext_div2 -source [get_pins {pll0_m1|altpll_component|pll|clk[0]}] -divide_by 2 [get_keepers {ext_div2}]  

  约束ext_clk1和ext_clk2: create_generated_clock -name ext_clk1 -source [get_keepers {ext_div2}] [get_ports {ext_clk1}]

  create_generated_clock -name ext_clk2 -source [get_keepers {ext_div2}] [get_keepers {ext_div2}]

3.3小结

  这章通过两个约束命令讲了如何使用timequest分析工具,由于在第二章里面对每条约束命令的含义都讲过了,我想通过对这两个约束命令的学习,也能添加其它约束命令和分析了,想要对工具有更多的了解,建议阅读TimeQuest_User_Guide.pdf,这上面讲得很清楚。

<think>好的,我现在要回答用户关于SDC时钟约束的set_clock_uncertainty和clock edges的问题。首先,我需要确认自己对这些概念的理解是否正确,然后结合提供的参考资料进行整理。 首先,用户提到了两个主要部分:set_clock_uncertainty和clock edges的概念及应用场景。根据引用[3],时钟定义是SDC的基础,所以理解这些命令很关键。 关于clock edges,我记得在定义时钟波形时,使用create_clock命令的-waveform参数需要指定边沿时间。例如,引用[2]中的create_clock命令格式提到了-waveform edge_list,这里的edge_list应该是指上升沿和下降沿的时间点。比如,一个周期为10ns的时钟,波形可能从0ns开始上升,5ns下降,再10ns上升,因此边沿列表是0 5。这说明clock edges是用来描述时钟信号翻转的时间点,这样工具才能正确计算时序路径。 接下来是set_clock_uncertainty。根据引用[1],set_clock_transition是用来设置时钟的过渡时间,而uncertainty应该和时钟的抖动、偏移有关。set_clock_uncertainty的作用是给时钟添加一个时间裕量,考虑实际中的不确定因素。比如,时钟到达不同寄存器的时间可能存在偏差(时钟偏斜),或者时钟本身有抖动,这些都需要在时序分析时预留一定的余量。应用场景可能包括建立时间和保持时间的检查,确保在最坏情况下电路仍能正常工作。 需要验证这些理解是否正确。引用[2]中create_clock的-waveform参数确实需要两个或更多的边沿时间,所以clock edges用于定义波形。而set_clock_uncertainty的用法可能类似于在时序分析中设置一个保守的余量,防止因实际物理因素导致时序违规。 然后,考虑用户的问题,需要分别解释这两个概念的定义、参数以及应用场景。例如,clock edges在定义时钟时的具体用法,如何影响时序分析;set_clock_uncertainty如何影响建立和保持时间的计算,可能用在预布局阶段或不同分析模式(如min/max)下。 最后,生成相关的问题,比如时钟约束的其他命令、波形定义对分析的影响,以及uncertainty和transition的区别等。</think>### SDC时钟约束中`set_clock_uncertainty`与`clock edges`详解 #### 1. **`clock edges`的定义与用法** **概念** `clock edges`(时钟边沿)用于定义时钟信号的波形,通过指定上升沿和下降沿的时间点来描述时钟周期行为。在SDC中,通常通过`create_clock`命令的`-waveform`参数实现[^2]。 **语法与示例** ```tcl create_clock -name clk -period 10 -waveform {0 5} [get_ports clk] ``` - `-waveform`参数接收一个包含偶数个时间点的列表,格式为`{上升沿时间 下降沿时间 上升沿时间 ...}`。 - 上述示例表示:时钟周期为10ns,第一个上升沿在0ns,下降沿在5ns,下一个上升沿在10ns(即下一周期起点)。 **应用场景** - **非对称时钟波形**:若时钟高电平占3ns,低电平占7ns,则波形定义为`-waveform {0 3 10}`。 - **多周期时钟定义**:复杂时钟(如分频时钟)需通过多个边沿时间点描述其行为。 #### 2. **`set_clock_uncertainty`的含义与应用** **概念** `set_clock_uncertainty`用于设置时钟信号的时间不确定性,包括时钟抖动(jitter)、时钟偏斜(skew)等无法精确预测的时序偏差。它为时序分析提供安全裕量,确保设计在物理实现中可靠。 **语法与参数** ```tcl set_clock_uncertainty -setup 0.5 [get_clocks clk] set_clock_uncertainty -hold 0.3 [get_clocks clk] ``` - `-setup`:影响建立时间检查的裕量。 - `-hold`:影响保持时间检查的裕量。 - 若不指定`-setup/-hold`,默认同时作用于两者。 **应用场景** - **预布局阶段**:在早期设计阶段,时钟树尚未生成,需预留较大裕量(如1ns)补偿未知的时钟延迟差异[^3]。 - **多模式分析**:在`-min`(最佳情况)和`-max`(最差情况)分析中设置不同不确定性值,覆盖工艺、电压、温度(PVT)变化的影响。 #### 3. **命令对比与关联** - **`set_clock_transition` vs `set_clock_uncertainty`** - `set_clock_transition`:定义时钟信号边沿的**过渡时间**(如上升/下降时间),影响单元延迟计算[^1]。 - `set_clock_uncertainty`:定义时钟信号的**时间容差**,直接影响建立/保持时间检查的严格性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值