目录
一、前言
关于Set_max_delay/Set_min_delay的基础用法之前的文章已进行过简单的介绍,主要作用就是修改时序路径默认的setup/recovery或hold/removal时间要求,本章将对约束Set_max_delay的一些细节使用进行解释。
二、设计示例
以一个简单的3个触发器为例,包含同步时钟路径和异步时钟路径,以异步时钟路径为主
2.1 示例代码
module MAX_MIN(d1,clk1,clk2,ce,ff3);
input d1,clk1,clk2,ce;
output ff3;
reg ff1,ff2,ff3;
wire bus;
always@(posedge clk1,negedge ce)
begin
if(!ce)
begin
ff1<=0;
end
else begin
ff1<=d1;
end
end
always@(posedge clk2,negedge ce)
begin
if(!ce)
ff2<=0;
else begin
ff2<=ff1;
end
end
assign bus=ff2+ff1;
always@(posedge clk2)
begin
if(!ce)
ff3<=0;
else begin
ff3<=bus;
end
end
endmodule
连接关系如下图,clk1中同步时序路径下,ff1_reg到ff2_reg,clk1与clk2的异步时序路径中,ff1_reg和ff2_reg逻辑运算后输出到ff3_reg
2.2 时序约束
此处主要是主时钟约束
create_clock -period 10.000 -name clk1 -waveform {0.000 5.000} -add [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} -add [get_ports clk2]
三、Set_max_delay
Set_max_delay约束的设置中,不仅可以指定起点,中间点,终点,还可以设置对应单元生效的上升沿或下降沿,生成时序报告时建议将配置nworst和max path设大,可报告出所有路径
3.1 start points
start points为set_max_delay约束的时序路径起点,需为时序路径的有效起点,可为Clock,Cell,Cells pin,IO port
3.1.1 对象有效性
以clock为clk2为例,设置约束如下
set_max_delay -rise_from [get_clocks clk2] 1.111
只有以clk2为源时钟,并且上升沿触发的时序路径约束才会生效
源时钟为clk1,目的时钟为clk2的不属于约束范围
3.1.2 边沿有效性
对源时钟为clk1,下降沿的路径设置max_delay
set_max_delay -fall_from [get_clocks clk1] 1.111
下面ff1_reg到ff2_reg的路径因为clk1为上升沿有效,因此max_delay约束不生效
将约束设置为clk1的上升沿有效
set_max_delay -rise_from [get_clocks clk1] 1.111
此时约束生效
3.1.3 start point非有效起点
将ff1_reg/D设置为max_delay的起点,因为ff1_reg/D不是有效的时序路径起点,约束不会生效
set_max_delay -from [get_pins ff1_reg/D] 1.111
同时有对应的告警
如果将ff1_reg/C设置为max_delay的起点,同时上升沿有效
set_max_delay -rise_from [get_pins ff1_reg/C] 1.111
以path17的结果看出,符合上述约束条件,因此约束生效
约束的对象如果非时序路径的有效起点时,会导致路径分段
3.2 Through points
3.2.1 约束对象为Cells
约束对象为Cell时,设置的Transition边沿是直接对该单元的相应边沿生效,查看的路径都是ff1_reg到ff3_reg的时序路径
a)以经过中间的组合逻辑ff3_i_1(LUT2)为例,Transition默认为rise/fall,即上升沿下降沿都支持,在Transition为默认值时,约束命令如下
set_max_delay -through [get_cells ff3_i_1] 1.111
查看对应的时序报告结果,此时ff3_i_1使用为上升沿时约束生效
查看ff3_i_1为下降沿时的路径,约束依旧生效
b)修改约束,指定Transition为下降沿fall_through
set_max_delay -fall_through [get_cells ff3_i_1] 1.111
此时时序路径中ff3_i_1为下降沿的4条路径,约束生效
ff1_reg到ff3_reg的另外4条路径中因为ff3_i_1为上升沿,故约束不生效
3.2.2 约束对象为Cell pin/Net
当through point的对象更加具体,如为pin时,此时Transition是体现在对应对象的时序边沿上
a)修改约束对象为pin,指定ff3_i_1/I0为下降沿fall_through
set_max_delay -fall_through [get_pins ff3_i_1/I0] 1.111
时序报告中,ff2_reg到ff3_reg中约束生效的4条路径中,ff3_i_1前面连接的ff2_reg都为下降沿触发
对于另外4条ff2_reg到ff3_reg约束未生效的的时序路径中,ff2_reg为上升沿触发,故不属于约束生效的范围
3.3 to points
to points的与start points的使用相同,可参见start piont的介绍
3.4 rise/fall
在options中勾选Only rising/falljing path delays are to be constrained,下拉框中选择rising/falling可对约束路径设置边沿生效,边沿为终点数据端口的边沿
以下列约束rise为例
set_max_delay -rise -from [get_clocks clk1] 2.222
第20号路径生效,对应data path中ff2_reg/D的边沿为上升沿
第17号路径中,data path中 ff2_reg/D的边沿为下降沿,故不生效
3.5 only datapath
勾选set maximum delay for only the datapath时,将不会考虑发起时钟和捕获时钟间的skew和hold检查。带有only the datapath设置时必须指定from对象
示例约束如下
set_max_delay -datapath_only -from [get_clocks clk1] 1.111
报告如下,无source clock path,无对应的hold分析,只有setup
因为不考虑source clock path,故没有skew
3.6 Reset path
Set max delay约束中存在一个配置项"Remove existing path exceptions before setting path delays",即约束的路径上如果已存在max_delay时序约束时是否被新的覆盖
以如下两条约束为例,
set_max_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_max_delay -from [get_clocks clk1] 2.222
第二条max_delay无reset_path时,尽管第二条是后加的,但生效的是第一条约束1.111
如果第二条约束添加-reset_path,则会覆盖第一条的约束
set_max_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_max_delay -reset_path -from [get_clocks clk1] 2.222
报告结果如下图
3.7 多对象设置
start/through/to中也可以同时设置多个对象,将同时生效。如下图中对from为ff1_reg/C和ff2_reg/C的时序路径都设置max delay为2.222ns
set_max_delay -from [get_pins {ff1_reg/C ff2_reg/C}] 2.222
相关路径都将生效