数字逻辑综合工具实践-DC-10——CDC约束
【分频时钟input delay】
(找短的间隔)
【多时钟output delay】
记得要用add_delay
也是找短的
【时钟之间的uncertainty】
模仿两个时钟之间的偏移量
要用-from -to指定两个clock(注意是get_clocks而不是ports)
(千万不要在模块内部写分频时钟!
在SOC系统里面,会有一个模块叫CRM(clock reset manager)(或者CRC clock reset controller)时钟复位管理电路,所有的时钟、复位都由它产生。PLL经过分频之后给这个模块,外部复位电路接进来给这个模块之后,由它统一产生时钟和复位。)
指定创建一个分频时钟:create_generated_clock
-source:分频时钟的源是什么
注意这里要用到get_pins。问题:
这里的get_pins是如何知道名字的?
在我们的unmapped目录下保存的.ddc文件里面有!
对于Designware网表格式里面器件的命名方式是有一些规则的。
生成的寄存器往往是RTL代码里写的加上后缀”_reg”,寄存器的输出为Q
【逻辑互斥时钟】
DC不知道这两条交叉的路径从逻辑上是不存在的,这时候就要人为地设置伪路径:
set_false_path -from [get_clocks ####] -to [get_clocks ####]
或者使用逻辑互斥时钟命令:
set_clock_groups -logically_exclusive -group #### -grpi[ ####
如果不同时钟的信号在design内部有交互,就不能再用set_false_path命令了
希望DC:前面的优化还是要做的,后面的优化不必要做。
——约束得更紧一些,限定一个范围,-though。
【多时钟可选的寄存器】
对DC来说,有两个clock,默认情况下,DC会假设几种情况:
1、 CLK1发,CLK1采
2、 CLK1发,CLK2采
3、 CLK2发,CLK1采
4、 CLK2发,CLK2采
但实际只有1、4两种情况
还是通过上面那条命令:set_clock_groups -logically_exclusive -group #### -group ####
这里有个细节:set_app_var timing_enable_multiple_clocks_per_reg true——允许多个时钟。
DC默认寄存器只有是一个时钟。
【异步时钟】
两个时钟没有什么相位关系。
异步时钟如何去约束?
如果不做任何约束,DC会对跨时钟域的组合逻辑做优化(DC会做最悲观的预计),但是这样的优化是没有什么意义的。
通过异步设置:set_clock_groups -asynchronous -group #### -group ####(DC你别做,我自己来搞)
set_false_path 也可以
在设置-from -to的时候,如果异步时钟比较多,就不要去一个个地敲了,用foreach_in_collection函数。
【多周期路径】
通过设置一个多周期路径set_multicycle_path -setup 6 -from … -to …
(过六个周期再做setup time的检查)
一条语句是不够的,默认会在50的时候做hold time violation的检查,也就是说,组合逻辑的延迟必须在50到60之间,如果不够的话,会插入很多的Buffer(有可能是一个很复杂的逻辑),这其实是不必要的。
-hold 5表示从后往前数5个
仅仅通过约束来做holdtime violation是不够的。原因:
一定要在代码中用相应的控制信号。不然Y会采到很多的没用的信号。
需要一个使能信号,经过一个移位寄存器。
下面的移位寄存器的作用是产生这个使能信号。
另一个例子:
【一个很重要的命令:report_timing_requirements -ignored】
设置了逻辑伪路径、multicycle_path等等,都属于异常路径,要通过这个命令查看异常的路径(timing exception)是不是你想要的,否则的话有可能约束会加错。
【【实践演示】】
false path
multicyclepath
report_timing_requirements