邏輯綜合基本步驟
綜合是將RTL轉(zhuǎn)換成門級(jí)網(wǎng)表(gate-level netlist)的過程。綜合過程分為轉(zhuǎn)換(translation),優(yōu)化(optimization)、映射(mapping)。綜合工具先通過read命令將RTL代碼轉(zhuǎn)化成通用的布爾等式,即GTECH(generic technology)。然后執(zhí)行compile命令,根據(jù)設(shè)計(jì)者施加的延時(shí),面積等約束,對(duì)網(wǎng)表進(jìn)行優(yōu)化。最后將RTL網(wǎng)表映射到工藝庫(kù)上,成為一個(gè)門級(jí)網(wǎng)表。門級(jí)網(wǎng)表輸入到布局布線工具,由它產(chǎn)生GDSll文件,驗(yàn)證正確后,交付芯片生產(chǎn)商制造。
綜合以時(shí)序路徑為基礎(chǔ)進(jìn)行優(yōu)化。DC在對(duì)設(shè)計(jì)做綜合時(shí),其過程包括了進(jìn)行靜態(tài)時(shí)序分析(static timing analysis STA)。DC使用內(nèi)建的時(shí)序分析器把設(shè)計(jì)分解成多條時(shí)間路徑,然后根據(jù)設(shè)計(jì)的約束對(duì)路徑進(jìn)行優(yōu)化。如果某條路徑的延時(shí)大于約束的值,則時(shí)序違例。也可以用Prime Time作靜態(tài)時(shí)序分析。PT是獨(dú)立的時(shí)序分析器,主要用于整個(gè)芯片門級(jí)電路的靜態(tài)時(shí)序分析。
輸入文件:
RTL文件
工藝庫(kù)(.db)
約束文件
輸出文件:
門級(jí)網(wǎng)表,用于布局布線,時(shí)序后仿
標(biāo)準(zhǔn)延時(shí)文件SDF。用于時(shí)序仿真(后仿)
各種報(bào)告:timing report,area report, constrained report, clock report,Violation report等文件
一些庫(kù)的介紹說明:
a) 工藝庫(kù)(target_library):工藝庫(kù)是綜合后電路網(wǎng)表要最終映射到的庫(kù),讀入的HDL代碼首先由synopsys自帶的GTECH庫(kù)轉(zhuǎn)換成Design Compiler內(nèi)部交換的格式,然后經(jīng)過映射到工藝庫(kù)和優(yōu)化生成門級(jí)網(wǎng)表。工藝庫(kù)他是由Foundary提供的,一般是.db的格式。這種格式是DC認(rèn)識(shí)的一種內(nèi)部文件格式,不能由文本方式打開。.db格式可以由文本格式的.lib轉(zhuǎn)化過來,他們包含的信息是一致的。
b) 鏈接庫(kù)(link_library):link_library設(shè)置模塊或者單元電路的引用,對(duì)于所有DC可能用到的庫(kù),我們都需要在link_library中指定,其中也包括要用到的IP。此處還要將search_path加進(jìn)來,這樣才能找到.db文件,否則只會(huì)搜索當(dāng)前目錄。
c) 符號(hào)庫(kù) (symbol_library):symbol_library是定義了單元電路顯示的Schematic的庫(kù)。用戶如果想啟動(dòng)design_analyzer或design_vision來查看、分析電路時(shí)需要設(shè)置symbol_library。符號(hào)庫(kù)的后綴是.sdb,加入沒有設(shè)置,DC會(huì)用默認(rèn)的符號(hào)庫(kù)取代。
d) 綜合庫(kù) synthetic_library:它包含了一些可綜合的與工藝無關(guān)的 IP。 dw_foundation.sldb 是Synopsys 提供的名為 Design Ware(important)的綜合庫(kù),它包含了基本的算術(shù)運(yùn)算邏輯、控制邏輯、可綜合存儲(chǔ)器等 IP,在綜合是調(diào)用這些 IP 有助于提高電路性能和減少綜合時(shí)間。
例: set synthetic_library dw_foundation.sldb
約束的目的是模擬芯片真實(shí)的工作條件,并查看綜合后的門級(jí)網(wǎng)表能否在此條件下正確工作。綜合過程除了要滿足時(shí)序要求,還要考慮面積,功耗等因素。
常用約束命令:
時(shí)鐘約束:creat_clock,set_input_delay,set_output_delay,create_generated_clock
設(shè)計(jì)環(huán)境約束:set_driving_cell,set_load,set_wire_load_model,set_operating_conditions,
設(shè)計(jì)規(guī)則約束:set_max_fanout,set_max_capacitance,set_max_transition
報(bào)告命令有:report_clock,report_design,
清除約束命令有:reset_path,reset_design
設(shè)置面積目標(biāo)命令:set_max_area
時(shí)鐘約束決定了路徑的最大延時(shí)。
創(chuàng)建時(shí)鐘
creat_clock -period 10 -n clk [get_ports CLK]
考慮時(shí)鐘抖動(dòng)(jitter)偏差(skew)
set_clock_uncertainty 0.1 clk //單位ns
考慮時(shí)鐘轉(zhuǎn)換時(shí)間(transition)。只需在版圖前考慮,版圖之后不考慮。
set_clock_transition 0.25 clk
考慮時(shí)鐘延時(shí)(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
輸入端口延時(shí)
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
輸出端口延時(shí)
set_output_delay -max $clk_to_q -clock CLK [all_outputs]
路徑延時(shí)由門單元(cell)延時(shí)和線(wire)延時(shí)決定。門單元延時(shí)由非線性延時(shí)模型(non-linear delay model)算出。半導(dǎo)體廠商提供的工藝庫(kù)中有一個(gè)二維表格,根據(jù)門單元的輸出負(fù)載和輸入轉(zhuǎn)換時(shí)間找到門單元的延時(shí)和輸出轉(zhuǎn)換時(shí)間。線延時(shí)一般用線負(fù)載模型算出(wire load model)。
設(shè)計(jì)環(huán)境約束是為了精確的計(jì)算輸入/輸出路徑延時(shí)。對(duì)于輸入路徑,需要知道輸入轉(zhuǎn)換時(shí)間,對(duì)于輸出路徑,需要知道輸出負(fù)載。

輸入路徑
用set_drving_cell命令說明輸入端口由一個(gè)真實(shí)的外部單元驅(qū)動(dòng)。
set_driving_cell -lib_cell FD1 -pin Q [get_ports IN1]
輸出路徑
使用set_load命令說明輸出端口上的外部電容負(fù)載
set_load 5 [get_ports OUT1] //在輸出端口上指定一個(gè)常數(shù)負(fù)載值
set_load [expt [load_of my_lib/AND/A] *3 ] [get_ports OUT1] //將工藝庫(kù)中門單元引腳的負(fù)載加載到輸出端口上
假設(shè)設(shè)計(jì)者不知道輸入驅(qū)動(dòng)單元和輸出負(fù)載,可用下面規(guī)則產(chǎn)生負(fù)載預(yù)算(budget)
驅(qū)動(dòng)單元為驅(qū)動(dòng)能力弱的單元驅(qū)動(dòng)
使用set_max_capacitance限制每一個(gè)輸入端口的輸入電容
估算輸出端口的驅(qū)動(dòng)模塊數(shù)量
設(shè)計(jì)規(guī)則由半導(dǎo)體廠商提供的工藝庫(kù)決定。這些規(guī)則按優(yōu)先級(jí)排序包括,最大電容負(fù)載,最大轉(zhuǎn)換時(shí)間,最大扇出。如果設(shè)計(jì)中單元的驅(qū)動(dòng)負(fù)載超過設(shè)計(jì)規(guī)則給定的最大電容負(fù)載,半導(dǎo)體廠商不能保證芯片能正常工作。
set_max_capacitance設(shè)置一個(gè)節(jié)點(diǎn)的最大電容。
從工藝庫(kù)找出設(shè)計(jì)中預(yù)期驅(qū)動(dòng)器的最大允許電容負(fù)載
set DRIVE_PIN TECH_LIB/invla27/Y
set MAX_CAP [get_attribute $DRIVE_PIN max_capacitance] // 假設(shè)為3.6
在驅(qū)動(dòng)器增加一些富裕量使DC不會(huì)滿載
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施加的最大內(nèi)部負(fù)載是 1.8-1.2 = 0.6pF
set_max_transition設(shè)置一個(gè)節(jié)點(diǎn)的最大轉(zhuǎn)換時(shí)間
max_transition的值一般不要超過預(yù)期驅(qū)動(dòng)器的最大允許轉(zhuǎn)換時(shí)間。
set_max_fanout設(shè)置一個(gè)節(jié)點(diǎn)的最大扇出值。注意這里的值不是值扇出數(shù)目,而是扇出負(fù)載的值。
例如,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這個(gè)節(jié)點(diǎn)可以接24個(gè)INV1,或者兩個(gè)INV2
設(shè)計(jì)中所有的時(shí)鐘信號(hào)都來自同一個(gè)時(shí)鐘源。例如對(duì)200M時(shí)鐘進(jìn)行2分頻,4分頻,分別送給A,B兩個(gè)模塊。A,B模塊有信號(hào)互相傳輸,對(duì)B模塊約束時(shí),可先定義虛擬時(shí)鐘,用虛擬時(shí)鐘對(duì)輸入輸出信號(hào)進(jìn)行約束。
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]
異步電路時(shí)鐘來自于不同時(shí)鐘源,時(shí)鐘之間是不同頻率或同頻不同相的關(guān)系。對(duì)于穿過異步邊界的任何路徑,我們不需要對(duì)此做任何優(yōu)化,因?yàn)椴煌瑫r(shí)鐘的之間的相位關(guān)系是不確定的。使用set_false_path命令對(duì)這些路徑做優(yōu)化。
set_false_path -from [get_ports CLKA] -to [get_ports CLKB]
該命令除了約束異步路徑,還用于約束“偽路徑”,物理上存在,但沒有數(shù)據(jù)傳輸。用report_timing_requirements -ignored命令報(bào)告無效路徑。要去掉任何不要的例外,可使用reset_path命令。
假設(shè)時(shí)鐘周期為10ns,加法器的延時(shí)約為6個(gè)時(shí)鐘周期,則加法器允許的最大延時(shí)是:
60-T_setup-T_uncertainty-T_clk_q
加法器的最小延時(shí)是:
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個(gè)時(shí)鐘周期時(shí)檢查保持時(shí)間,在第0個(gè)時(shí)鐘周期時(shí)檢查建立時(shí)間。

門控是低功耗設(shè)計(jì)的有效方法,常用帶鎖存器的門控電路:

DC能自動(dòng)辨認(rèn)門控時(shí)鐘電路,綜合時(shí),根據(jù)下面的約束在門控時(shí)鐘電路中增加/刪除邏輯以滿足使能信號(hào)的建立和保持時(shí)間要求
set_clock_gating_check -setup 0.5 -hold 0.5 [current_design]
對(duì)于帶時(shí)鐘選擇的電路,可使用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]
對(duì)于分頻器產(chǎn)生的時(shí)鐘,使用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