安路TangDynasty(TD)中进行时序约束的两种方法-Anlogic-安路社区-FPGA CPLD-ChipDebug

安路TangDynasty(TD)中进行时序约束的两种方法

GUI界面设置时序约束

GUI界面约束方法相对较易入门,但相比于后面提到的文本约束方法而言不够灵活,功能也不够强大。

有两种方式可以打开设置时序约束的界面: (建议当且仅当运行完成 Syn Opt
Optimize RTL 时打开,否则处于置灰状态或打开会有 Warning 提示框。)
1. FPGA Flow 面板中,展开 User Constraints,双击 SDC Constraint

 

20230917084218307-image

2. 在菜单栏中展开 Tools,双击 Timing Wizard,或使用快捷方式 Ctrl+Alt+T

20230917084232278-image

Timing Wizard 主界面如下图所示:

20230917084241524-image

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 指明了时钟源,可以是 netspins ports,如果
target 为空则说明定义了一个虚拟时钟; -name 指定了时钟名, 不可为空; -period
为周期,该选项必须指定,且数值需大于 0-waveform 指定了第一个上升沿与
第一个下降沿的时间点,暂时仅支持每周期包含两个时钟沿的情况;
-add 说明
target 管脚上已经定义过时钟的情况下,将新时钟加入至该管脚,否则覆盖已
有时钟,主要用于
clock multiplexer 的情况。
参数设置如下图所示:

20230917084313786-image

点击 Targets 后方的查找按钮,可选择不同类型的 target

20230917084324653-image

参数设置好后,点击 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
参数设置如下图所示:

20230917084409995-image

-source 指定了其 master clock 所在的源点,可以是 netspins ports 的列表;
点击
Source 的下拉菜单,可选择不同类型的 source:

20230917084428631-image

-master_clock 指定了 master clock 的名称,单击 Master Clock 的下拉菜单,可选
择已创建的
clock

20230917084441485-image

-name 指定了时钟名, 不可为空; target 为当前生成时钟的源点。-add 说明在 target
管脚上已经定义过时钟的情况下,将新时钟加入至该管脚,否则当前生成时钟
被忽略,这点与
master clock 定义时不同。

点击 Targets 栏的查找按钮,同样可以添加不同类型的 target

20230917084501443-image

生成时钟的周期与波形由 master clock 调整而来, -divide_by / -multiply_by 指频率
除以
/乘以指定倍数, -invert 与这两条选项配合使用,使时钟波形反转,而
-duty_cycle 配合-multiply_by 选项使用,用以调节占空比; 默认选择 Based on
frequency

若选择
Based on waveform,则可设置 edge 选项。 -edges 选项有且仅有三个正整
数,分别指定了新生成时钟的第一个上升沿,第一个下降沿,第二个上升沿对应
源时钟的第几个边沿;
-edge_shift 选项将指定-edges 选项中三条时钟沿的偏移量,
因此将包含
3 个正负皆可的整数,单位为基本时间单位(默认为 ns)。

20230917084516303-image

3. Derive PLL Clocks
格式: derive_pll_clocks
定义: derive_pll_clocks 命令会自动在所有的 PLL 输出端口以输入端口的时钟
作为
master clock 调用 create_generated_clock 生成相应的 generated clocks,生成
时钟的频率、相位都将严格按照
PLL 内部的参数设定,且生成的时钟名为“PLL
单元名.PLL 输出接口名”。

20230917084532415-image

界面支持对“PLL 单元名.PLL 输出接口名” 进行重命名, 输入想要重命名的名
字同时下方的
SDC Command 栏会自动写上对应的命令

20230917084545782-image

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

20230917084635802-image

5. Set Clock Uncertainty
格式: set_clock_uncertainty -setup -hold uncertainty target
定义: 设定时钟的 uncertainty 数值,目前仅支持对于单个时钟本身设置而不支
持跨时钟域的
uncertainty 定义; target clock 的列表, uncertainty 为数值项;
-setup/-hold 选项指明本命令所对应的是最大/最小路径时序分析时所对应的数值,
如果该选项没有指明,则对两种检查同时生效。
单击
Add 将该命令添加至 Summary
参数设置如下图所示:

20230917085534916-image

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 的时
序分析。
参数设置如下图所示:

20230917085557715-image

默认为设置 input delay 相关参数; 若需设置 output delay 相关参数,需选择 Set
Output Delay
,参数设置同 input delay
单击
Clock 栏右侧查找按钮,可指定已创建的时钟。

20230917085612145-image

单击 Targets 栏的查找按钮,可指定相应的 ports,若选择的为 Set Input Delay
则仅有
input/inout ports 可见;若选择的为 Set Output Delay,则仅有 output/inout
ports
可见。

20230917085625486-image

20230917085632351-image

单击 Add 将命令添加至 Summary

20230917085646987-image

