數字asic流程實驗(四) DC綜合
1.Design Compiler 簡介
Design Compiler(以下簡稱DC)是Synopsys公司用於做電路綜合的核心工具,可以將HDL描述的電路轉換為基於工藝的門級網表。
邏輯綜合分為三個階段:
- 轉譯(Translation):把電路轉換為EDA內部數據庫,這個數據庫跟工藝是獨立無關的;
- 優化(Optimozation):根據工作頻率、面積、功耗來對電路優化,來推斷出滿足設計指標要求的門級網表;
- 映射(Mapping):將門級網表映射到代工廠給定的工藝的元件庫上,最終形成該工藝對應的門級網表。
如下圖所示,將Verilog編寫的電路,代工廠提供的元件庫,以及設計約束輸入綜合軟件中,便會輸出可用於布局布線的基於工藝的門級網表。
為何要通過綜合步驟生成工藝所對應的門極網表?這是因為不管多么復雜的數字電路,其最終實現時都要使用MOS管搭建一個個的門電路實現其邏輯功能,而實際的MOS工藝存在各種寄生參數,進而對電路的性能造成一定的影響,代工廠會提供各個基本單元具體的工藝參數,根據這些工藝參數對門極網表進一步做仿真,從而能夠更好的模擬芯片實際流片后的工作情況。
2.TCL腳本編寫
DC可以使用GUI界面,也可以使用TCL(Tool Command Language)腳本工作。通過將指令語句保存在TCL腳本中,使用dc_shell調用執行就能夠高效的完成綜合。
DC綜合實驗的TCL腳本的目標包括:
- 指定工藝庫
- 讀入設計
- 規定設計環境,設計約束
- 執行綜合
- 輸出網表、時序描述等文件
TCL文件的編寫流程及每個步驟主要使用的命令如下圖所示:
重點針對定義設計環境(Define design environment)和設置設計約束(Set design constraints)兩個步驟進行一些補充說明。
DC定義設計環境時所使用的模型如下圖所示,該步驟主要需要設置驅動(drive)和負載(load)相關的參數,使用set_drive命令設置輸入端口的驅動電阻,使用set_load命令設置輸出端口的負載電容,使用set_driving_cell設置驅動使用的基本單元,使用set_fanout_load設置預期扇出負載值,使用set_wire_load_model設置線負載模型(線負載模型一般來自工藝庫內部),這些設置值都要根據單元的實際設計需求進行確定。
下圖展示了一個通過TCL定義設計環境的例子:
設置設計約束時首先要通過create_clock指令創建時鍾,需要注意的是create_clock中,-period xx用於指明時鍾周期,還需要用-waveform {xx xx}來指明時鍾信號為正的時間段。如下圖所示,一個周期為40ns,0-15ns為正的時鍾信號,使用create_clock信號進行描述時,應寫為
create_clock -period 40 -waveform {0 15} clk
設置設計約束除了需要聲明時鍾信號的延遲、翻轉時間等,還需要通過set_input_delay指令和set_output_delay指定聲明輸入延遲和輸出延遲,輸入延遲指信號從時鍾邊緣通過外部邏輯到輸入端口的時間,即輸入信號是在時鍾沿后多長時間到達模塊的端口上的 。輸出延遲指信號從時鍾邊緣到引腳有效輸出的時間,即輸出信號在后級模塊中需要在時鍾沿之前提前多長時間准備好。DC在綜合時會根據這些約束規划門極電路,從而確保所有的信號能夠被正確的采樣,從而保證芯片工作正常。
下圖所示為一個通過TCL規定輸入延遲和輸出延遲的例子:
本次實驗的TCL腳本內容如下
set search_path "../lib/logic ../src" #設置搜索路徑
set target_library " slow.db " #設置標准元件庫
set link_library "* $target_library "
set symbol_library " smic18.sdb " #設置標准元件圖標庫
set access_internal_pins true
set report_path "./reports" #設置reports文件夾
set output_path "./outputs" #設置outputs文件夾
read_file -format verilog cic_filter.v #讀取verilog設計文件
read_file -format verilog divider64.v
current_design cic_filter #指明主程序
link #工藝庫鏈接
uniquify
set design_name [get_object_name [current_design]]
set_wire_load_model -name "smic18_wl10" #設置線負載模型
set_wire_load_mode top
create_clock -period 156 -waveform {0 78} [get_ports clk] -name clk #設置時鍾,周期156ns,脈寬0-78ns
create_generated_clock [get_pins div/clk_div] -source [get_ports clk] -divide_by 64 -name clk_div #分頻64后的時鍾
set_clock_latency 2.5 clk #延遲時間2.5ns
set_clock_transition 0.3 clk #翻轉時間0.3ns
set_clock_uncertainty 1.5 -setup clk #建立時間1.5ns
set_clock_uncertainty 0.3 -hold clk #保持時間0.3ns
set_drive 0 [list clk rst_n] #設置輸入驅動強度為0
set_driving_cell -lib_cell NAND2X1 in #設置驅動單元
set_input_delay 35 -clock [get_clocks clk] {in rst_n} #設置輸入延時35ns
set_output_delay 35 -clock [get_clocks clk_div] [get_ports out] #設置輸出延時35ns
set_load 2 [all_outputs] #設置輸出負載為2pF
set_max_area 0
check_design > $report_path/check_design_before_compile.rpt
check_timing > $report_path/check_timing_before_compile.rpt
compile
compile -incremental_mapping -map_effort high
write_sdf -version 2.1 $output_path/${design_name}_post_dc.sdf #時序描述
write -f ddc -hier -output $output_path/${design_name}_post_dc.ddc
write -f verilog -hier -output $output_path/${design_name}_post_dc.v #網表
write_sdc $output_path/${design_name}_post_dc.sdc #約束
report_constraint -all_violators -verbose > $report_path/constraint.rpt
report_qor > $report_path/qor.rpt
report_power > $report_path/power.rpt
report_area > $report_path/area.rpt
report_cell > $report_path/cell.rpt
report_clock > $report_path/clk.rpt
report_hierarchy > $report_path/hierarchy.rpt
report_design > $report_path/design.rpt
report_reference > $report_path/reference.rpt
report_timing > $report_path/timing.rpt
check_design > $report_path/check_design_post_compile.rpt
check_timing > $report_path/check_timing_post_compile.rpt
#start_gui
3.運行綜合
1.打開虛擬機,至/home/crazy/Desktop/experiment/dc 文件夾下,右鍵Open in Terminal
2.在terminal中輸入
vim dc_script.tcl
打開TCL腳本,檢查腳本內容是否有誤,如果有誤則敲i健進入編輯模式修改,修改完畢后敲ESC退出編輯模式,敲:后輸入wq,敲Enter,退出vim
3.在terminal中依次輸入
ic
dc_shell -f dc_script.tcl
執行TCL腳本
4.等待腳本執行結束,每一步執行后,如果沒有出錯,terminal中會打印1,否則會打印0並顯示報錯信息。如果出現報錯,則根據信息返回修改dc_script.tcl,直到沒有任何報錯信息
5.檢查outputs文件下是否正常生成網表文件(.v)、時序描述文件(.sdf)等,reports文件夾下是否正常生成各項報告
6.至此DC綜合步驟已經結束,可以在dc_shell中輸入
start_gui
運行GUI界面,在Logical Hierarchy窗口中選中cic_filter,點擊Schematic---->New Schematic View,右側窗口中顯示cic_filter的圖標,雙擊圖標后顯示DC綜合后以邏輯門搭建出的cic_filter的結構
4.參考資料
《Automated Synthesis from HDL models》
《DesignCompilerUserGuide_VersionF-2011.09-SP2December2011》
https://zhuanlan.zhihu.com/p/129059203