“OFFSET IN ”偏移約束是輸入偏移約束,有OFFSET_IN_AFTER 和OFFSET_IN_BEFORE 兩種,前者定義了輸入數據在有效時鐘到達多長時間后可以到達芯片的輸入管腳,這樣可以得到芯片內部的延遲上限,從而對那些與輸入引腳相連的組合邏輯進行約束;后者定義數據比相應的有效時鐘沿提前多少時間到來,是與其相連的組合邏輯的最大延時,否則在時鐘沿到來時,數據不穩定,會發生采樣錯誤。輸入偏移的時序關系如圖5-10所示。
?
圖5-10 輸入偏移的時序關系
例如:
NET“ DATA_IN” OFFSET = IN 10.0 BEFORE“ CLK_50MHz”;
表明在時鐘信號CLK_50MHz 上升沿到達前的10ns 內,輸入信號DATA_IN 必須到達數據輸入管腳。
NET“ DATA_IN” OFFSET = IN 10.0 AFTER“ CLK_50MHz”;
表明在時鐘信號CLK_50MHz 上升沿到達后的10ns 內,輸入信號DATA_IN 必須到達數據輸入管腳。
2)“OFFSET OUT”偏移約束
“OFFSET OUT”偏移約束是輸出偏移約束,有OFFSET_OUT_AFTER 和OFFSET_OUT_BEFORE 兩種,前者定義了輸出數據在有效時鐘沿之后多長時間穩定下來,是芯片內部輸出延時的上限;后者定義了在下一個時鐘信號到來之前多長時間必須輸出數據,是下一級邏輯建立時間的上限。輸出偏移的時序關系如圖5.3.11 所示。
?
圖5-11 輸出偏移的時序關系
例如:
NET“ DATA_OUT” OFFSET = OUT 10.0 BEFORE“ CLK_50MHz”;
表明在時鐘信號CLK_50MHz 上升沿到達前的10ns 內,輸出信號DATA_OUT 信號必須離開數據輸出管腳。
NET“ DATA_OUT” OFFSET = OUT 10.0 AFTER“ CLK_50MHz”;
表明在時鐘信號CLK_50MHz 上升沿到達后的10ns 內,輸出信號DATA_OUT 信號必須一直保持在數據輸出管腳上。
3.分組約束
分組約束可有效管理大量的觸發器、寄存器和存儲器單元,將其分為不同的組,每組附加各自的約束,在大型設計中有著廣泛的應用。
1)TNM/TNM_NET 約束
TNM/TNM_NET 約束用于選出可構成一個分組的元件,并對其重新命名,然后整體添加約束。除了IBUFG和BUFG 外,所有的FPGA 內部元件都可以用TNM 來命名,其語法規則為:
{NET|INST|PIN}“ ob_name” TNM =“ New_name”;
其中“ob_name”為NET、INST 以及PIN 的名稱,New_name 為分組的名稱。例如:
INST ff1 TNM = MY_FF1;
NIST ff2 TNM = MY_FF1;
將實例ff1 與ff2 添加到新分組MY_FF1 中。
此外,TNM 語法也支持通配符“?”和“*”,提高了在大規模設計中添加分組約束的效率。
當TNM 約束附加在線網上時,則該路徑上所有的同步元件都會被添加到分組中,但不會穿過IBUFG 組件;
當TNM 約束附加到宏或原語的管腳上,則被該引腳驅動的所有同步元件會被添加到新分組中;當TNM 約束附加到原語或宏上,則將原語或宏添加到新的分組中。
TNM_NET 約束專門用來完成網線的分組,與TNM 不同的是,TNM 可以穿越IBUFG/BUFG。因此,如果把TNM 約束添加到端口上,則只能定義該端口;而要是把TNM_NET 添加到端口上,則可穿越BUFG,受該端口驅動的所有組件都將被添加到分組中。
2)TIMEGRP 約束
TIMEGRP 用于分組合并和拆分,將多個分組形成一個新的分組。其合并分組的語法為:
TIMEGRP“ New_group” =“ Old_group1” “ Old_group2” … ;
其中,New_group 為新建的分組,而Old_group1 和Old_group2 以及…為要合并的已有分組。
拆分分組的語法為:
TIMEGRP“ New_group” =“ Old_group1” EXCEPT“ Old_group2”;
其中Old_group2 是Old_group1 的子集,New_group 為Old_group1 中除去Old_group2 之外所有的部分。
3)TPSYNC 約束
TPSYNC 用于將那些不是管腳和同步元件的組件定義成同步元件,以便可以利用任意點來作為時序規范的終點和起點。其相應的語法為:
{NET|INST|PIN}“ ob_name” TPSYNC=“ New_part”;
將TPSYNC 約束附加在網線上,則該網線的驅動源為同步點;附加在同步元件的輸出管腳上,則同步元件中驅動該管腳的源為同步點;附加在同步元件上,則輸出管腳為同步點;附加在同步元件的輸入管腳上,則該引腳被定義成同步點。
4)TPTHRU 約束
TPTHRU 用于定義一個或一組路徑上的關鍵點,可使用戶定義出任意期望的路徑。其相應的語法為:
{NET|INST|PIN}“ ob_name” TPTHRU =“ New_name”;
例如,在圖5-12 所示場景中,從A1 到A2 有兩條路徑,其中邏輯1 的延遲很大,需要提取出來完成特定的約束:
?
圖5-12 TPTHRU約束示例場景
INST“ A1” TNM =“ S”;
INST“ A2” TNM =“ E”;
NET“ A1toA2_1” TPTHRU =“ M”;
TIMESPEC“ SME” = FROM“ S” THRU“ M” TO“ B” 10;
其中第三句指令利用TPTHRU 定義了中間點“M”,然后第4 句在此基礎上定義了通過M 點的整條路徑,從兩條平行的路徑中挑出了期望路徑。
4.局部約束
局部約束包括FROM_TO 約束、最大延時約束、最大偏移約束、虛假路徑、系統時鐘抖動約束、多周期路徑和多時鐘域約束等。在實際開發中,正如本章前沿所述,時序是設計出來,而不是靠約束自動得到的,因此這里不再對局部約束作過多討論。
評論
查看更多