若要删除已经生成的 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 选项可以是 regsnets
pins 列表,指定了该时序路径必须通过的中间点,当有多个 through 选项时,目
标时序路径必须依次经过每一个中间点;
-datapath_only 项为仅分析纯数据路径
延时。
参数设置如下图所示:
默认为
Set Maximum Dealy,若要设置 Minimum Delay,需选择 Set Minmum

20230917085751277-image

rise_from/fall_from rise_to/fall_to 可分别在 from/to 点击下拉菜单选择。

20230917085804982-image

单击 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 的列表, regspins 等, -rise_from
以时钟上升沿作为参考,其中对象只能是 clocks-fall_from 以时钟下降沿作为
参考,其中对象只能是
clocks-to 指定约束的的终点,可以是 clocks outputs
的列表, regspins 等, -rise_to 以时钟上升沿作为参考,其中对象只能是 clocks
-fall_to 以时钟下降沿作为参考,其中对象只能是 clocks-through 指定了该时序
路径必须通过的中间点,可以是
regspins nets 的列表。 指定后系统会自动
追溯到时序路径的起止点。
参数设置如下图所示:

20230917085841585-image

点击 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 的列表, regspins 等, -rise_from 以时钟上升沿作为参考,其
中对象只能是
clocks-fall_from 以时钟下降沿作为参考,其中对象只能是 clocks
-to 指定约束的的终点,可以是 clocks outputs 的列表, regspins 等, -rise_to
以时钟上升沿作为参考,其中对象只能是 clocks-fall_to 以时钟下降沿作为参
考,其中对象只能是
clocks-through 指定了该时序路径必须通过的中间点,可
以是
regspins nets 的列表。

20230917085912762-image

点击 Add 将生成的命令添加至 Summary

10. Set Clock Groups
格式: set_clock_groups -exclusive -asynchronous -group <list>
定义:为时钟域设定分组,不分析跨时钟组的时序路径。一般来说, -exclusive
选项表示时钟是互斥的,即时钟不会再同一时刻同时有效,而-asynchronous
用于异步时钟
, 时钟有完全不同的时钟源,即时钟不会在同一时刻有效,不过在
具体实现以及效果上,这两个选项是一样的,该命令会在所有
-group 列出的时
钟之间定义
false path 约束集合。
参数设置如下图所示:

20230917085942954-image

点击 Add 将生成的命令添加至 Summary

11. Summary
Summary
中记录了所有已生成的命令。 指定文件保存的路径, 默认勾选添加至
当前工程,点击
Save,完成各命令的设置。

20230917090012853-image

 

SDC文本约束方法

跟管脚约束一样,时序也可以使用文本约束,安路的SDC支持行业标准时序约束语法。

添加时序约束

新建 SDC 文件
1. 点击新建按钮

20230917083711815-image

, 在新打开的窗口中输入 SDC 命令
2. 点击保存按钮

20230917083739751-image

, 将文件路径设置在项目路径下,文件名可设为 demo.sdc, 然后
单击保存。

20230917083755999-image

添加 SDC 文件:

右键单击 Hierarchy Navigation 面板中 Project 里的 Constraints, 选择 Add SDC File,
选中 demo.sdc,点击打开。

20230917083817804-image

或者展开 FPGA Flow 中的 User Constraints, 双击 Add SDC File, 如上图选中
demo.sdc点击打开。当运行完成Syn OptOptimize RTL才可打开时序约束界面Timing
Wizard
,否则处于置灰状态。

20230917083831573-image

* 工程中支持对一个constraint_1中添加多个sdc文件, 当添加一个新的sdc文件时,
之前已添加的文件会被默认设置为
disable, 即最后添加进工程的sdc文件为enable。 可以
通过右键选择
File Properties更改sdc文件的enable/disable属性。

20230917083845677-image

Flow已经运行至Syn OptOptimize RTL之后的Step, 双击打开时序约束界面
Timing Wizard会出现如下Warning提示。

20230917083859736-image

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 portspins,如果 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 portspins 的列表,
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 选项可以是 regsnetspins 列表,指定了
该时序路径必须通过的中间点,当有多个
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 的列表, regspins 等; -rise_from 以时钟上升沿作为参考, 其中对象只能
clock 是; -fall_from 以时钟下降沿作为参考,其中对象只能是 clocks-to
定约束的终点,可以是
clocks outputs 的列表, regspins 等; -rise_to 以时钟
上升沿作为参考,其中对象只能是
clocks-through 指定了该时序路径必须通过
的中间点, 可以是
regspins 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 的列表, regspins 等; -rise_from
以时钟上升沿作为参考,其中对象只能是 clocks-fall_from 以时钟下降沿作为
参考,其中对象只能是
clocks-to 指定约束的的终点,可以是 clocks outputs
的列表, regspins 等; -rise_to 以时钟上升沿作为参考,其中对象只能是 clocks
-fall_to 以时钟下降沿作为参考,其中对象只能是 clocks-through 指定了该时序
路径必须通过的中间点, 可以是
regspins 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

请登录后发表评论

    没有回复内容