GUI界面设置时序约束
GUI界面约束方法相对较易入门,但相比于后面提到的文本约束方法而言不够灵活,功能也不够强大。
有两种方式可以打开设置时序约束的界面: (建议当且仅当运行完成 Syn Opt 的
Optimize RTL 时打开,否则处于置灰状态或打开会有 Warning 提示框。)
1. 在 FPGA Flow 面板中,展开 User Constraints,双击 SDC Constraint;
2. 在菜单栏中展开 Tools,双击 Timing Wizard,或使用快捷方式 Ctrl+Alt+T。
Timing Wizard 主界面如下图所示:
Timing Wizard 包含三个部分:
1. Clock Definition : 该部分主要包含创建或定义时钟约束的 SDC 命令;
2. Path Definition : 该部分主要包含创建或定义时序路径约束的 SDC 命令;
3. Summary : 该部分总结已创建的时钟和时序路径的所有约束。
下面详细介绍每条命令的使用方法:
1. Created Clocks
格式: create_clock
-add -name <string> -period <double> -waveform <string> target
定义: 定义一个时钟: target 指明了时钟源,可以是 nets、 pins 或 ports,如果
target 为空则说明定义了一个虚拟时钟; -name 指定了时钟名, 不可为空; -period
为周期,该选项必须指定,且数值需大于 0; -waveform 指定了第一个上升沿与
第一个下降沿的时间点,暂时仅支持每周期包含两个时钟沿的情况; -add 说明
在 target 管脚上已经定义过时钟的情况下,将新时钟加入至该管脚,否则覆盖已
有时钟,主要用于 clock multiplexer 的情况。
参数设置如下图所示:
点击 Targets 后方的查找按钮,可选择不同类型的 target。
参数设置好后,点击 Add 将该命令添加至下方的方框,则可继续设置其他参
数的该命令,否则该命令将不会添加至 Summary。若工程中已添加 sdc 文件,
并且 sdc 文件中已经存在了 created_clock 命令,则会将已有命令也添加至
Summary 中。
2. Created Generated Clock
格 式 : create_generated_clock
-add -name <string> -source <list> -divide_by
<double> -multiply_by <double> -edges <string> -duty_cycle <double> -invert -
edge_shift <string> -master_clock <string> target
定义: 定义一个派生时钟,属于 master clock 所在的时钟域,在时序报告中也将
具有和 master clock 相同的 start point。
参数设置如下图所示:
-source 指定了其 master clock 所在的源点,可以是 nets、 pins 或 ports 的列表;
点击 Source 的下拉菜单,可选择不同类型的 source:
-master_clock 指定了 master clock 的名称,单击 Master Clock 的下拉菜单,可选
择已创建的 clock;
-name 指定了时钟名, 不可为空; target 为当前生成时钟的源点。-add 说明在 target
管脚上已经定义过时钟的情况下,将新时钟加入至该管脚,否则当前生成时钟
被忽略,这点与 master clock 定义时不同。
点击 Targets 栏的查找按钮,同样可以添加不同类型的 target。
生成时钟的周期与波形由 master clock 调整而来, -divide_by / -multiply_by 指频率
除以/乘以指定倍数, -invert 与这两条选项配合使用,使时钟波形反转,而
-duty_cycle 配合-multiply_by 选项使用,用以调节占空比; 默认选择 Based on
frequency。
若选择 Based on waveform,则可设置 edge 选项。 -edges 选项有且仅有三个正整
数,分别指定了新生成时钟的第一个上升沿,第一个下降沿,第二个上升沿对应
源时钟的第几个边沿; -edge_shift 选项将指定-edges 选项中三条时钟沿的偏移量,
因此将包含 3 个正负皆可的整数,单位为基本时间单位(默认为 ns)。
3. Derive PLL Clocks
格式: derive_pll_clocks
定义: derive_pll_clocks 命令会自动在所有的 PLL 输出端口以输入端口的时钟
作为 master clock 调用 create_generated_clock 生成相应的 generated clocks,生成
时钟的频率、相位都将严格按照 PLL 内部的参数设定,且生成的时钟名为“PLL
单元名.PLL 输出接口名”。
界面支持对“PLL 单元名.PLL 输出接口名” 进行重命名, 输入想要重命名的名
字同时下方的 SDC Command 栏会自动写上对应的命令
4. Set Clock Latency
格式: set_clock_latency
-clock <list> -max -min -source delay
定义: 设定时钟的延时, delay 为延时的数值;
-clock 指定时钟的列表;
-max/ -min 选项指定本命令所指定的为最大/最小延时,默认为两者相同;
-source 选项说明指定的为 source latency,否则为 network latency。
network latency 在布线后的时序分析中,将被实际的互联延时所取代。
单击 Clock 栏后的查找按钮,可指定已创建的 clock。
单击 Add 按钮将该命令添加至 Summary。
5. Set Clock Uncertainty
格式: set_clock_uncertainty
-setup -hold uncertainty target
定义: 设定时钟的 uncertainty 数值,目前仅支持对于单个时钟本身设置而不支
持跨时钟域的 uncertainty 定义; target 为 clock 的列表, uncertainty 为数值项;
-setup/-hold 选项指明本命令所对应的是最大/最小路径时序分析时所对应的数值,
如果该选项没有指明,则对两种检查同时生效。
单击 Add 将该命令添加至 Summary。
参数设置如下图所示:
6. Set Input/Output Delay
格式: set_input_delay / set_output_delay
-clock <list> -clock_fall -max -min
-source_latency_included -network_latency_included -reference_pin delay target
定义: 设置输入/输出端口的延时, delay 项为延时数值, target 只能是 ports 的对
象列表; -clock 指定了延时所对应的时钟信息; -clock_fall 指定 reference clock 在
下降沿采样; -max/-min 选项则指定了本命令所设置的值为最大/最小延时,默认
为相同; -source_latency_included 时序分析时从 input/output delay 中减除 clock
source latency; -network_latency_included 时序分析时从 input/output delay 中减除
clock network latency; -reference_pin 为 input/output delay 添加一个参考点,工具
会考虑参考点处的 source latency 和 network latency,用作 input/output delay 的时
序分析。
参数设置如下图所示:
默认为设置 input delay 相关参数; 若需设置 output delay 相关参数,需选择 Set
Output Delay,参数设置同 input delay。
单击 Clock 栏右侧查找按钮,可指定已创建的时钟。
单击 Targets 栏的查找按钮,可指定相应的 ports,若选择的为 Set Input Delay,
则仅有 input/inout ports 可见;若选择的为 Set Output Delay,则仅有 output/inout
ports 可见。
单击 Add 将命令添加至 Summary。
若要删除已经生成的 SDC Command, 可在 Summary 中选中该命令, 点击行末
的删除按钮“X”。
7. Set Max/Min Delay
格式: set_max_delay / set_min_delay
-from <list> -rise_from <list> -fall_from <list>
-to <list> -rise_to <list> -fall_to <list> -through <list> -datapath_only delay
定义: 设定时序路径的允许最大/最小延时, delay 项为延时数值; -from 必须为
时序路径的起点,即 input 列表, 或 cells, 或 regs,或 clocks,或 clock 定义的
位置对应的 pins; -rise_from 以时钟上升沿作为参考,其中对象只能是 clocks;
-fall_from 以时钟下降沿作为参考,其中对象只能是 clocks; -to 必须为时序路径
的终点,即 output 的列表, 或 cells, 或 regs,或 clocks,或 clock 定义的位置对
应的 pins; -rise_to 以时钟上升沿作为参考,其中对象只能是 clocks; -fall_to 以
时钟下降沿作为参考,其中对象只能是 clocks; -through 选项可以是 regs, nets,
pins 列表,指定了该时序路径必须通过的中间点,当有多个 through 选项时,目
标时序路径必须依次经过每一个中间点; -datapath_only 项为仅分析纯数据路径
延时。
参数设置如下图所示:
默认为 Set Maximum Dealy,若要设置 Minimum Delay,需选择 Set Minmum
rise_from/fall_from 和 rise_to/fall_to 可分别在 from/to 点击下拉菜单选择。
单击 Add 将设置好的命令添加至 Summary。
8. Set Multicycle Path
格式: set_multicycle_path -setup -hold -start -end -from <list> -rise_from <list> –
fall_from <list> -to <list> -rise_to <list> -fall_to <list> -through <list> multiplier 定义: 设置允许多个时钟周期延时的时序路径, multiplier 项为时钟周期数; –
setup/-hold 选项设定该命令所约束的时序路径类型,仅使用-setup 选项时, setup
check 将允许时序路径最多使用 N 个时钟周期,但同时 hold check 会变为要求时
序路径最短经过 N-1 时钟周期。仅使用-hold 选项时,则将 hold check 的约束设
置为 N 而不影响 setup check 的约束。
在常规使用场景下,为了让 setup check 能使用多个时钟周期而不影响 hold check,
需要两条命令搭配使用,即设定一条 N 个周期的 setup 约束,再配合一条 N-1 个
周期的 hold 约束。
-start/-end 为跨时钟域时使用的选项,指定延时为 launch/capture 时钟对应的周
期,默认情况下, setup check 使用 capture 时钟而 hold check 使用 launch clock。
-from 指定约束的起点,可以是 clocks 或 inputs 的列表, regs, pins 等, -rise_from
以时钟上升沿作为参考,其中对象只能是 clocks; -fall_from 以时钟下降沿作为
参考,其中对象只能是 clocks; -to 指定约束的的终点,可以是 clocks 或 outputs
的列表, regs, pins 等, -rise_to 以时钟上升沿作为参考,其中对象只能是 clocks;
-fall_to 以时钟下降沿作为参考,其中对象只能是 clocks; -through 指定了该时序
路径必须通过的中间点,可以是 regs, pins 或 nets 的列表。 指定后系统会自动
追溯到时序路径的起止点。
参数设置如下图所示:
点击 Add 将生成的命令添加至 Summary。
9. Set False Path
格式: set_false_path
-setup -hold -from <list> -rise_from <list> -fall_from <list> -to
<list> -rise_to <list> -fall_to <list> -through <list>
定义: 设定时序路径为虚假路径,因而不对其进行时序分析; -setup/-hold 选项
指定了在 setup/hold check 时不分析目标路径。 -from 指定约束的起点,可以是
clocks 或 inputs 的列表, regs, pins 等, -rise_from 以时钟上升沿作为参考,其
中对象只能是 clocks; -fall_from 以时钟下降沿作为参考,其中对象只能是 clocks;
-to 指定约束的的终点,可以是 clocks 或 outputs 的列表, regs, pins 等, -rise_to
以时钟上升沿作为参考,其中对象只能是 clocks; -fall_to 以时钟下降沿作为参
考,其中对象只能是 clocks; -through 指定了该时序路径必须通过的中间点,可
以是 regs, pins 或 nets 的列表。
点击 Add 将生成的命令添加至 Summary。
10. Set Clock Groups
格式: set_clock_groups
-exclusive -asynchronous -group <list>
定义:为时钟域设定分组,不分析跨时钟组的时序路径。一般来说, -exclusive
选项表示时钟是互斥的,即时钟不会再同一时刻同时有效,而-asynchronous 应
用于异步时钟, 时钟有完全不同的时钟源,即时钟不会在同一时刻有效,不过在
具体实现以及效果上,这两个选项是一样的,该命令会在所有-group 列出的时
钟之间定义 false path 约束集合。
参数设置如下图所示:
点击 Add 将生成的命令添加至 Summary。
11. Summary
Summary 中记录了所有已生成的命令。 指定文件保存的路径, 默认勾选添加至
当前工程,点击 Save,完成各命令的设置。
SDC文本约束方法
跟管脚约束一样,时序也可以使用文本约束,安路的SDC支持行业标准时序约束语法。
添加时序约束
新建 SDC 文件
1. 点击新建按钮
, 在新打开的窗口中输入 SDC 命令
2. 点击保存按钮
, 将文件路径设置在项目路径下,文件名可设为 demo.sdc, 然后
单击保存。
添加 SDC 文件:
右键单击 Hierarchy Navigation 面板中 Project 里的 Constraints, 选择 Add SDC File,
选中 demo.sdc,点击打开。
或者展开 FPGA Flow 中的 User Constraints, 双击 Add SDC File, 如上图选中
demo.sdc点击打开。当运行完成Syn Opt的Optimize RTL才可打开时序约束界面Timing
Wizard,否则处于置灰状态。
* 工程中支持对一个constraint_1中添加多个sdc文件, 当添加一个新的sdc文件时,
之前已添加的文件会被默认设置为disable, 即最后添加进工程的sdc文件为enable。 可以
通过右键选择File Properties更改sdc文件的enable/disable属性。
若Flow已经运行至Syn Opt的Optimize RTL之后的Step, 双击打开时序约束界面
Timing Wizard会出现如下Warning提示。
SDC 约束说明
TD 的 Timer 模块支持用户输入的时序约束格式为 SDC 标准格式的常用命令子集,
下面列出了 TD 支持的 SDC 命令以及相关参数选项。
1. 指代对象相关:
a) all_clocks / all_inputs / all_outputs
:
指代全部该类别对象;
b) get_cells / get_pins / get_nets / get_regs
[-hierarchical] [-hier] [-nocase] [-nowarn]
<filter>
返回设计中 cells / pins / nets / regs 的集合, -hierarchical 或-hier 表示层次化搜索,
将在每一层次的模块中匹配对应名称, -nocase 表示不区分大小写, -nowarn 表
示没有匹配成功时也不给出警告。
c) get_clocks / get_ports
[-nocase] [-nowarn] <filter>
返回时钟/输入输出端口的集合,参数含义同上。
2. 时钟设定相关(时钟信息是最基础的时序约束):
a) create_clock
-add -name <string> -period <double> -waveform <string> target
定义一个时钟: target 指明了时钟源,可以是 nets 或 ports, pins,如果 target 为
空则说明定义了一个虚拟时钟; -name 指定了时钟名, 不可为空; -period 为周
期,该选项必须指定,且数值需大于 0; -waveform 指定了第一个上升沿与第一
个下降沿的时间点,暂时仅支持每周期包含两个时钟沿的情况; -add说明在target
管脚上已经定义过时钟的情况下,将新时钟加入至该管脚,否则覆盖已有时钟,
主要用于 clock multiplexer 的情况。
格式范例:
> create_clock –name sys_clk -period 20 -waveform {0 10} [get_ports sys_clk]
b) create_generated_clock
-add -name <string> -source <list> -divide_by <double> -
multiply_by <double> -edges <string> -duty_cycle <double> -invert -edge_shift
<string> -master_clock <string> -phase <double> target
定义一个派生时钟, 属于 master clock 所在的时钟域,在时序报告中也将具有和
master clock 相同的 start point。
-source 指定了其 master clock 所在的源点,可以是 nets 或 ports, pins 的列表, –
master_clock 指定了 master clock 的名称; -name 指定了时钟名, 不可为空; target
为当前生成时钟的源点。 -add 说明在 target 管脚上已经定义过时钟的情况下,将
新时钟加入至该管脚,否则当前生成时钟被忽略,这点与 master clock 定义时不
同。
生成时钟的周期与波形由 master clock 调整而来, -divide_by / -multiply_by 指频
率除以/乘以指定倍数, -invert 与这两条选项配合使用,使时钟波形反转,而–
duty_cycle 配合-multiply_by 选项使用,用以调节占空比; -phase 选项用于调整
相移,建议输入(0, 360)以内的参数,超过 360 将做取模处理。
-edges 选项包含三个整数,分别指定了新生成时钟的第一个上升沿,第一个下降
沿,第二个上升沿对应源时钟的第几个边沿; -edge_shift 选项将指定-edges 选项
中三条时钟沿的偏移量,因此将包含 3 个正负皆可的整数,单位为基本时间单
位(默认为 ns)。
格式范例:
> create_generated_clock -divide_by 1.25 -source [get_ports clk] -name sys_clk
[get_ports sys_clk]
c) derive_pll_clocks
自动在所有用到的 PLL 输出端口生以输入端口的时钟作为 master clock 调用
creat_generate_clock 生成相应的 generated clocks, 生成时钟的频率、相位都将严
格按照 PLL 内部的参数设定, 且生成的时钟名为“PLL 单元名.PLL 输出接口名”。> derive_pll_clocks
d) set_clock_latency
-clock <list> -max -min -source target delay
设定时钟的延时, delay 为延时的数值; -clock 指定时钟的列表;
-max/ -min 选项指定本命令所指定的为最大/最小延时,默认为两者相同;
-source 选项说明指定的为 source latency,否则为 network latency。
network latency 在布线后的时序分析中,将被实际的互联延时所取代。
target 指明时钟源,可以是 pins 或 clocks,如果 target 是 pins 则指代其上的时钟> set_clock_latency -clock [get_clocks {clk_vga_25m}] -source 2
e) remove_clock_latency
-clock <list> -source target
取消之前所设定的时钟延迟,各选项含义同上。
格式范例:
> remove_clock_latency -source [get_clocks clk_vga_25m]
f) set_clock_uncertainty
-setup -hold uncertainty target
设定时钟的 uncertainty 数值,目前仅支持对于单个时钟本身设置而不支持跨时
钟域的 uncertainty 定义; target 为 clock 的列表, uncertainty 为数值项; -setup/-
hold 选项指明本命令所对应的是最大/最小路径时序分析时所对应的数值,如果
该选项没有指明,则对两种检查同时生效。
格式范例:> set_clock_uncertainty -setup -hold 0.5 [get_ports clk]
g) remove_clock_uncertainty
-setup -hold target
移除之前所设定的时钟 uncertainty 数值,各选项含义同上。
格式范例:> remove_clock_uncertainty -setup -hold [get_ports clk]
3. 时序路径约束设定:
a) set_input_delay / set_output_delay
-clock <list> -clock_fall -max -min -add_delay -
source_latency_included -network_latency_included -reference_pin delay target
设置输入/输出端口的延时, delay 项为延时数值, target 只能是 ports 的对象列
表; -clock 指定了延时所对应的时钟信息; -clock_fall 时序分析时 delay 值以时
钟下降沿作为参考,该选项须同-clock 一起使用; -max/-min 选项则指定了本命
令 所 设 置 的 值 为 最 大 / 最 小 延 时 , 默 认 为 相 同 ; -add_delay 当 有 多 个
set_input_delay/set_output_delay 设置在同一个目标端口上时, -add_delay 会计算
多个 delay 值和作为目标端口的 input/output delay 值; -source_latency_included
时 序 分 析 时 从 input/output delay 中 减 除 clock source latency ; –
network_latency_included 时序分析时从 input/output delay 中减除 clock network
latency; -reference_pin 为 input/output delay 添加一个参考点,工具会考虑参考点
处的 source latency 和 network latency,用作 input/output delay 的时序分析。
格式范例:> set_input_delay -clock sys_clk 1.0 [all_inputs]
> set_output_delay -clock lcd_clk 3.0 [get_ports led_output]
b) remove_input_delay / remove_output_delay
-max -min target
移除之前设定的输入/输出延时,各项参数含义同上。
格式范例:> remove_input_delay -clock sys_clk 2 [get_ports {data[0]} ]
> remove_output_delay -clock sys_clk -0.55 [all_outputs]
c) set_max_delay / set_min_delay
-from <list> -rise_from <list> -fall_from <list> -to
<list> -rise_to <list> -fall_to <list> -through <list> delay
设定时序路径的允许最大/最小延时, delay 项为延时数值; -from 必须为时序路
径的起点,即 input 列表,或 regs, 或 cells, 或 clocks,或 clock 定义的位置对
应的 pins; -rise_from 以时钟上升沿作为参考,其中对象只能是 clocks; -fall_from
以时钟下降沿作为参考,其中对象只能是 clocks; -to 必须为时序路径的终点,
即 output 的列表,或 regs,或 clocks,或 clock 定义的位置对应的 pins; -rise_to
以时钟上升沿作为参考,其中对象只能是 clocks; -fall_to 以时钟下降沿作为参
考,其中对象只能是 clocks; -through 选项可以是 regs, nets, pins 列表,指定了
该时序路径必须通过的中间点,当有多个 through 选项时,目标时序路径必须依
次经过每一个中间点。
格式范例:> set_max_delay -from [get_ports {sw}] -to [get_ports {sm_bit}] -through [get_nets
{lcd/delay_cnt[2]}] 1
d) set_false_path
-setup -hold -from <list> -rise_from <list> -fall_from <list> -to <list>
-rise_to <list> -fall_to <list> -through <list>
设定时序路径为虚假路径,因而不对其进行时序分析; -setup/-hold 选项指定了
在 setup/hold check 时不分析目标路径。 -from 指定约束的起点,可以是 clocks 或
inputs 的列表, regs, pins 等; -rise_from 以时钟上升沿作为参考, 其中对象只能
是 clock 是; -fall_from 以时钟下降沿作为参考,其中对象只能是 clocks; -to 指
定约束的终点,可以是 clocks 或 outputs 的列表, regs, pins 等; -rise_to 以时钟
上升沿作为参考,其中对象只能是 clocks; -through 指定了该时序路径必须通过
的中间点, 可以是 regs, pins 或 nets 的列表。
格式范例:> set_false_path -from [get_clocks clk] -to [get_clocks sys_clk]
> set_false_path -from [get_clocks {clk_vga_25m}] -to [get_ports {sm_bit}]
-through [get_nets {dpram_top0/lfsr_done}]
e) set_multicycle_path
-setup -hold -start -end -from <list> -rise_from <list> -fall_from
<list> -to <list> -rise_to <list> -fall_to <list> -through <list> multiplier
设置允许多个时钟周期延时的时序路径, multiplier 项为时钟周期数; -setup/-hold
选项设定该命令所约束的时序路径类型,仅使用-setup 选项时, setup check 将允
许时序路径最多使用 N 个时钟周期,但同时 hold check 会变为要求时序路径最
短经过 N-1 时钟周期。仅使用-hold 选项时,则将 hold check 的约束设置为 N 而
不影响 setup check 的约束。
在常规使用场景下,为了让 setup check 能使用多个时钟周期而不影响 hold check,
需要两条命令搭配使用,即设定一条 N 个周期的 setup 约束,再配合一条 N-1 个
周期的 hold 约束。
-start/-end 为跨时钟域时使用的选项,指定延时为 launch/capture 时钟对应的周
期,默认情况下, setup check 使用 capture 时钟而 hold check 使用 launch clock。
-from 指定约束的起点,可以是 clocks 或 inputs 的列表, regs, pins 等; -rise_from
以时钟上升沿作为参考,其中对象只能是 clocks; -fall_from 以时钟下降沿作为
参考,其中对象只能是 clocks; -to 指定约束的的终点,可以是 clocks 或 outputs
的列表, regs, pins 等; -rise_to 以时钟上升沿作为参考,其中对象只能是 clocks;
-fall_to 以时钟下降沿作为参考,其中对象只能是 clocks; -through 指定了该时序
路径必须通过的中间点, 可以是 regs, pins 或 nets 的列表。
格式范例:> set_multicycle_path -setup -end -from [get_clocks {clk_vga_25m}] -through
[get_nets {uart/uart_tx/num[3]}] 2
f) set_clock_group
-exclusive -asynchronous -group <list>
为时钟域设定分组,不分析跨时钟组的时序路径。一般来说, -exclusive 选项表
示时钟是互斥的, 即时钟不会在同一时刻同时有效; -asynchronous 应用于异步
时钟,时钟有完全不同的时钟源, 即时钟不会在同一时刻有效; 不过在具体实现
以及效果上,这两个选项是一样的,该命令会在所有-group 列出的时钟之间定
义 false path 约束集合。> set_clock_groups -exclusive -group [get_clocks {clk_vga_25m}] -group [get_clocks
{sys_clk}]
g) set_clock_route
<net_name>
用于指定特定时钟线网不走专用时钟互连。对于 design 中 clock 数目超过了 TD
的限制时,可手动指定哪些 clock 线网不走时钟网络。若指定的时钟不走时钟网
络时,会导致布局布线失败, TD 会及时给出 error。> set_clock_route lcd12864_en_pad
h) set_clock_domain_timing self domain all
用于同时忽略所有异步或所有时钟间的时序关系。 all,默认选项,表示分析任意
两个时钟之间的时序; self,表示只分析同一个时钟内部的时序,跨时钟时序被
忽略; domain,表示只分析同一个时钟域内部的时序,跨时钟域的时序被忽略。> set_clock_domain_timing domain
没有回复内容