目錄
一、前言
二、設計示例
2.1 示例代碼
2.2 時序約束
三、Set_min_delay
3.1 start points
3.1.1 對象有效性
3.1.2 邊沿有效性
3.1.3 start point非有效起點
3.2 Through?points
3.2.1?約束對象為Cells
3.2.2 約束對象為Cell pin/Net
3.3 to points
3.4?rise/fall
3.5?Reset path
3.6?多對象設置
?3.7?Max_delay 與?Min_deay
一、前言
????關于Set_max_delay/Set_min_delay的基礎用法之前的文章已進行過簡單的介紹,主要作用就是修改時序路徑默認的setup/recovery或hold/removal時間要求,本章將對約束Set_min_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
endalways@(posedge clk2,negedge ce)
begin
if(!ce)
ff2<=0;
else begin
ff2<=ff1;
end
endassign bus=ff2+ff1;
always@(posedge clk2)
begin
if(!ce)ff3<=0;else beginff3<=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_min_delay
Set_min_delay約束的設置中,不僅可以指定起點,中間點,終點,還可以設置對應單元生效的上升沿或下降沿,生成時序報告時建議將配置nworst和max path設大,可報告出所有路徑
3.1 start points
start points為set_mix_delay約束的時序路徑起點,需為時序路徑的有效起點,可為Clock,Cell,Cells pin,IO port
3.1.1 對象有效性
以clock為clk2為例,設置約束如下
set_min_delay -rise_from [get_clocks clk2] 1.111
只有以clk2為源時鐘,并且上升沿觸發的時序路徑約束才會生效
源時鐘為clk1,目的時鐘為clk2的不屬于約束范圍
3.1.2 邊沿有效性
對源時鐘為clk1,下降沿的路徑設置min_delay
set_min_delay -fall_from [get_clocks clk1] 1.111
下面ff1_reg到ff2_reg的路徑因為clk1為上升沿,因此min_delay約束不生效
將約束設置為clk1的上升沿有效
set_min_delay -rise_from [get_clocks clk1] 1.111
此時約束生效
3.1.3 start point非有效起點
將ff1_reg/D設置為min_delay的起點,因為ff1_reg/D不是有效的時序路徑起點,約束不會生效
set_min_delay -from [get_pins ff1_reg/D] 1.111
同時有對應的告警
如果將ff1_reg/C設置為max_delay的起點,同時上升沿有效
set_min_delay -rise_from [get_pins ff1_reg/C] 1.111
以path29的結果看出,符合上述約束條件,因此約束生效
3.2 Through?points
3.2.1?約束對象為Cells
約束對象為Cell時,設置的Transition邊沿是直接對該單元的相應邊沿生效,查看的路徑都是ff1_reg到ff3_reg的時序路徑
a)以經過中間的組合邏輯ff3_i_1(LUT2)為例,Transition默認為rise/fall,即上升沿下降沿都支持,在Transition為默認值時,約束命令如下
set_min_delay -through [get_cells ff3_i_1] 1.111
查看對應的時序報告結果,此時ff3_i_1使用為上升沿時約束生效
查看ff3_i_1為下降沿時的路徑,約束依舊生效
b)修改約束,指定Transition為下降沿fall_through
set_min_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_min_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_min_delay -rise -from [get_clocks clk1] 2.222
第29號路徑生效,對應data path中ff2_reg/D的邊沿為上升沿
第17號路徑中,data path中 ff2_reg/D的邊沿為下降沿,故不生效
3.5?Reset path
Set min?delay約束中存在一個配置項"Remove existing path exceptions before setting path delays",即約束的路徑上如果已存在max_delay時序約束時是否被新的覆蓋
以如下兩條約束為例,
set_min_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_min_delay -from [get_clocks clk1] 2.222
第二條max_delay無reset_path時,盡管第二條是后加的,但生效的是第一條約束1.111
如果第二條約束添加-reset_path,則會覆蓋第一條的約束
set_min_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_min_delay -reset_path -from [get_clocks clk1] 2.222
報告結果如下圖
3.6?多對象設置
????start/through/to中也可以同時設置多個對象,將同時生效。如下圖中對from為ff1_reg/C和ff2_reg/C的時序路徑都設置max delay為2.222ns
set_min_delay -from [get_pins {ff1_reg/C ff2_reg/C}] 2.222
相關路徑都將生效
?3.7?Max_delay 與?Min_deay
set_max_delay和set_min_delay的使用較多共同之處,下面對其它們的特點進行總結
1)set_max_delay為約束setup/recovery的requirement時間,set_min_delay為約束hold/removal的requirement時間,二者相互獨立
2)set_max_delay支持通過設置datapath only只考慮發起時鐘的數據路徑延遲,set_min_delay不支持
3)set_max_delay如果設置了datapath only,則不會對對應的路徑進行hold分析,即不存在hold路徑
4)set_max_delay如果設置了datapath only,必須設置from對象
5)set_max_delay/set_min_delay不適合用于輸入端口/輸出端口到對應時序單元的路徑約束,輸入端口/輸出端口的約束應使用set_input_delay/set_output_delay
6)set_max_delay/set_min_delay如果約束的不是有效的起點或終點,會出現時序分段現象,即該位置的前面(from)或后面(to)的時序傳播會斷開,使約束的位置稱為有效的起點或終點,其他經過約束位置的路徑全部受影響