第十课
Multiple clocks and Exceptions
多时钟的处理;同步/异步时钟的区别,multi-cycle时钟等等。
Multiple synchronous clock designs
同步时钟:指所有的时钟来源于同一个晶振或者RC振荡电路,不同的时钟之间具有固定的相位关系。
异步时钟:不同的时钟来源于不同的时钟源,且它们之间没有固定的相位关系。
与异步时钟相关的关键词:异步FIFO、亚稳态、同步器等等。
- constraints
create_clock -period 3.0 -name CLKA
create_clock -period 2.0 [getports CLKC]
代码中分别设置了虚拟时钟和真实的时钟,DC默认两个时钟是同步的,异步时钟需要另外设置
**DC只对同步设计进行优化,对异步时钟优化时没有意义的。
对同步电路优化时,会计算两个时钟上升沿差别最小的时间(即最坏的状况),以此为前提计算延时。
注:在对不同时钟添加set_output_delay时也要添加-add_delay选项,否则后面的delay会覆盖前面的delay。
例:
set_output_delay -max 0.15 -clock CLKD [get_ports OUT1]
set_output_delay -max 0.52 -clock CLKE -add_delay [get_ports OUT1]
- set_clock_uncertainty
用于设置clock uncertainty发生在哪两个时钟信号之间:
set_clock_uncertanity -setup 0.15 -from [get_clocks Clk1] -to [get_clocks Clk2]
Generated clocks 分频
soc的分频必须要在专门的分频模块CRM(clock reset manager)当中完成,不能放在分模块中。
如下图所示是典型的二分频电路,若要生成分频电路需要用到专门的分频命令create_generated_clock:
create_generated_clock -divide_by 2 -name CK -source [get_ports CLK] [get_pins FF1/Q]
-divide_by后面是分频的数字,-name后面是分频后时钟的名字,-source后第一个括号表示来源时钟,第二个括号表示分频后的信号从哪一个输出产生。
Q:RTL代码层级下电路还未综合,要如何确定产生分频的pin名字?
A:先生成.ddc格式的GTECH网表文件,在网表中寻找对应单元的pin名字。
Mutually exclusive synchronous clocks
mutually exclusive:互相排斥的
如下图所示,两个时钟信号经过同一个端口,但是控制完全平行的后续电路:
由于DC默认设置的是同步时钟,软件会对所有同步时钟进行优化,因此为了避免不同频率时钟控制的电路被混合优化,需要使用 -logically_exclusive 逻辑互斥命令进行分组。
set_clock_groups -logically_exclusive -group CLK1 -group CLK2
但是只靠时钟分组命令会使DC对所有不同时钟的电路放弃优化,为了最大限度地令不需要逻辑互斥的电路优化,可以使用以下命令限制范围:
set_false_path -from [get_clocks CLK1] -through [get_ports out] -to [get_clocks CLK2]
set_false_path -from [get_clocks CLK2] -through [get_ports out] -to [get_clocks CLK1]
-through选项表示让DC判定只对通过某个路径/端口之后的电路逻辑互斥,之前的电路依然按照原有规则优化。
另外一种例子如下所示:
由于SEL端的控制,两个寄存器只会工作在相同的时钟域下,因此可以利用logical_exclusive命令排除跨时钟的选项。
set_clock_groups -logically_exclusive -group CLK1 -group CLK2
Asynchronous clock designs
跨时钟电路无法进行优化,因此需要人为标注异步时钟 -asynchronous:
set_clock_groups -asynchronous -group CLK1 -group CLK2
注:如果一个电路中有较多的异步时钟,可以用foreach循环进行两两互斥。
Multi-cycle Design
如下图所示的加法器需要六个时钟周期的时间完成运算:
这时可以用多周期命令set_multicycle_path添加约束:
set_multicycle_path -setup 6 -from {A_reg[*] B_reg[*]} -to C_reg[*]
-setup选项指定周期数,-from -to指定路径。
添加多周期约束后还需要补充holdtime的约束。
寄存器之间并不是逻辑越少越好,还需要保证holdtime的要求,必要时还可以插入buffer。
default hold check明显超过了真正需要的保持时间,需要命令去重新指定:
set_multicycle_path -hold 5 from {A_reg[*] B_reg[*]} -to C_reg[*]
-hold 5表明hold time violation的判定位置向前减少五个周期(从紫色箭头到黄色箭头)。
多周期的电路的正常工作不能只靠DC的约束优化,还要在代码和电路结构层面上进行配合。**需要加上移位器生成控制信号,读取加法器最后生成的结果。**多周期包含了多少个周期,控制信号就要延后多少个周期。
还可以配合-through选项只对某一路径添加多周期约束:
- 检查
即使添加错误的约束DC也不会提示报错,因此最后需要对异常路径进行检查。
所有的异常路径(包括false_path,分频,multicycle电路等等)都可以由以下命令显示,检查有无错误和遗漏:
report_timing_requirements -ignored
实例
两级同步器,dout_o是时钟域1的信号,q_d2是时钟域2的信号。