1问题背景
模拟 ip lib 内部 ADC 的时序建模数模接口时序路径,是模拟IP内的ADC2数字域的第一级寄存器(ff1 reg)。时钟是ADC时钟,时钟source点是模拟IP内的grp pin(对应模拟IP内PLL的输出端)。时钟频率是2GHz(时钟周期是500ps)。
这个数模接口路径设计模拟IP内的三段延迟。一是grp pin到模拟IP dataout pin的组合逻辑时序弧延迟(delay1)。二是grp pin到ADC的时钟延迟(delay2)。三是grp pin到模拟IP的clockout pin的时钟逻辑时序弧延迟(delay3)。
ADC内部采样时钟属于模拟时钟,不参与数字CTS,延时固定封装在黑盒模型(模拟ip的lib文件,由模拟设计工程师提供),这个值一般比较小,几乎可以忽略。
2数模接口hold违例
假设delay1是350ps,delay2是0ps,delay3是100ps,ADC2ff1reg上在数字域还有少量组合逻辑(假设其为delay4,假设其值为0ps),ADC时钟周期是500ps,数字域cts后时钟latency大概是600ps左右。
根据setup和hold计算公式大概判断,默认情况下setup slack大概为700ps左右;hold slack大概为-300ps。
这种情况下,hold是能修的,因为有setup余量。但是数模接口上时序路径很多,hold违例很多,如果硬修,数模边界附近hold buffer可能会插爆,local density爆表。
3同沿检查
多周期检查。
此时的multicycle默认设置如下(单周期路径默认关系):
set_multicycle_path 1 -setup -from CLK1 -to CLK2
set_multicycle_path 0 -hold -from CLK1 -to CLK2
即默认情况下:setup检查是从launch_clk的一个上升沿到capture_clk的下一个上升沿,hold检查是从launch_clk的一个上升沿到capture_clk的捕获沿的前一个沿。-hold默认移动launch_clk,-setup默认移动capture_clk。
所以在数模接口时序路径上采用了一种特殊约束,0周期约束(或者叫同沿检查)。
set_multicycle_path 0 -setup -from grp_pin -to ff1_reg/D
set_multicycle_path 0 -hold -from grp_pin -to ff1_reg/D
set_multicycle_path N -setup含义: setup 捕获沿相对默认单周期捕获沿向后偏移N个周期。默认单周期:-setup1→偏移1-1= 0,不偏移,标准单周期检查。
公式:setup捕获沿偏移量=N-1。 set_multicycle_path 0 -setup中 N=0,偏移量=0-1=-1 ,setup捕获沿向前移动1个时钟周期(往发射沿方向挪1拍),比默认单周期捕获沿早一个周期。 默认单周期:发射沿0→捕获沿1 。-setup 0:发射沿0→捕获沿0(同一个时钟沿做setup检查)。 这就是zero-cycle path(零周期路径)。
set_multicycle_path N -hold含义:hold检查是从launch_clk的一个上升沿到capture_clk的捕获沿的前的"N+1”个沿(默认就会移动一个沿),此处N为0意思就是把和setup检查对应的那个发射沿向右移动1个cycle。
4零周期检查下数模接口的时序
本来setup slack大约是700ps,0周期检查后,setup slack大约减少一个时钟周期为200ps。
本来hold slack大约为-300ps,0周期检查后,hold slack大约为+200ps。
通过0周期检查,将setup余量和hold余量进行置换了,不用插hold buffer了,皆大欢喜。
99