set input delay
- 格式:doc
- 大小:512.00 KB
- 文档页数:11
Design Compiler 一般问题解答1.1 什么是DC?DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design description 和design constraints自动综合出一个优化了的门级电路。
它可以接受多种输入格式,如HDL、Schematics、Netlist等,并能生成多种性能report,在reducing design time的同时提高了设计的性能。
1.2 DC能接受多少种输入格式?支持.db、.v、.vhd、.edif、.vgh、.lib等,.db一般是厂商的单元库;.v是veilog的后缀;.vhd 是VHDL的后缀;.edif 和.vhd是两种形式的netlist。
1.3 DC提供多少种输出格式?提供.db、.v、.vhd、edif、.vgh等,并可以输出sdc、sdf等相关格式文件。
1.4 DC的主要功能或者主要作用是什么?DC是把HDL描述的电路综合为跟工艺相关的门级电路。
并且根据用户的设计要求,在timing、area、power上取得最佳的效果。
在floorplanning和placement和插入时钟树后返回DC进行时序验证。
1.5 如何寻找帮助?帮助可以用3种求助方式:1. 使用SOLD,到文档中寻求答案2. 在命令行中用man+ DC命令(我最喜欢这种)3. 在命令行中用info+ DC命令1.6 如何找到SOLD文档?SOLD文档可以在teminal中输入sold&执行。
$> sold&或者用命令which dc_shell找到dc的安装目录。
找到online目录。
1.7 如何配置DC?综合设置提供必要的参数给DC,使工具能够知道进行综合时所需要的必要的信息,如:工艺库,目标库,标志库等等。
要在.synopsys_dc.setup上设置好这些参数。
而.synopsys_dc.setup要在三个目录下有说明,一个是synopsys的安装目录,一个是用户文件夹,最后一个是工程目录。
vivado逻辑级数命令使用Vivado进行逻辑综合是数字电路设计中的重要步骤,它可以将高级语言描述的电路转化为逻辑级的电路,为后续的布局布线提供基础。
在Vivado中,有许多常用的逻辑综合命令,本文将介绍其中一些常见的命令及其使用方法。
一、create_clock命令create_clock命令用于定义时钟信号,并将其用于时序分析和约束。
它的语法格式为:create_clock -period <时钟周期> <时钟信号>。
其中,时钟周期是指时钟信号的周期,时钟信号是指需要定义的时钟信号。
例如,create_clock -period 10 [get_pins CLK]表示定义一个周期为10ns的时钟信号CLK。
二、create_generated_clock命令create_generated_clock命令用于定义由时钟衍生而来的其他时钟信号,并将其用于时序分析和约束。
它的语法格式为:create_generated_clock -name <时钟名称> -source <源时钟信号> -divide_by <分频系数> [get_pins <源时钟引脚>]。
其中,时钟名称是指需要定义的衍生时钟的名称,源时钟信号是指衍生时钟的源时钟信号,分频系数是指衍生时钟相对于源时钟的分频比例。
例如,create_generated_clock -name CLK_DIV2 -source CLK -divide_by 2 [get_pins CLK_DIV2]表示定义一个分频系数为2的衍生时钟CLK_DIV2。
三、set_input_delay和set_output_delay命令set_input_delay和set_output_delay命令用于设置输入和输出的最大延迟。
它们的语法格式分别为:set_input_delay <延迟时间> -clock <时钟信号> [get_ports <输入端口>]和set_output_delay <延迟时间> -clock <时钟信号> [get_ports <输出端口>]。
1.1 什么是DC?DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design description 和design constraints自动综合出一个优化了的门级电路。
它可以接受多种输入格式,如HDL、Schematics、Netlist等,并能生成多种性能report,在reducing design time的同时提高了设计的性能。
1.2 DC能接受多少种输入格式?支持 .db、.v、.vhd、.edif、.vgh、.lib等,.db一般是厂商的单元库;.v是veilog的后缀;.vhd是VHDL的后缀;.edif 和 .vhd是两种形式的netlist。
1.3 DC提供多少种输出格式?提供 .db、.v、.vhd、edif、.vgh等,并可以输出sdc、sdf等相关格式文件。
1.4 DC的主要功能或者主要作用是什么?DC是把HDL描述的电路综合为跟工艺相关的门级电路。
并且根据用户的设计要求,在timing、area、power上取得最佳的效果。
在floorplanning和placement 和插入时钟树后返回DC进行时序验证。
1.5 如何寻找帮助?帮助可以用3种求助方式:1. 使用SOLD,到文档中寻求答案2. 在命令行中用man+ DC命令(我最喜欢这种)3. 在命令行中用info+ DC命令1.6 如何找到SOLD文档?SOLD文档可以在teminal中输入sold&执行。
$> sold&或者用命令which dc_shell找到dc的安装目录。
找到online目录。
1.7 如何配置DC?综合设置提供必要的参数给DC,使工具能够知道进行综合时所需要的必要的信息,如:工艺库,目标库,标志库等等。
要在.synopsys_dc.setup上设置好这些参数。
而.synopsys_dc.setup要在三个目录下有说明,一个是synopsys的安装目录,一个是用户文件夹,最后一个是工程目录。
常用时序分析SDC命令参考时序分析(Static Timing Analysis,STA)是对数字电路中的信号到达时间进行分析和优化的一种方法。
时序分析的结果可以用于确定电路的最大工作频率、检测设计中的潜在故障、优化电路性能等。
SDC(Synopsys Design Constraints)是一种用于描述和控制时序分析过程的命令语言。
下面是一些常用的SDC命令参考。
1. create_clock:创建时钟对象语法:create_clock [-period \<period>] [-waveform\<waveform>] [-name \<name>]示例:create_clock -name clk -period 10 [get_pins clk]解释:创建名为clk的时钟,周期为10ns。
get_pins clk表示获取所有与时钟相关的针脚。
2. create_generated_clock:创建由时钟源产生的时钟对象语法:create_generated_clock [-source \<source_clock>] [-name \<name>] \<generated_clock>示例:create_generated_clock -name gclk -source clk[get_pins gclk]解释:创建名为gclk的由clk产生的时钟。
3. set_clock_latency:设置时钟路径的延迟语法:set_clock_latency [-source \<source_clock>] [-sink\<sink_clock>] \<latency>示例:set_clock_latency -source clk -sink gclk 2解释:设置从clk到gclk的时钟路径延迟为2单位。
那么信号经过这个网络后,延迟为:2+1+2+1+(3+(4-1)×2)=15.那么延迟减少了5。
接下来讲一下skew,既然知道了fanout对于delay的影响,下面看一个例子:由于时钟到每个触发器的互连线长短不一样,造成信号到达clockpin的时间也不一样,触发器也不会同时翻转。
Skew的定义就是最长路径减去最短路径的值。
根据时钟域以及路径关系,skew可以分为globalskew,localskew,interclockskew。
Globalskew是指,同一时钟域,任意路径的最大skew。
Localskew是指,同一时钟域,任意2个有逻辑关联关系的路径最大skew。
interClockskew是指,不同时钟域之间路径的最大skew另外还有一个usefulskew。
本来打算在setuptime和holdtime中讲解。
这里先大概说下如下图:时钟周期为10ns,各时钟路径延迟如下:可以看到有一条路径的slack 为-1,说明这条路径违规。
可以看到与这条路径相关的skew是T3-T2=-1ns。
下面我们利用usefulskew向前面一个slack比较充裕的路径(slack=2ns)借点time,来修正现在这条路径。
如下图:经过usefulskew,修正了原来的violator。
这就是usefulskew的作用,可以向前,或者向后接time来修正violator忽然想起来这三个概念的时候有点模糊,所以重新看了下,下面总结如下:传输时间(propagationtime):输入信号幅度在50%到输出信号幅度达到50%的时间间隔叫做传输时间,有高/低和低/高两种传输时间。
转换时间(transitiontime):输出信号幅度由10%达到90%的时间间隔,有高/低和低/高两种转换时间。
延迟时间(delaytime):输入信号在幅度为10%和输出信号达到10%的瞬间之间的时间间隔叫做延迟时间,分为高/低延迟时间和低/高延迟时间(高/低和低/高输出波形的变化过程)。
xdc管脚约束
XDC(Xilinx Design Constraints)是Xilinx FPGA设计工具使用的约束文件格式,用于描述FPGA设计中的管脚约束。
XDC约束文件提供了一种灵活而强大的方式来规定FPGA设计中输入输出管脚的电气和时序要求。
以下是一些常见的XDC管脚约束:
1. IO标识:定义每个管脚的引脚名称和所在物理位置,例如使用LOC属性指定管脚的物理位号。
2. 约束引用时钟信号:使用create_clock约束指定输入时钟的频率和时钟延迟,以帮助实现时钟域划分。
3. 时序约束:使用set_input_delay和set_output_delay约束指定输入和输出信号的最大和最小延迟,以控制时序关系。
4. 约束时钟域与数据域:使用create_clock和
set_input_delay/receive_clock约束指定时钟域和数据域之间的时序要求。
5. 差分信号约束:对于差分信号,使用set_input_delay和
set_output_delay约束分别指定差分对的最大和最小延迟。
6. 禁用管脚约束:使用set_property约束禁用某些管脚,以保证设计的正确性。
这些约束将在FPGA布局时被综合软件使用,确保设计在时
序和电气上达到所需的目标。
在设计中正确使用XDC约束可以提高设计的性能和可靠性。
set_input_delayinput_delay 是设置外部信号到达输入端口的时间,DC会用它来计算留给内部逻辑的时间。
set_output_delay是设置输出端口到数据采集处的延迟。
DC 会根他来计算留给内部逻辑的时间。
▋▎我的理解下面的式子中,除了用来描述芯片内部的时间参数以外都属于input delay/output delay. max条件 T > clk_q_delay + internal_logic_delay + external_logic_delay + setup_time min条件 hold_time < clk_q_delay + internal_logic_delay + external_logic_delay其中T是capture端时钟与launch端时钟的相位差。
即,如果是同一时钟的话,则要考虑jitter和skew如果是不同时钟的话,则要考虑真正的相位差(capture端 - launch端)设置set_input_delay时■用来描述芯片内部的logic的时间参数有internal_logic_delaysetup_timehold_time■其余的有以下,用来描述芯片外部logic的时间参数clk_q_delayexternal_logic_delay所以input_delay_max = [clk_q_delay + external_logic_delay]_maxinput_delay_min = [clk_q_delay + external_logic_delay]_min约束可以写成set_input_delay -max [clk_q_delay + external_logic_delay]_max -clock Clk DINset_input_delay -min [clk_q_delay + external_logic_delay]_min -clock Clk DIN设置set_output_delay时■用来描述芯片内部的logic的时间参数有clk_q_delayinternal_logic_delay■其余的有以下,用来描述芯片外部logic的时间参数external_logic_delaysetup_timehold_time所以output_delay_max = external_logic_delay_max + setup_timeoutput_delay_min = external_logic_delay_min - hold_time ※约束可以写成set_output_delay -max (external_logic_delay_max + setup_time) -clock Clk DOUTset_output_delay -min (external_logic_delay_min - hold_time) -clock Clk DOUT※ 是【external_logic_delay_min - hold_time】而不是【hold_time - external_logic_delay_min 】的理由min条件 hold_time < clk_q_delay + internal_logic_delay + external_logic_delay中hold_time和external_logic_delay在不等式的两边,要把它们移到不等式的同一边。
set_input_delay/ set_output_delay之图解set_input_delay/ set_output_delay在与时钟选项定义的时钟相关的输入port上定义data arrival time,可将输入延时定义与上升沿或下降沿相关。
如果输入延时与简单的生成时钟相关,到生成时钟的clock arrival time要加到data arrival time上。
输入延时可以定义与时钟网络中的port相关,到参考port的clock arrival time 要加到data arrival time上。
输入延时可以包含时钟源延时,默认条件下,相关的时钟源延时加到输入延时上;但是,当定义-source_latency_included选项时,时钟源延时不要相加,因为它并没有用作为input delay value的时序因素。
max用在时钟建立时间或恢复(recovery)校验上,min用于时钟保持时钟或移除(removal)校验上。
以上内容摘自Quartus help,基本定义edn上很多仁兄已经讲的很清楚了。
看下面简单的例子,两级触发器,来自/support/examples/timequest/exm-timequest.html设计图:点击看原图很简单的例子,仅仅加时钟周期约束的条件下,用TimeQuest分析仅会得到一路path的分析,reg1 to reg2,时序图如下:这张图已经有人做过了仔细的分析,可以清楚地看到各个参数的大小。
下面三张图是加约束后的时序分析图,所加的条件是:set_input_delay -clock { clk_in } -add_delay 1.200 [get_ports {data_in}] set_output_delay -clock { clk_in } -add_delay 2.000 [get_ports data_out] 重新运行TimeQuest,可以看到3个path分析1) data_in to reg12) reg1 to reg23) reg2 to data_out可以看到,输入路径在data arrival time上加上了input delay;输出路径在data required time上减去了output delay;分别表现为对setup和hold时间的影响。
Set input delay1.input delay的由来分析电路连接:图1图2(1)Tclk1:时钟源osc产生的时钟到达ASSP时钟脚的延迟。
由于这个延时的存在,到达assp的时钟与osc时钟源的相位关系如图2所示为:图3(2)Tco:时钟沿有效到数据输出有效的时间间隔,可得到到达assp时钟端口和assp 的数据输出的相位关系:图4(3) pcb data T _:pcb 走线延迟(4) ext clk T 2 :osc 时钟源到达fpga 管脚的延时。
经过上面四个延迟,到达fpga 数据管教的数据和osc ,FPGA.CLK 的相位关系如图5:图5最终由图5可知,相对于FPGA.CLK ,数据到达fpga 的数据端的延迟时间为:Input Delay = Tclk1+ Tco+pcb data T _-ext clk T 2 (1)2. max_delay 和min_delay首先说明一点,为了满足reg2的建立和保持时间,fpga 的布局布线工具会调整图1中的int data T 和in clk T 2,也就是说为了满足reg2的时序要求,这两个时间是可以改变的。
由于Tclk1,pcb data T _,ext clk T 2是由pcb 走线决定,为固定值,只有Tco 有max 和min 之分,当Tco 取max 值时得到max delay ,当Tco 取min 值时,得到min delay 。
Max delay = Tclk1+ Tco (max )+pcb data T _-ext clk T 2 (2) Min delay = Tclk1+ Tco (min )+pcb data T _-ext clk T 2 (3)那么把max delay 和min delay 加到时序约束中有什么样的作用呢???max delay 和min delay 都是delay ,描述的是数据到达fpga 的数据脚延时了时钟沿到达fpga 时钟脚多少时间。
图6,如果在timequest 中设置max delay 越大,就告诉了布局布线器数据相对edge 延时越大,布局布线器就认为延时大,为了满足setup time (综合器知道fpga 自身的setup time ),它调整数据和edge 的相对相位变化幅度就越大(布局布线器就通过调整int data T 和in clk T 2),调整时钟延时in clk T 2就越大,保证了setup time ,但减少了保持时间,所以设置delay 时间不能太大。
图6min delay 为了满足reg2数据的hold 时间,让到达reg2的时钟延时时间有一个最小的延时。
这样布局布线器就通过约束让in clk T 2比较小。
Min delay 不能太小,否则建立时间不能满足。
max delay 和min delay 就是一对相互矛盾体。
外部器件输入到FPGA 的数据也必须满足建立保持时间要求,输入最大延时通俗的理解就是外部器件的数据到达FPGA 端口的最晚时间,这个最晚时间可不能太晚,必须考虑FPGA 内部锁存这个数据的建立时间Tsu 。
如果数据晚到时钟的锁存沿前的Tsu 时间还没有到达,那么时钟就无法锁存这个数据了。
那么就会出现时序违规了,所以,这个输入最大延时需要满足的第一个条件就是Tsu+输入最大延时<时钟周期TCLK (如图8的第一个公式)。
如图7:同理,这个数据要到达FPGA 最快的时间称之为输入最小延时。
这个最快时间也不能太快,试想想,如果在时钟的发射沿外部器件里的数据在非常短的时间内通过了外部器件的Tco 和PCB 走线,到达FPGA 端口时,假设此时FPGA 正处于上一个从外部器件传递来的数据的保持时间Th 内,那么新到达的数据势必会破坏了前一个数据的保持时间,这也会造成时序违规。
这么说来,这个输入最小延时也不能太小,也必须满足一定的条件,这个条件就是:Th<输入最小延时(如图8的第二个公式)。
图8总之把数据到达fpga 的max delay 和min delay 加到时序约束中,fpga 会约束int data T 和in clk T 2,尽量去满足reg2的建立和保持时间。
3.timequestTimequest应用例子打开timequest/constraint/set input delay 1. 例子1(1)timequest设置max delaymin delay生成的指令:set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[0]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[0]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[1]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[1]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[2]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[2]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[3]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[3]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[4]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[4]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[5]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[5]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[6]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[6]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[7]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[7]}]Setuput波形图Hold波形图2. 例子2 Set max delaySet min delay生成的语句:set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[0]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[0]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[1]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[1]}]set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[2]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[2]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[3]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[3]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[4]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[4]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[5]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[5]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[6]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[6]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[7]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[7]}]波形图:setupHold:上面两种情况都为最差的情况(大概就是slack 最小吧),但无论如何,在不同的max delay 和min delay 情况下,都会有不同的int data T 和in clk T 2(起码有一个不同)。