一種SoC芯片在Magma Talus下的物理實現
第二章 時序約束設計
本SoC芯片時序約束設計的關鍵在于功耗管理控制模塊的時序約束。
2.1 功耗管理控制(Power Management Controller, PMC)模塊簡介
整個設計中首先考慮的是PMC模塊的約束。PMC模塊是系統(tǒng)用來控制系統(tǒng)功耗的的控制器,可以通過寄存器配置,使SoC芯片在不同工作模式之間進行切換:Slow、Normal、Idle 和Sleep。這些工作模式可以讓用戶根據芯片不同的應用,通過動態(tài)地管理芯片內部各子模塊的時鐘源供給和系統(tǒng)的工作頻率來控制芯片的整體功耗。另外,PMC 還包含了各個子模塊的初粒度的時鐘門控電路,通過寄存器配置可以集中控制、關閉不必要打開的模塊,從而達到降低功耗的目的。模塊具有以下性能指標:
?內置鎖相環(huán)、可動態(tài)變頻;
? 支持Slow、Normal、Idle、Sleep等4種工作模式;
? 支持模塊工作時鐘集中控制策略,芯片各模塊的時鐘可以通過PMC來關閉和打開;
? 低功耗sleep模式下支持DRAM/SDRAM 的數據自刷新,使得DRAM 中的數據可以得到保持;
? 內部具有完整的reset 解決方案,提供3 種reset 選擇:hard reset、soft reset、watchdog reset;
? 內部具有完整的喚醒功能。
PMC模塊包含了異步時鐘動態(tài)選擇電路、同步時鐘動態(tài)選擇電路、時鐘分頻電路、時鐘門控電路、跨時鐘域電路,既存在輸入時鐘,又存在輸出時鐘,是一個與時鐘高度相關、時序違例集中、時序分析較為復雜的電路。PMC模塊的時鐘生成電路結構示意圖如圖4所示:
圖4 時鐘生成圖
系統(tǒng)時鐘經過可配置參數的系統(tǒng)PLL和動態(tài)選擇邏輯后分頻(有1:1、1:2、1:3、1:4四種)。選擇默認的2分頻為CPU 提供時鐘,動態(tài)選擇默認的3分頻為高速總線提供時鐘,高速總線時鐘通過分頻后(有1:1、1:2、1:4、1:8四種),動態(tài)選擇默認的2分頻為低速總線提供時鐘。
2.2 時序約束的一些策略
一個完整的時序約束文件包含時鐘的創(chuàng)建、時鐘的約束、輸入輸出端口的約束及時序違例等。SDC格式的約束可以采用豐富的語法表達出上述內容。而Magma后端工具可以比較容易地識別出該格式的約束。我們采用SDC v1.7格式編寫時序約束,這樣既能為后端實現工具blast、talus識別,又能被靜態(tài)時序分析工具PrimeTime識別。
首先根據設計規(guī)格要求確定時鐘周期,在整個后端設計過程中的不同階段加以調整和修改。為保守計,我們采取冗余設計,最終設定的周期值比規(guī)格要求的值嚴格。Clock latency和clock skew的設置也要根據實際的時鐘樹結構不斷地進行調整和修改。最終合理的時序約束文件是經過反復地實驗不斷地修正而得到的。
復雜的時鐘,復雜的功能模式,必然帶來復雜的時序約束。對其正確、完備的約束施加,是保證后端設計時序分析和優(yōu)化有效的關鍵所在。
而PMC模塊的主要電路,如時鐘門控電路、分頻電路,動態(tài)選擇電路等,采用例化的標準單元以網表的形式直接給出,在用Magma Blast Rtl進行邏輯綜合前,將這些以網表形式存在的單元使用force keep命令,保證時序約束施加點的固定。
在Fix Time前設置時序約束時,采用的方法是3分頻PLL后的源時鐘作為高速總線上的時鐘,低速總線時鐘與高速總線時鐘頻率一致,這樣在邏輯綜合階段時因為還沒有真正的時鐘樹,而設置的約束又比較保守,使綜合結果的時序有較大的冗余,又加快了綜合的速度。
在時鐘樹優(yōu)化時,采用MMMC來進行。我們僅以功耗模式中Normal模式里的兩種在應用時較常用的時鐘使用模式來設置MMMC:一種是3分頻PLL后的源時鐘作為高速總線上的時鐘,低速總線時鐘是高速總線時鐘的2分頻;另外一種模式是使用 1分頻PLL后的源時鐘作為高速總線時鐘,低速總線時鐘與高速總線時鐘頻率及PLL后的源時鐘頻率一致,此時低速總線時鐘頻率高于前一種模式下的時鐘頻率,達到低速總線上模塊能達到的最高頻率。其他模式僅用來分析及優(yōu)化。這樣可以有效加速時鐘樹創(chuàng)建的時間及分析效率。
在約束設計過程中,不可避免的會涉及到各種模式下時鐘間異步關系的設置,我們采用SDC v1.7里面的set_clock_group命令來進行,該命令能有效的表征各個時鐘之間的異步關系,避免了set_false_path繁瑣的設置,并且能夠被Magma Talus軟件轉換為force timing clockgroups命令。下面是該設計中的兩個clock group設置的例子:
set_clock_group -name func_async_ck1 -logically_exclusive
-group [get_clocks "fck2_n"]
-group [get_clocks "hck3_n hck2anu3_n"]
-group [get_clocks "hck2anu4_n"]
set_clock_group -name func_async_ck2 -asynchronous
-group [get_clocks "usb_dev_ck"]
-group [get_clocks "usb_pll_ck"
另外分頻時鐘與源時鐘關系的設置上,我們根據仿真波形來確定分頻時鐘與源時鐘之間的相位關系,從而為create_generated_clock命令在-divide_by,-edges,-invert,-combinational間選擇不同的選項,使分頻時鐘和源時鐘之間的source latency關系很容易就能確定下來,簡化了時序分析。 下面是該設計中幾個分頻時鐘約束的例子:
create_generated_clock -name usb_dev_ck
-divide_by 4 -invert
-source [get_pins "…/OR2CLK_Inst/Z"]
-master_clock [get_clocks "pllout48m"] -add
[get_pins "…/clk_1x_reg/Q"]
create_generated_clock -name rngck8
-edges "7 15 23"
-source [get_pins "…/OR4CLK_Inst/Z"]
-master_clock [get_clocks "pck_n"] -add
[get_pins "…/CLK_CNT_reg[2]/Q"]
create_generated_clock -name pck8_n
-edges "3 11 19"
-source [get_pins "…/OR4CLK_Inst/Z"]
-master_clock [get_clocks "hck3_n"] -add
[get_pins "…/PCLK_DIV8_reg/Q"]
create_generated_clock -name hck_out
-combinational
-source [get_pins "…/OR2CLK_Inst/Z"]
-master_clock [get_clocks "hck3_n"] -add
[get_ports "hclk"]
2.3非時序邏輯時序?。╠ata-to-data timing arc)的處理
SoC中使用到的EE模塊是一個異步IP,時序模型存在非時序邏輯的時序?。╪on-sequential library arc,也即data-to-data timing arc):輸入的數據或控制信號與輸入pin——CEN、WEN之間有data-to-data 的時序弧存在、其中的控制信號CHER、CHWR、ER_ONLY、WR_ONLY與輸出pin——READY之間也存在著data-to-data 的時序弧。綜合工具并不區(qū)分時序邏輯與非時序邏輯的時序弧,只要設計中有時序弧的單元存在,綜合工具就認為應該在相應pin腳設置時鐘,因此在綜合的過程中會認為在CEN、WEN、READY這幾個信號pin應設置時鐘。如果不設置,在綜合過程中,綜合工具的時序分析引擎是報不出任何經過或到CEN、WEN、READY的路徑。而一旦設置為時鐘,就會產生很多false path。我們最后的做法是不在邏輯綜合階段將其設為時鐘,而是將該問題留到時鐘樹優(yōu)化時,使用config timing check data_to_data on 將data-to-data check選項打開,并使用force timing check命令約束相應的時序關系。
評論