注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!
用dc综合过程中需要对输入输出端口进行约束。
一般的约束出发点有两种,一种是dc,一种是ac。
所谓的dc是指已知输入延迟,或者输出延迟。这个要从系统考虑。
所谓的ac是指输入输出延迟未知,但是知道器件输入需要的保持,建立时间的关系。
下面我们看下对于输入,根据dc,ac如何约束。
1.DC
如果我们知道Tdelay的max,min那么很容易的写出约束
set_input_delay -max Tmax -clock Clk DIN
set_input_delay -min Tmin -clock Clk DIN
但是如果我们不知道输入延迟的最大最小值。那么如何约束呢。
先看下最大最小延迟对于器件的建立,保持检查起到的影响
如上图所示:Tdelay_min对信号的影响可用从T3出看出。
Tdelay_max对信号的影响可用从T1处看出。
所以信号的变化只能在斜线的阴影区。
2.AC
基于上图的认识,如果我们对于设计的芯片的输入信号的建立,保持有所了解。
可用使用AC来约束,如上图,我们知道对输入信号的要求是建立要在Setup之前,
保持要在Hold之后。那么约束可用写成:
set_input_delay -max Tperiod-Setup -clock Clk DIN
set_input_delay -min Hold -clock Clk DIN
再看下对于输出,根据dc,ac如何约束。
1.DC
如果我们知道pcb板上信号延迟的最大,最小,也很容易写出约束。
(这里的最大最小延迟仅指路径上的信号延迟,不包含器件如上图中D2本身的建立时间,保持时间要求,
所以设置约束的时候要主意下)
set_output_delay -max Tdelay_max + Tsetup -clock Clk DOUT
set_output_delay -min Tdelay_min - Thold -clock Clk DOUT
下面再看下输出最大最小延迟对于建立,保持检查起到的影响
如上图所示,最大延迟影响如T1所示,最小延迟影响如T3所示,这里假设器件的setup,hold均为0,可用容易理解。
这里要主意,最小延迟的影响,因为任何延迟都会满足要求。最小延迟影响,要求信号在细条阴影区变化,但是考虑到launch边沿在T2,
所以信号的允许变化范围如阴影区显示(大条)。
2.AC
但是通常设计的chip外接可能还是chip或者其他器件,这些器件都有建立,保持要求。
所以如果上图的时序改成下面这种基于外围器件的建立,保持要求的。则更为理解。
约束也就相应的改成:
set_output_delay -max Setup -clock Clk DOUT
set_output_delay -min -Hold -clock Clk DOUT
如果注意观察就会发现上如对于信号的要求都是要求信号在相关时钟沿附件保持稳定。
有的时候我们要求信号在相关时钟沿附近是需要变化的。
这里要用到零多周期路径。
下面看下对于一般的单周期路径,如何写成多周期路径
那么如果对于零多周期路径,建立,保持如何检查:
当设置set_multicycle_path -setup 0 的检查如下:
当再次设置set_multicycle_cycle -hold -1 ..时序检查如下:
再如下图,我们要求信号在S1,H1区域内变化。
如何约束呢。
首先是设置0多周期路径。
set_multicycle_path -setup 0 .....
set_multicycle_path -hold -1 .....
然后根据要求设置最大最小延迟。
有了上面的认识,我们大约可用了解:
如果设置了最大延迟,那么信号只能在最大延迟前变化,
如果设置了最小延迟,那么信号只能在最小延迟后变化。
所以我们设置成:
set_output_delay -max -S1 .....
set_output_delay -min H1 .....
注意符号:)
接着我们来考虑下源同步接口,所谓源同步接口就是输入输出带有时钟线。
同时数据的变化和时钟沿对齐(或上升沿,或下降沿,或双沿)。
如下图,单边沿对齐的源同步接口。数据DQ和时钟SCK对齐,CAC地址控制信号
当然我们不知道pcb走线延迟,但是我们知道链接的器件的建立,保持要求分别为Th_ext,Ts_ext
我们自己chip的建立保持要求为Th,Ts
我们可用约束如下:
create_generated_clock -name clkx1 -multiply_by 1 -source clk PLL/clkx1
create_generated_clock -name SCK -divide_by 1 -source PLL/clkx1 SCK
set_input_delay -max T-Ts -clock clkx1 DQ
set_input_delay -min Th -clock clkx1 DQ
set_output_delay -max Ts_ext -clock SCK {DQ CAC}
set_output_delay -min -Th_ext -clock SCK {DQ CAC}
如果数据和时钟是双边沿对齐的,建立,保持条件如上,同时下降沿和上升沿要求一样。
create_generated_clock -name clkx1 -multiply_by 1 -source clk PLL/clkx1
create_generated_clock -name SCK -divide_by 1 -source PLL/clkx1 SCK
set_output_delay -max Ts_ext -clock SCK CAC
set_output_delay -min -Th_ext -clock SCK CAC
set_input_delay -max T-Ts -clock clkx1 {DQ DQS}
set_input_delay -max T-Ts -add_delay -clock clkx1 -clock_fall clkx1 {DQ DQS}
set_input_delay -min Th -clock clkx1 {DQ DQS}
set_input_delay -min Th -add_delay -clock clkx1 -clock_fall clkx1 {DQ DQS}
set_output_delay -max Ts_ext -clock SCK {DQ DQS}
set_output_delay -max Ts_ext -add_delay -clock SCK -clock_fall {DQ DQS}
set_output_delay -min -Th_ext -clock SCK {DQ DQS}
set_output_delay -min -Th_ext -add_delay -clock SCK -clock_fall {DQ DQS}