DC綜合簡單總結(1)
*****************set_dont_touch和set_dont_touch_network****************
?
在綜合的過程中,為了不讓DC工具自動優化一些我們不希望其優化的模塊(比如CLK)我們通常都會設置set_ideal_network和set_dont_touch,我理解為前者在timing_report的時候忽略延遲,后者阻止DC插入buffer。
那么dont_touch的屬性,能不能穿過logic?
set_dont_touch和set_dont_touch_network有什么區別,為什么普遍認為set_dont_touch_network會造成未知問題而不推薦使用?
對於ideal_net的這個屬性,是不是說直接忽略了延遲,忽略了DRC,如果將clk設定為ideal_net,是不是就不用再設定dont_touch了?
說的有點混亂,請各位大神技術支持,小弟不勝感激!!
=
set_dont_touch不會穿過logic,可以用於cells, nets, references, 和 designs。你不希望DC碰的地方,都可以用它。
set_dont_touch_network可以穿過logic,可以用於clocks, pins, 或 ports,比上面的范圍小。當你對設計不十分熟悉時,這個屬性可能會傳到你不希望的地方去。
ideal_net 顧名思義就是把這條net完全理想化--無窮大的驅動能力,沒有延遲。有時會和上面的命令一起用。當你知道了它們的意思,如何使用取決於你的目的和得到的結果
?
對於Ideal_net這個屬性,設置的時候有個no_propagate的屬性,對於net來說一定要設這個,是不是就是為了阻止其穿過邏輯?那如果我設的是pin並且不加上no_propagate能穿過邏輯嗎?
在建立clock的時候,我看到它會自動的設為ideal_net,但是卻還是會計算延遲,會不會因為clock path有邏輯的原因?
=
set_ideal_net = set_ideal_network -no_propagate
clock net 如果被用作data,就會有delay,那是因為net上面掛的clk pin的負載,不是ideal net本身
?
我大體上明白了,clk在創建的時候,會默認為ideal net的,但當clk接入到data path的時候,D端就會考慮我clk上的負載,但並不會影響clk的ideal net的屬性。
假如我的clk需要門電路做gating,gating后的時鍾也有很大的扇出,那我為了忽略掉延遲,是不是需要在gating后重新給clk定義ideal net?因為ideal net不能穿過邏輯。
=
如果你的CG集成好的標准單元,它會自動繼承ideal的屬性。
*****************set_dont_touch和set_dont_touch_network****************
輸入端口到時序器件的數據端口。

要求時間=T2+Tlatency-Tuncertainty_setup-Tsetup
到達時間=T1+Tlantency+Tinput_delay+Tlogic2
時序器件的輸出管腳到輸出端口 
上圖中:
要求時間=T2+Tlatency-Toutput_delay-Tuncertainty_setup
到達時間=T1+Tlatency+Tcell+Tlogic5
時序器件到時序器件

路徑上的 cell 延遲由 input_transition 和 output_load(包括扇出 pin 上的 load)決定,這個由查抄表可以得到。
而 net 延遲是由 net 上的 R, C 決定的。在沒有布局布線之前,我們不知道實際的 R, C 是多少, dc 根據互聯線模型(set_wire_load_model)來計算出 R, C。然后根據得到的 R, C 計算出 net 上的延遲:
Net_delay=R*C*OC
其中系數 OC 是根據操作環境(set_opearting_conditions)中設置的 rc樹模型得到。
一般的工藝庫的操作環境有三種, WORST, TYPICAL, BEST,分別是最差,典型,最壞。

T=4,周期為4,Tdata為2,兩個clk同時到達,slack=4-2=2,

