邏輯綜合基本步驟
綜合是將RTL轉換成門級網表(gate-level netlist)的過程。綜合過程分為轉換(translation),優化(optimization)、映射(mapping)。綜合工具先通過read命令將RTL代碼轉化成通用的布爾等式,即GTECH(generic technology)。然后執行compile命令,根據設計者施加的延時,面積等約束,對網表進行優化。最后將RTL網表映射到工藝庫上,成為一個門級網表。門級網表輸入到布局布線工具,由它產生GDSll文件,驗證正確后,交付芯片生產商制造。
綜合以時序路徑為基礎進行優化。DC在對設計做綜合時,其過程包括了進行靜態時序分析(static timing analysis STA)。DC使用內建的時序分析器把設計分解成多條時間路徑,然后根據設計的約束對路徑進行優化。如果某條路徑的延時大于約束的值,則時序違例。也可以用Prime Time作靜態時序分析。PT是獨立的時序分析器,主要用于整個芯片門級電路的靜態時序分析。
輸入文件:
RTL文件
工藝庫(.db)
約束文件
輸出文件:
門級網表,用于布局布線,時序后仿
標準延時文件SDF。用于時序仿真(后仿)
各種報告:timing report,area report, constrained report, clock report,Violation report等文件
一些庫的介紹說明:
a) 工藝庫(target_library):工藝庫是綜合后電路網表要最終映射到的庫,讀入的HDL代碼首先由synopsys自帶的GTECH庫轉換成Design Compiler內部交換的格式,然后經過映射到工藝庫和優化生成門級網表。工藝庫他是由Foundary提供的,一般是.db的格式。這種格式是DC認識的一種內部文件格式,不能由文本方式打開。.db格式可以由文本格式的.lib轉化過來,他們包含的信息是一致的。
b) 鏈接庫(link_library):link_library設置模塊或者單元電路的引用,對于所有DC可能用到的庫,我們都需要在link_library中指定,其中也包括要用到的IP。此處還要將search_path加進來,這樣才能找到.db文件,否則只會搜索當前目錄。
c) 符號庫 (symbol_library):symbol_library是定義了單元電路顯示的Schematic的庫。用戶如果想啟動design_analyzer或design_vision來查看、分析電路時需要設置symbol_library。符號庫的后綴是.sdb,加入沒有設置,DC會用默認的符號庫取代。
d) 綜合庫 synthetic_library:它包含了一些可綜合的與工藝無關的 IP。 dw_foundation.sldb 是Synopsys 提供的名為 Design Ware(important)的綜合庫,它包含了基本的算術運算邏輯、控制邏輯、可綜合存儲器等 IP,在綜合是調用這些 IP 有助于提高電路性能和減少綜合時間。
例: set synthetic_library dw_foundation.sldb
約束的目的是模擬芯片真實的工作條件,并查看綜合后的門級網表能否在此條件下正確工作。綜合過程除了要滿足時序要求,還要考慮面積,功耗等因素。
常用約束命令:
時鐘約束:creat_clock,set_input_delay,set_output_delay,create_generated_clock
設計環境約束:set_driving_cell,set_load,set_wire_load_model,set_operating_conditions,
設計規則約束:set_max_fanout,set_max_capacitance,set_max_transition
報告命令有:report_clock,report_design,
清除約束命令有:reset_path,reset_design
設置面積目標命令:set_max_area
時鐘約束決定了路徑的最大延時。
創建時鐘
creat_clock -period 10 -n clk [get_ports CLK]
考慮時鐘抖動(jitter)偏差(skew)
set_clock_uncertainty 0.1 clk //單位ns
考慮時鐘轉換時間(transition)。只需在版圖前考慮,版圖之后不考慮。
set_clock_transition 0.25 clk
考慮時鐘延時(latency)。
set_clock_latency -source 3 [get_clocks CLK]
set_clock_latency 1 [get_clocks CLK] //pre layout
set_propagated_clock [get_clocks CLK] // post layout
輸入端口延時
set all_in_ext_clk [remove_from_collection [all_inputs] [get_ports CLK]]
set clk_to_q 6
set_input_delay -max $clk_to_q -clock CLK $all_in_ext_clk
輸出端口延時
set_output_delay -max $clk_to_q -clock CLK [all_outputs]
路徑延時由門單元(cell)延時和線(wire)延時決定。門單元延時由非線性延時模型(non-linear delay model)算出。半導體廠商提供的工藝庫中有一個二維表格,根據門單元的輸出負載和輸入轉換時間找到門單元的延時和輸出轉換時間。線延時一般用線負載模型算出(wire load model)。
設計環境約束是為了精確的計算輸入/輸出路徑延時。對于輸入路徑,需要知道輸入轉換時間,對于輸出路徑,需要知道輸出負載。
輸入路徑
用set_drving_cell命令說明輸入端口由一個真實的外部單元驅動。
set_driving_cell -lib_cell FD1 -pin Q [get_ports IN1]
輸出路徑
使用set_load命令說明輸出端口上的外部電容負載
set_load 5 [get_ports OUT1] //在輸出端口上指定一個常數負載值
set_load [expt [load_of my_lib/AND/A] *3 ] [get_ports OUT1] //將工藝庫中門單元引腳的負載加載到輸出端口上
假設設計者不知道輸入驅動單元和輸出負載,可用下面規則產生負載預算(budget)
驅動單元為驅動能力弱的單元驅動
使用set_max_capacitance限制每一個輸入端口的輸入電容
估算輸出端口的驅動模塊數量
設計規則由半導體廠商提供的工藝庫決定。這些規則按優先級排序包括,最大電容負載,最大轉換時間,最大扇出。如果設計中單元的驅動負載超過設計規則給定的最大電容負載,半導體廠商不能保證芯片能正常工作。
set_max_capacitance設置一個節點的最大電容。
從工藝庫找出設計中預期驅動器的最大允許電容負載
set DRIVE_PIN TECH_LIB/invla27/Y
set MAX_CAP [get_attribute $DRIVE_PIN max_capacitance] // 假設為3.6
在驅動器增加一些富裕量使DC不會滿載
set CONSERVATIVE_MAX_CAP [expr $MAX_CAP / 2.0] // 值為1.8
set_max_capacitance $CONSERVATIVE_MAX_CAP [get_ports IN1]
set_load 1.2 [get_ports IN1]
DC可以給輸入端IN1施加的最大內部負載是 1.8-1.2 = 0.6pF
set_max_transition設置一個節點的最大轉換時間
max_transition的值一般不要超過預期驅動器的最大允許轉換時間。
set_max_fanout設置一個節點的最大扇出值。注意這里的值不是值扇出數目,而是扇出負載的值。
例如,set_max_fanout 6 [get_ports IN]
get_attribute INV1/A fanout_load // if 0.25
get_attribute INV2/A fanout_load // if 3
則IN這個節點可以接24個INV1,或者兩個INV2
設計中所有的時鐘信號都來自同一個時鐘源。例如對200M時鐘進行2分頻,4分頻,分別送給A,B兩個模塊。A,B模塊有信號互相傳輸,對B模塊約束時,可先定義虛擬時鐘,用虛擬時鐘對輸入輸出信號進行約束。
creat_clock -period 10 -name CLKA
creat_clock -period 20 -name CLKB [get_ports CLKB]
set_input_delay -max 12 -clock CLKA [get_ports IN1]
set_output_delay -max 12 -clock CLKA [get_ports OUT1]
異步電路時鐘來自于不同時鐘源,時鐘之間是不同頻率或同頻不同相的關系。對于穿過異步邊界的任何路徑,我們不需要對此做任何優化,因為不同時鐘的之間的相位關系是不確定的。使用set_false_path命令對這些路徑做優化。
set_false_path -from [get_ports CLKA] -to [get_ports CLKB]
該命令除了約束異步路徑,還用于約束“偽路徑”,物理上存在,但沒有數據傳輸。用report_timing_requirements -ignored命令報告無效路徑。要去掉任何不要的例外,可使用reset_path命令。
假設時鐘周期為10ns,加法器的延時約為6個時鐘周期,則加法器允許的最大延時是:
60-T_setup-T_uncertainty-T_clk_q
加法器的最小延時是:
T_hold+T_uncertainty
約束腳本如下:
create_clock -period 10 [get_ports CLK]
set_multicycle_path -setup 6 -to [get_pins C_reg[*]/D]
set_multicycle_path -hold 5 -to [get_pins C_reg[*]/D]
意思是在在第5個時鐘周期時檢查保持時間,在第0個時鐘周期時檢查建立時間。
門控是低功耗設計的有效方法,常用帶鎖存器的門控電路:
DC能自動辨認門控時鐘電路,綜合時,根據下面的約束在門控時鐘電路中增加/刪除邏輯以滿足使能信號的建立和保持時間要求
set_clock_gating_check -setup 0.5 -hold 0.5 [current_design]
對于帶時鐘選擇的電路,可使用set_disable_timing命令或set_case_analysis命令:
create_clock ext_clk -period 10
create_clock test_clk -period 100
set_dont_touch_network [get_clocks ext_clk]
set_dont_touch_network [get_clocks test_clk]
set_disable_timing CLOCK_GEN/U1 -from 1 - to y
也可以使用set_case_analysis命令
set_case_analysis 0 [get_pins U1/sel]
對于分頻器產生的時鐘,使用create_generated_clock命令。
create_clock -period 50 [get_ports ext_clk]
create_generated_clock -name int_clk -source [get_pins CLOCK_GEN/U2/CP] -divide_by 2
原文鏈接:https://www.csdn.net/tags/OtDaEgzsNzAwNzUtYmxvZwO0O0OO0O0O.html