数字IC设计学习笔记
多时钟域 Timing分析 (timing cross clock domain)
1. 慢时钟域到快时钟域
2. 快时钟域到慢时钟域
1. 慢时钟域到快时钟域
- Launch:对原时钟做了4分频/频率变成4倍,周期减少到1/4
- 分频电路,这种情况,1. 定义为generated clock;2. 定义为两个时钟
脚本:
- Create_clock -name CLKM\ -period 20 -waveform {0 10} [get_ports CLKM]
Create_clock -name CLKP\ -period 4 -waveform {0 2.5} [get_ports CLKP]
时序图
时序报告
Setup检查
- Launch path
-
Capture path
Hold time检查
-
Hold time: 在setup检查边沿的前一个时钟周期的上升沿
-
注意:如果用一个快时钟的一个周期的时序要求慢时钟的数据,是不合理的。所以我们设置多周期路径,快时钟在第四个时钟周期检查setup
脚本:Set_multicycle_path 4 -setup\ -from [get_clocks CLM] -to
[get_clocks CLKP] -end -
针对于慢时钟域到快时钟域,快时钟时接收数据端,所以约束-end
时序图
- 在快时钟的第四个上升沿检查setup,这样组合逻辑的延迟就可以为1个clock
cycle,就不需要那么严苛,相对合理。在setup检查边沿的前一个时钟周期的上升沿,检查hold。
时序报告
Setup检查
- Launch path
- Capture path
Hold检查
-
Launch path
-
Capture path
注意:
- 这种情况下,setup的约束时不合理的,因为数据最长的,我们可以让它慢一点,最短的,其实很短,就比0多一点点,这样如果我们用15约束hold
time,是不合理的,所以我们想办法,让hold time检查的边沿,也挪到0,也就是在
setup检查边沿再向前挪N-1个时钟周期;这样就相对合理很多,所以在约束hold时,可以约束到N-1。
脚本:
- Set_multicycle_path 3 -hold \ -from [get_clocks CLKM] -to [get_clocks
CLKP] -end;
时序图
总结:
- 对于从慢时钟域到快时钟域的这种多时钟域下的静态时序分析检查,一定要指定第N个时钟周期为setup检查沿,在默认的hold检查边沿,向前N-1个时钟周期,进行hold检查。
2. 快时钟域到慢时钟域
脚本:
- Create_clock -name CLKM \ -period 20 -waveform {0 10} [get_pots CLKM]
Create_clock -name CLKP \ -period 5 -waveform {0 2.5} [get_pots CLKP]
时序图
- 最严苛的情况:launch edge在setup4,到capture的setup检查边沿只有1个fast clock cycle;hold检查在setup检查前1个slow clock cycle的上升沿。
时序报告
Setup检查
- Capture path
- Launch path
Hold检查
- Capture path
- Launch path
注意:
- 实际上,这种情况,对于慢时钟来说,也是比较苛刻的,不合理的;
改进:
- 针对于快时钟,设置多周期路径-start
脚本:
- *Set_multicycle_path 2 -setup\ -from [get_clocks CLKP] -to [get_clocks CLKM] -start
- Set_multicycle_path 1 -hold\ -from [get_clocks CLKP] -to [get_clocks CLKM] -start*
时序图
时序报告
Setup检查
- Launch path
- Capture path
Hold检查
- Launch path
- Capture path
总结:
- 对于从慢时钟域到快时钟域的这种多时钟域下的静态时序分析检查,setup检查:一定要指定launch edge为fast clock 的第N个时钟周期,capture edge为slow clock的第二个时钟周期的上升沿;hold检查:在默认的hold检查边沿,向前N-1个时钟周期,进行hold检查。
[参考资料]
- 邸志雄老师的课件
- 集成电路静态时序分析与建模
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~