DC綜合
1、綜合分類
- 行為級綜合
- RTL級綜合
- 邏輯級綜合
准備好源代碼,最終完成RTL級綜合
2、DC綜合
2.1 轉換
綜合工具將源代碼轉化為中間網表
2.2 優化
綜合工具對中間級網表優化,去掉冗余單元,加入限制條件對電路進行優化。
2.3 映射
將優化后的電路映射到工藝庫
3、編寫利於綜合的HDL代碼
具體語法略過
case語句不全,但沒有別的條件時,可以用synopsys full_case告訴綜合工具避免latch。但不利於驗證。
Design ware basic提供基本電路,design ware foundation提供性能較高的電路結構。
lappend link_library $synthetic_library 鏈接對應庫,使DC將*、/等運算直接綜合。
4、如何使用DC
4.1 預綜合(Pre_synthesis Processes)
4.1.1 啟動方式
-
圖形界面方式
dc_shell gui_start
-
腳本方式
dc_shell -f script dc_shell -t -f script #tcl腳本
4.2 庫文件設置
4.2.1 工藝庫(target_library)
綜合后的電路網表最終映射到的庫
RTL代碼先由synnopsys自帶的gtech庫轉為中間格式,然后經過DC映射到工藝庫,並且進行優化生成門級網表。這個工藝庫是晶圓廠foundary提供的.db或.lib文件,DC在綜合時根據工藝庫中的單元電路參數來計算路徑延遲。
set target_library my_tech.db
4.2.2 鏈接庫(link_library)
設置模塊或者單元電路的引用(DC可能用到的庫或IP)
設置時注意“”表示DC在引用實例化模塊或者單元電路時首先搜索已經調進DCmemory的模塊和單元電路,如果不包含“”,就不會使用DCmemory中已有的模塊。出現告“unresolved design reference”。
lappend search_path{bob} #鏈接庫默認路徑在DC運行目錄下,使用這條命令添加bob文件夾作為路徑
set link_library "*my_tech.db"
4.2.3 符號庫(symbol_library)
定義單元電路顯示的schematic的庫(把連接關系畫出來)
啟動圖形界面就可看電路實際綜合后的樣子。符號庫后綴.sdb,如果沒有設置,DC會使用默認符號庫。
set symbol_library
4.2.4 綜合庫(synthetic_library)
對於擴展的design ware,需要在synthetic_library中設置。比如需要一些特殊的加法器、乘法器,如果不進行設置,DC就會將“*”“+”綜合成它默認的加法器乘法器。
set synthetic_library
4.3 啟動文件
設置synopsys_dc.setup
DC啟動時首先在三個目錄下(DC安裝目錄的默認設置、$Home下一些用戶本人的個性化設置和變量、DC啟動目錄下與實際設計相關的設置)讀這個文件,三個文件夾下的setup文件優先級依次增加。
4.4 讀入設計文件
tcl模式下讀取不同文件格式需要不同命令
read_db example.db
read_verilog example.v
read_vhdl example.vhdl
4.5 施加設計約束(Constraining the design)
4.5.1 時序與面積約束
4.5.1.1 定義面積約束
dc_shell -t > current_design PRGRM_CNT_TOP
dc_shell -t > set_max_area 100
100的單位由foundry規定,三種情況:100個門邏輯、100個晶體管、100平方微米等
4.5.1.2 同步設計的時序特點和目標
- 約束輸入到寄存器的路徑
- 約束寄存器到寄存器的路徑
- 約束寄存器到輸出的路徑
4.5.1.3 定義時鍾
所有時序電路以及組合電路的優化都是以時鍾的基准來計算路徑延遲
定義時鍾源clock source、時鍾周期、占空比duty cycle、時鍾偏移clock skew和時鍾名
dc_shell -t > create_clock - period 10[get_ports CLK] #時鍾名CLK,時鍾周期10ns
dc_shell -t > set_dont_touch_network[get_clocks CLK] #告訴DC工具不要優化,防止自動根據負載插入buffer
4.5.1.4 約束輸入路徑N
告訴DC圖中FF1+M的延時不和灰色模塊一起綜合,不然可能會出現無法滿足灰色模塊的setup time
dc_shell -t > set_input_delay -max 4 -clock CLK[get_ports A]
-max指建立時間
-min指保持時間
4.5.1.5 約束輸出路徑S
要對后一級觸發器留出時間裕量。
對於信號經過灰色模塊到達后級電路來說,后級電路看到的時間是T的電路延時和觸發器建立時間。
當T和觸發器建立時間確定后,被綜合模塊內部的輸出延時就會被約束。
假設時鍾周期20ns,外圍觸發器輸入延時5.4ns,那么灰色模塊內部只能處理輸出路徑小於13.6ns的情況。
dc_shell -t > set_output_delay -max 5.4 -clock clk[get_ports A]
4.5.2 環境屬性
上述只考慮了面積時序等約束,但實際上待綜合模塊還需要考慮周邊環境變化對物理器件的影響,例如溫度變化、電路供電電壓變化等,並且面積時序約束沒考慮電平翻轉時間。實際點評翻轉時間由外圍電路的驅動能力和負載大小決定。這些種種都歸入環境屬性約束中考慮。
4.5.2.1 設置輸出負載
對於模塊輸出時序,除了需要知道輸出延時外,還需要輸出電路所接負載。如果負載過大,會增加電路的transition time,影響時序特性。理想情況下負載為0,電平轉換時間也為0.
set_load 5[get_ports OUT1]#負載設為5
set_load [load_of my_lib/and2a0/A][get_ports OUT1]#在out1接my_lib中的and2a0單元的A管腳
set_load [expr [load_of my_lib/and2a0/A]*3] OUT1 #讓out1連接三個並行A管腳
4.5.2.2 設置輸入驅動
默認情況下DC認為輸入驅動能力無限大,電平轉換時間為0.
set_driving_cell -lib_cell and2a0\ [get_ports IN1] #將輸入端口IN1連接and2a0作為驅動
4.5.2.3 設置工作條件
主要包含溫度、電壓、工藝等。
foundry提供的工藝庫中,各個單元的延時是在標准條件下測得,若工作條件發生改變,電路時序特性也將受到影響。
單元延時跟溫度和工藝尺寸成正比,跟電壓成反比。綜合時候只需要考慮最差情況和最好情況。最差情況用於分析建立時間,最好情況用於分析保持時間。
4.5.2.4 設置連線負載模型
連線的延時通過設置連線負載模型確定。
連線負載模型由foundry提供,可根據連線的扇出,估計電阻電容等寄生參數。
模塊內部連線
dc_shell -t > set current_design addtwo
dc_shell -t > set_wire_load_model -name 160KGATES
addtwo為模塊名,160KGATES為模型名
默認情況下DC根據綜合的模塊大小自動選擇負載模型,通過report_lib ssc_core_slow可以查看具體怎么選。
模塊之間連線
-
圍繞模式:子模塊負載模型采用上級模塊負載模型
set_wire_load_mode_enclosed
-
頂層模式:用頂層模塊的負載模型代替
set_wire_load_mode top
-
分段模式:根據穿過的三段模型相加得到
set_wire_load_mode segmented
4.5.2.5 時序和負載預算
約束過程中具體應該約束多少數值,一般由架構工程師完成。
4.5.3時序分析
將電路分解成不同的路徑timing path,每條時序路徑起點是輸入端口或觸發器的時鍾駛入段,終點是輸出端口或觸發器的數據輸入端。根據終點所在的觸發器的時鍾分組計算每段路徑的延時,包含單元延時和連線延時。將不同路徑進一步划分得到一段段時序弧,檢查所有路徑的延時看是否滿足時序要求。