02 时钟约束
0赞继上面介绍了setup文件的基本书写,简单介绍下时钟设置及简单地时序,面积,PVT设置约束。
DC的约束是基于路径的,这里所谓的路径起点是input port或者clock port of flip-flop或者纯组合逻辑的寄存器输入,终点是output port或者任意时序逻辑的输入.
时钟:
虽然DC无法最终综合时钟树,但是我们可以加入一些约束让pre-layout的时钟更加接近实际的工作情况。
可以通过create_clock –period 10 [get_ports clk1]建立时钟,这句话意思是建立一个名为clk周期为10单位的时钟,这里的单位一般是ns,可以通过list_lib查看。这句命令默认占空比50%。
如想设置其他占空比为create_clock –period 10 –waveform {0 3} [get_prots clk2].这行命令设置占空比为3:7(第一个为上升沿时间,第二个为下降沿时间,类推第三个还是上升沿,第四个下降沿 不过一般因为此类震荡器很难实现很少用了)。
设置虚拟时钟creat_clock –period 2 –name v_clk ;#即不定义port
分频时钟约束:
Create_generated_clock –name div2clk –divide_by 2 –source [get_ports clk] [get_pins ……/Q]
当纯组合逻辑时就要设置虚拟时钟,
create_clock –name clk2 –period 10
对于一个实际的时钟网络,最重要的两个属性就是时钟的传播延时和时钟的不确定性。
时钟的传播延时包括时钟源的延时和时钟网络的延时。传播延迟对周期无影响
时钟源的延时是指系统上时钟产生点到设计中时钟定义点(电路端口)的延时:set_clock_latency-source 1 [get_clocks Clk_fc4]
时钟网络的延时是从时钟定义点到寄存器时钟管脚的延时:
set_clock_latency 1 [get_clocks Clk_fc4]
//以上两组数据,可咨询板级工程师和APR工程师。
时钟的不稳定性为:
set_clock_transition 0.01 [gets_clocks fc4]#将ideal时钟模拟成有一定斜率的上升沿下降沿时钟。
set_clock_uncertainty-setup 0.5 [get_clocks fc4]给该时钟的时钟沿一个不确定的范围,使DC对于建立时间提前0.5ns检查,
set_clock_uncertainty –hold 0.3 [get_clocks_fc4],对于保持时间推后0.3ns检查。通过设定相应的约束来近似模拟时钟的这种不确定性。
preCTS的setup:uncertainty = PLL jitter +预估的clock skew
时钟偏移(clock skew),即时钟的不确定性是指在一个时钟域或时钟域间寄存器时钟管脚到达时间的最大差别。
如果已经从后端CTS的获取了准确的时钟树参数,那么可以用set_propagated_clock [get_clocks Clk_fc4],此时source latency还是依旧要有的。
综上可知:
版图前:
为了在版图前模拟真实环境,必须提前时钟延迟和时钟偏移。
Create_clock –period 40 –waveform {0 20} Clk
Set_clock_latency2.5 Clk
Set_clock_uncertainty –setup 0.5 –hold 0.25 Clk
Set_clock_transition0.1 Clk
Set_dont_touch_network Clk
版图后:
定义版图后的约束相对来说比较简单,因为布了时钟树以后有了真正的时钟延时和时钟偏移,并且这两项可以直接反标给DC,因此就不用在脚本里面再去定义了。
Create_clock –period 40 –waveform {0 20} Clk
Set_propagated_clock [all_clocks]
Set_clock_uncertainty –setup 0.5 –hold 0.25 Clk
Set_dont_touch_network Clk
注意到版图前后的变化,没有set_clock_latency而增加了set_propagated_clock命令。因为在网表中插入了时钟树,应该是传播时钟信号而不是将它调整到一个值。同样,也不再需要set_clock_transition命令,因为DC计算时钟网络的输入转换时间是根据实际的时钟树。除此之外,小的时钟偏移的值也可以定义,保证设计在工艺变化时候的健壮性。
另外由于pre-layout时得不到准确的时钟参数,所以此时不对clocks进行综合,因此用命令set_dont_touch_network [get_ports clk1]实现上述要求(且默认此时clock为ideal,驱动能力无限大 无上升沿下降沿。下面会进行一定的预估值)。也可以在以后得对ports命令中set_input_delay 0.1 -max -clock Clk [remove_from_collection [all_inputs] [get_ports Clk]]进行设置。
以上的命令均是单时钟单沿触发。特殊情况还有同步多时钟、异步多时钟、多周期路径。
这里同样指出,在逻辑实现时,时钟单独封装成一个模块最好,不然做综合和PR的人会……
以上约束全部为同一时钟的上升沿触发,如果遇到以下问题:
1.下降沿触发 这样留给一个时钟域中的负沿寄存器只有半个周期,此时约束就要改为set_input_delay –max ** -clock_fall [get_ports clk]。output_delay亦如此
2.对于一个输入端口有两个不同的输入 需要先input_delay普通约束一下,再在input_delay加上–add_delay表示有两个输入,DC会自动进行两次计算比较。 如果第二条命令不加-add_delay会覆盖掉上一个约束命令。
3.set_clock_group –logically_exclusive –group clk1 –group clk2逻辑互斥,即不同时工作
4.set_clock_group –asynchronos –group clk1 –group clk2异步时钟约束
5.set_false_path –from [get_clocks clk1] –to [get_clocks clk2]\
set_false_path –from [get_clocks clk2] –to[get_clocks clk1]伪路径 即不需要考虑这两个异步时钟之间的时序约束路径。
对于异步电路正确的处理方式是对于任何跨越异步边界的路径,禁止时序分析。
这个命令能够忽略该路径上的时序约束,一般用于异步电路和没有逻辑和功能意义的路径。将一条路径设为伪路径后,原来施加给它的时序约束将不再存在。静态时序分析工具可能还会计算这条路径上的延时,但不管路径上的延时多大,都不再报错。
6.set_multicycle_path 3 –setup –from [get_cells FF1] –to [get_cells FF2]三周期路径
这样设置建立时间的约束计算将按预期进行,但是保持时间(hold)的约束计算默认条件下将位置定在了参考位置的前一个有效沿上,然而,事实上设计者需要DC将hold约束计算的有效沿参考位置选定在数据发送沿的时刻,因此需要另一条语句告诉DC将参考位置向前推两个周期。
set_multicycle_path 2 –hold –from [get_cells FF1] –to [get_cells FF2]
需要特别注意的是,对某条路径设置为多周期路径后,该路径将随之建立起新的建立时间和保持时间关系。如果时序例外命令加的不对也没有警告提示。因此可以用check_timing检查,并用report_timing_requirements –ignored查看详细信息。
设计者可以使用有关约束命令来强行设定某些路径上的最大、最小时序要求。set_max_delay,set_min_delay
该命令常用来约束组合路径或者跨越异步边界的路径。