setup check是latch和lauch間隔一個時鍾周期,hold check才是在同一個時鍾沿
input_transition輸入信號的轉換時間可以采用兩種約束:
1 直接設置轉換時間
set_input_transition 0.1 [get_ports A]
2 采用設置輸入驅動能力,驅動能力越大,轉換時間越小,驅動能力越小,轉換時間越大
set_drive或者set_driving_cell
Slew Rate vs. Transition Time
首先,我要說明一下,slew和transition其實並非獨立存在使用的詞匯。在諸多教材中,一般是以slew rate和transition time,兩個詞組出現的。
Slew rate,信號改變的速率。
Transition time,信號改變的持續時間。
在靜態時序分析(STA)中,一個上升或者下降的波形通常用slew rate來表征其跳變的快與慢。Transition time就是用來記錄這個信號在兩個電平之間的轉換時間。
這里需要注意的是,transition time實際是slew rate的倒數。Transition time如果越大,那么slew rate就會越慢,反之亦然。
上圖展示了一些CMOS器件的輸出波形圖。理想狀態下,我們期望得到一個完美的方波,不過,這顯然不夠現實。實際上,由於對電容的充放電,一個數字信號的波形往往存在上升和下降的電壓緩沖區間。
為了能量化這樣的波形,我們近似采用一個線性上升或者下降的信號來模擬真實信號波形。注意到,真實信號波形里,不管是上升還是下降的時候,都會存在一定時間的線性區域。
這個線性區域的起點和終點,可能因為某些估算模型而有所不同。在STA中,我們有時候會采用比較寬松的約束模式,例如20%/80%、10%/90%。
當然,我們也可以采用激進一些的模式,如30%/70%。
在一個線性時序模型里,一個信號經過一個時序單元可能產生兩種新的信號波形。
當輸出信號的slew rate比輸入信號的要快,也就是transition time變短了,說明這個單元對這個信號起到了增強驅動的作用。
反之,當輸出信號的slew rate比輸入信號還要慢,就是transition time變長了,說明這個單元對這個信號起到了削弱驅動的作用。可能的原因是,這個單元的輸出端驅動了較大的負載。
所以,當我們要描述一個信號電平有所變化的時候,記得要用slew rate來表述快慢,用transition time來描述持續時間。
l 對於 cell 的延遲,dc 是根據 input_transition 和 out_load 對應的查找表來計算的。
l 對於 net 的延遲,dc 是根據 wire_load_model 中的fanout_length 和 resistance,capacitance, area 的查找表計算的。
l 負載其實有兩個概念,一個是阻性負載,這個負載當你提供了足夠的驅動力就能夠正確輸出,否則電壓就不對;另一個是容性負載,這個負載一般在系統里頭,和系統能跑到什么速度相關。
一個輸出驅動力大的話就能夠帶更大的負載,從這個意義上說,認為驅動=負載也是可以理解的。但其實這兩個概念還是有些區別,側重點不同。你上面也引用了,“電路的負載能力是下一級的load(即電容)總和”,這都是完全不同的兩個量綱,怎么會一樣。系統設計上,假設你需要跑10MHz的頻率,你需要10mA的驅動力,則同一個容性負載上,要跑到20MHz的頻率,你就需要20mA的驅動力。
l 對於Fanout 的理解
Fanout,即扇出,指模塊直接調用的下級模塊的個數,如果這個數值過大的話,在FPGA直接表現為net delay較大,不利於時序收斂。因此,在寫代碼時應盡量避免高扇出的情況。
https://www.cnblogs.com/aikimi7/p/5945822.html
綜上,在遇到信號高扇出時,對於普通信號可采用
1.寄存器復制或者2.設置max_fanout屬性優化;而3.對於復位信號,可加入BUFG優化。
寄存器復制是解決高扇出問題最常用的方法之一,通過復制幾個相同的寄存器來分擔由原先一個寄存器驅動所有模塊的任務,繼而達到減小扇出的目的。通過簡單修改代碼,如圖3所示,復制了4個寄存器:din_d0、din_d1、din_d2、din_d3,din_d、din_d0、din_d1、din_d2分別驅動2個DSP48E1,din_d3驅動3個DSP48E1。其中在代碼中為防止綜合器優化相同寄存器,在對應信號上加入了(* EQUIVALENT_REGISTER_REMOVAL="NO" *)屬性避免被優化。

綜合實現后得到時序報告如圖4所示,該數據路徑上輸入數據fanout減為2,對應net delay也減小到了0.57ns。得到設計如圖5所示,與期望的相同,復制了4個寄存器來分擔fanout。在沒有優化情況下,該設計的fmax:206.016MHz,經過寄存器優化后得到fmax:252.143MHz.
2. max_fanout屬性
在代碼中可以設置信號屬性,將對應信號的max_fanout屬性設置成一個合理的值,當實際的設計中該信號的fanout超過了這個值,綜合器就會自動對該信號采用優化手段,常用的手段其實就是寄存器復制。屬性設置如下代碼所示:
(* max_fanout = "3" *)reg signed [15:0] din_d;
將din_d信號的max_fanout屬性設置成3,經過綜合實現后,得到時序報告如圖6所示,其中fanout只有2,相應的net delay也只有0.61ns,自動優化效果還不錯。結構如圖7所示,其中din_d_12_1、din_d_12_2、din_d_12_3是綜合器優化后自動添加,即實現了寄存器復制功能。經過設置max_fanout屬性優化后得到fmax:257.135MHz
3. BUFG
通常BUFG是用於全局時鍾的資源,可以解決信號因為高扇出產生的問題。但是其一般用於時鍾或者復位之類扇出超級大的信號,此類信號涉及的邏輯遍布整個芯片,而BUFG可以從全局的角度優化布線。而且一塊FPGA芯片中BUFG資源也有限,在7k325tffg900上也僅有32個,如果用於普通信號的高扇出優化也不大現實。因此,在時鍾上使用BUFG是必須的,但是如果設計中遇到某些復位信號因高扇出產生的時序問題時,可以在此信號上使用BUFG來優化
