学习目标:
- 定义时序特例
- 时序特例的合法起点和终点
- 报告忽略的时序特例的命令
- 给定多周期路径和规范,应用多周期路径约束
时序特例
什么是时序特例?
跟default默认情况下检查不同的检查设置都可以归为timing exception。
timing constraint几大块:
- 时钟定义和时钟之间的关系。(design部分提供)
- timing exception(不是所有的path都在一个cycle里面进行检查。但是时序例外必须是真实情况的反应,自己不要随便加)
- IO constraint端口信号约束。
- 静态信号、长值信号(长时间是某个值的信号)(有的也归在timing exception)
时序特例是改变默认单时钟检查的constraint。
//定义时钟,设置输入输出端口延时,工具默认是单周期检查
Create_clock
Set_input_delay
Set_output_delay
timing exception相关命令:
set_false_path
/*
false_path,对某个点定义后,不对它进行时序检查
不去进行时序检查 情况:
(1)design加入某个设计,但是芯片不需要这个功能。
(2)功能也用,但是优先级不高,芯片真正功能上用不到,可能是用来测试、监督信号。
(3)信号在整个芯片生命周期中,近乎是静态值。比如,在上电时动一下,或者,实现某一个功能应用时动一下(可以设置但是不推荐使用false,安全起见,设置为multicycle)
*/
set_multicycle_path
/*
multicycle path多周期path,数据路径延时比较大,一个周期跑不到,或者功能实现不需要一个周期跑到
信号太长,一个周期传不过去。
情况:
从设计上来说:
(1)一些运算器data path特别长,功能不一定要一定在一个周期上做完,可以几个周期。
(2)信号切换不频繁,类似静态信号,长时间处于某个电平。
从后端便利性来说:
(3)从写constraint便利性考虑,减少constraint的复杂
*/
set_max_delay
/*
定义两个点之间的绝对延时。
(1)跨时钟域。异步逻辑,不会进行时序检查。一些设计中两个domin虽然异步,但是信号之间的传输延迟不能超过几个cycle,有时序要求。
(2)存在一个balance,好几个信号,在一定范围内同时到达。
*/
set_min_delay
/*
定义两点之间的绝对的最小延时
*/
//set_max_delay和set_min_delay一般成对出现。
report_exceptions //看看exception constraint
reset_path //重置timing path
//这些指令的语法:
//从那个点开始到那个点结束的约束
option有:
-from //起始点
-to //到哪里
-through //经过哪个点
-rise_from
-fall_from
时序例外的合法起点和终点
时序例外要从有效的startpoint开始到有效的endpoint结束。否则constraint会被ignore 。
起点startpoint:
- Input Ports
- Clock Pins of Registers
终点endpoint:
- Output Ports
- register除了clock pin的其他端口(reset pin、set pin、En pin<使能端口>、data pin)
减少时序例外的数量
以下各项分别代表多少个例外?
set false path -from Q2 reg[*]/CP
set false path -from g2_reg[*]/CP -to 93_reg[*]/D //*代替任意字符
set false path -from g2 reg[1]/CP-to reg[1]/D
// .
// .
// .
set false path-from Q2 reg[32]/CP -to reg[32]/D
set false path -from clk2 -to clk3 //clock2 domin到clock3 domin这条路径设置为false
/*
这四个命令是等效的。
判断那个命令更好:
越精细化定位到startpoint和endpoint越好,太宽泛不好,有可能把其他不该false的路径false了。
*/
使用 -through 选项
–through 选项需要更多 CPU 用于大型设计
除非必要,否则不要使用 –through
(工具计算起点终点花费时间多,而且没有人能保证through某个点的时候,把endpoint和startpoint写全部考虑清楚,容易误伤真实要检查的点)
当有一个引脚时使用 set_disable_timing 而不是 –through
Set_false_path –through U1/A
Set_disable_timing U1/A
//disable timing arc,时序检查信息传不过这个逻辑,经过这个点的逻辑都被打断了
时序例外检查
report_exceptions –ignored //工具ignore的constraint报出来,看看哪里出问题做检查
check_timing
/*
option很多,有些时序没有clock也会报出来,有clock,但是没有timing path叫做unconstraint_endpoint,是因为加了timing exception路径被打断了,没法构成有效的时序路径
*/
时序例外的优先级
- 同一指令优先级,越具体设置,优先级越高。
- 不同指令优先级,false大于multicycle。
仅应用所需的时序例外
Set_false_path –to FF2/D –setup //两条path都受影响
Set_false_path –from FF0/CP –to FF2/D -hold //1-2保留了,0-2影响
多周期路径
加法器
时钟周期10ns,需要60ns计算时间。单cycle跑不了,需要六个cycle。
时序约束,用multicycle。
加了multicycle,指令:
create_clock –period 10 [get_ports CLK]
set_multicycle_path –setup 6 –to [get_pins “C_reg[*]/D”]
设置六倍的cycle,推六个cycle在周期60处做时序检查setup检查
hold怎么去进行检查?
hold也会跟着走,少一个cycle
create_clock –period 10 [get_ports CLK]
set_multicycle_path –setup 6 –to [get_pins “C_reg[*]/D”]
Set_multicycle_path –hold 5 –to [get_pins “C_reg[*]/D”
//multicycle设置成对出现
对应不同的hold check情况:
(1)数据很短,信号变化很快,但是传输路径长。
(2)数据很慢,经过长时间传到被采集的地方 。