邏輯綜合基本步驟

邏輯綜合基本步驟

綜合是將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ì)約束

約束的目的是模擬芯片真實(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í)鐘約束決定了路徑的最大延時(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è)計(jì)環(huán)境約束

路徑延時(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ī)則約束

設(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

復(fù)雜時(shí)序約束

多時(shí)鐘同步設(shè)計(jì)

設(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è)計(jì)

異步電路時(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è)時(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í)鐘

門控是低功耗設(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]

分頻電路和多路傳輸電路的時(shí)鐘約束

對(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容