數字asic流程實驗(四) DC綜合


數字asic流程實驗(四) DC綜合

1.Design Compiler 簡介

Design Compiler(以下簡稱DC)是Synopsys公司用於做電路綜合的核心工具,可以將HDL描述的電路轉換為基於工藝的門級網表。

邏輯綜合分為三個階段:

  • 轉譯(Translation):把電路轉換為EDA內部數據庫,這個數據庫跟工藝是獨立無關的;    
  • 優化(Optimozation):根據工作頻率、面積、功耗來對電路優化,來推斷出滿足設計指標要求的門級網表; 
  • 映射(Mapping):將門級網表映射到代工廠給定的工藝的元件庫上,最終形成該工藝對應的門級網表。  

如下圖所示,將Verilog編寫的電路,代工廠提供的元件庫,以及設計約束輸入綜合軟件中,便會輸出可用於布局布線的基於工藝的門級網表。

image-20210726153233526

為何要通過綜合步驟生成工藝所對應的門極網表?這是因為不管多么復雜的數字電路,其最終實現時都要使用MOS管搭建一個個的門電路實現其邏輯功能,而實際的MOS工藝存在各種寄生參數,進而對電路的性能造成一定的影響,代工廠會提供各個基本單元具體的工藝參數,根據這些工藝參數對門極網表進一步做仿真,從而能夠更好的模擬芯片實際流片后的工作情況。

2.TCL腳本編寫

DC可以使用GUI界面,也可以使用TCL(Tool Command Language)腳本工作。通過將指令語句保存在TCL腳本中,使用dc_shell調用執行就能夠高效的完成綜合。

DC綜合實驗的TCL腳本的目標包括:

  1. 指定工藝庫
  2. 讀入設計
  3. 規定設計環境,設計約束
  4. 執行綜合
  5. 輸出網表、時序描述等文件

TCL文件的編寫流程及每個步驟主要使用的命令如下圖所示:

image-20210726160602291

重點針對定義設計環境(Define design environment)和設置設計約束(Set design constraints)兩個步驟進行一些補充說明。

DC定義設計環境時所使用的模型如下圖所示,該步驟主要需要設置驅動(drive)和負載(load)相關的參數,使用set_drive命令設置輸入端口的驅動電阻,使用set_load命令設置輸出端口的負載電容,使用set_driving_cell設置驅動使用的基本單元,使用set_fanout_load設置預期扇出負載值,使用set_wire_load_model設置線負載模型(線負載模型一般來自工藝庫內部),這些設置值都要根據單元的實際設計需求進行確定。

image-20210726163715307

下圖展示了一個通過TCL定義設計環境的例子:

image-20210726171816803

設置設計約束時首先要通過create_clock指令創建時鍾,需要注意的是create_clock中,-period xx用於指明時鍾周期,還需要用-waveform {xx xx}來指明時鍾信號為正的時間段。如下圖所示,一個周期為40ns,0-15ns為正的時鍾信號,使用create_clock信號進行描述時,應寫為

create_clock -period 40 -waveform {0 15} clk

image-20210726221531364

設置設計約束除了需要聲明時鍾信號的延遲、翻轉時間等,還需要通過set_input_delay指令和set_output_delay指定聲明輸入延遲和輸出延遲,輸入延遲指信號從時鍾邊緣通過外部邏輯到輸入端口的時間,即輸入信號是在時鍾沿后多長時間到達模塊的端口上的 。輸出延遲指信號從時鍾邊緣到引腳有效輸出的時間,即輸出信號在后級模塊中需要在時鍾沿之前提前多長時間准備好。DC在綜合時會根據這些約束規划門極電路,從而確保所有的信號能夠被正確的采樣,從而保證芯片工作正常。

下圖所示為一個通過TCL規定輸入延遲和輸出延遲的例子:

image-20210726171935652

本次實驗的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

image-20210726172327779

2.在terminal中輸入

vim dc_script.tcl

打開TCL腳本,檢查腳本內容是否有誤,如果有誤則敲i健進入編輯模式修改,修改完畢后敲ESC退出編輯模式,敲:后輸入wq,敲Enter,退出vim

image-20210726173226896

image-20210726173511094

image-20210726173537904

3.在terminal中依次輸入

ic
dc_shell -f dc_script.tcl

執行TCL腳本

image-20210726172506817

4.等待腳本執行結束,每一步執行后,如果沒有出錯,terminal中會打印1,否則會打印0並顯示報錯信息。如果出現報錯,則根據信息返回修改dc_script.tcl,直到沒有任何報錯信息

image-20210726172948605

5.檢查outputs文件下是否正常生成網表文件(.v)、時序描述文件(.sdf)等,reports文件夾下是否正常生成各項報告

image-20210726174257217

6.至此DC綜合步驟已經結束,可以在dc_shell中輸入

start_gui

運行GUI界面,在Logical Hierarchy窗口中選中cic_filter,點擊Schematic---->New Schematic View,右側窗口中顯示cic_filter的圖標,雙擊圖標后顯示DC綜合后以邏輯門搭建出的cic_filter的結構

image-20210726175203637

image-20210726175355325

image-20210726175726292

image-20210726175705401

4.參考資料

《Automated Synthesis from HDL models》

《DesignCompilerUserGuide_VersionF-2011.09-SP2December2011》

https://zhuanlan.zhihu.com/p/129059203

https://www.jianshu.com/p/a891ef3fe71e

https://blog.csdn.net/zyn1347806/article/details/108649518


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM