SDC Specical check setting的描述 - false path
在上一篇文中描述了SDC的基本语法,其中关于时序异常约束并没有进行详细的描述,但是在正常的设计中,一般这种异常的设置反而是需要特别关注的,主要包括:
1. 虚假路径- false path
不需要满足任何时序要求的路径;实现工具在受约束时,忽略此种路径上的时序。
2. 多周期路径 - multi-cycle
需要多个时钟周期来传递数据的路径,实现工具会放宽此路径上的时序。
3. 最小和最大延迟 - min/max delay
具有特殊要求的最大延迟和最小延迟路径,并且实在设计人员想要覆盖推测的建立和保持要求时指定的。
下面将对三种设置进行详细描述:
1. 虚假路径:
a. 组合电路中的虚假路径:
从这里可以看到A->mux1/A->mux2/A ->B 这个路径是不存在的,因为可以设置false path
set_false_path -from [get_ports A] -through [get_pins mux1/A] -throught [get_pins mux2/A] -to [get_ports B]
b. 时序电路的虚假路径
我们假设在a中sel信号是时序路径产生的,那么这里还是存在上述路径的虚假路径;
c. 动态激活的虚假路径
缺个小图
图里有两个从A->B:
A->K1 -> B
A -> K2 -> K3 -> K1 -> B
如果想让第二条路径不被阻塞,那么C必须为0, 如果C为1,这里第二条路径就像是一个虚假路径了。
但是如果两个路径的delay不同,且delay1<delay2,这样在A从0->1时,会存在毛刺,反之也会有一个毛刺。
这种依赖于延迟的路径,可能有毛刺的路径称为动态激活的虚假路径。
这种路径不应该被声明为虚假路径
d. 时序的虚假路径
时序的虚假路径是设计中存在的路径,并且可以被激活,但是设计人员选择不去定时他们,比如:
- 设计包含配置寄存器 – 在初始化时序电路期间被初始化,此后保持一个静态值,并且寄存器时序不是设计人员关心的;
- 异步信号的路径 – 比如复位,在最开始时,需要复位达到寄存器的固定值,之后这个路径就不需要定时了;或者构建跨越异步域
e. 基于总线协议的虚假路径
比如多个slv和一个master互信,但slv之间并无互信,此时slv之间就可以设置双向false
f. 虚拟时钟和真实时钟之间的虚假路径
缺少文档图
假设这个设计, F1的结果被F3采集,F2的结果被F4采集,这里O1就需要针对clk1和clk2分别指定out_delay;这里就有4个path:
- F1/CLK1 -> O1/CLK1 out_delay;
- F1/CLK1 -> O1/CLK2 out_delay;
- F2/CLK2 -> O1/CLK1 out_delay;
- F2/CLK2 -> O1/CLK2 out_delay;
这里path2/path3其实是假的,我们不关注的。但是如果我们采用:
Set_false_path -from clk1 -to clk2
这里有个大问题:
如果这么设置,那么所有设计中的clk1和clk2之间的路径都不会被check。
好的做法:
通常的做法是创建对应于时钟clk1/clk2的虚拟时钟 ,并相对于虚拟时钟来设置delay和虚拟路径
g. set_disable_timing
缺少环路图示
这里存在一个环路,B出发再回到B,一般工具都会自己断开这种环路,但是如果工具断开的不好,比如从n1断开,这其实可能就不好了,B->C之间就不会check了。
所以可以采用set_disable_timing来自行打断路径。
Set_disable_timing和set_false_path的差异是:
后者只是阻止该路径的时序,但是延迟计算不会停止;
但是前者,路径本身会直接从时序分析中移除
h. 虚假路径问题
在执行虚假路径的注意事项:
a. 不要使用通配符;
b. 当使用through时,需要关注through是不是冗余的;
c. 不要在同一路径或者路径线段上设置不同种类的约束;
d. set_false_path,需要相关约束;
e. 常见的false path包含:
1. 逻辑上不可能存在的路径;
2. 跨时钟域信号经过通路的地方 - max_delay可能更合适;
3. 上电后,只需要写一次的路径;
4. 复位或者测试逻辑
//对于reset, 如果在工作时,reset信号有效时,时钟信号不翻转,可以用false path, 否则不可以
// 一般异步复位可以设置false path, 但是当异步复位被时钟捕获之后再对应时钟域中使用时,就不能设false path
5. 异步分布式RAM的写入时钟和异步读取时钟之间的路径