田新華 胡日輝
(上海高性能集成電路設(shè)計中心 上海 201204)
為提升訪存性能,處理器的指令和數(shù)據(jù)CACHE 設(shè)計往往采用定制SRAM 存儲陣列[1~2],這就需要對這些定制陣列的時序和功耗建模,以將其整合到芯片整體設(shè)計與分析流程中。
目前定制SRAM 存儲器陣列的時序和功耗建模大多通過spice仿真模擬來實現(xiàn)[3~4],具體來說,就是根據(jù)存儲陣列的功能及讀寫時序要求,在多種讀寫場景下對其進行時序和功耗模擬[5~7],并從仿真結(jié)果中抽取時序和功耗模型,最終形成lib 文件,整個過程非常繁瑣耗時。為提升工作效率,本文給出了一種借助Siliconsmart 工具對定制SRAM 存儲陣列進行時序和功耗建模的方法,實現(xiàn)了對其時序功耗模型lib 文件的自動抽取,從而更便利地將定制SRAM 存儲陣列設(shè)計整合到后續(xù)更高層次的設(shè)計與分析流程當中。
定制SRAM 存儲器陣列可以分為單端口讀寫、雙端口讀寫等結(jié)構(gòu),主要由SRAM 存儲單元陣列以及外圍字線譯碼電路、靈敏放大器、位選、預充等電路組成[8~13]。圖1給出了數(shù)據(jù)DCACHE 中定制雙端口SRAM 存儲陣列的結(jié)構(gòu)示意圖,圖中白色的小方框是SRAM存儲單元。
圖1 雙端口SRAM存儲陣列結(jié)構(gòu)示意圖
對于單端口讀寫結(jié)構(gòu),存儲單元由6 個晶體管組成,如圖2(a)所示,外圍電路包括一套字線譯碼、靈敏放大器、位選、預充控制等電路,而對于雙端口讀寫結(jié)構(gòu),存儲單元由8 個晶體管組成,如圖2(b)所示,外圍則包括兩套字線譯碼、靈敏放大器、位選、預充等電路分別對應兩個端口,如圖1 所示,可以看到每個存儲單元連接到兩個端口的兩套字線上。
根據(jù)DCACHE 讀寫功能及時序的設(shè)計要求,定制雙端口SRAM 存儲陣列的主要功能[14]描述如下:陣列包含兩個端口,一個為只讀端口P0,在時鐘上升沿讀使能有效時,讀出該端口輸入地址存儲單元中的數(shù)據(jù)并在當拍輸出;另一個端口為讀寫口P1,在時鐘上升沿讀使能有效時,讀出該端口輸入地址存儲單元中的數(shù)據(jù)并在當拍輸出,而在時鐘上升沿寫使能有效時,在當拍將此端口的輸入數(shù)據(jù)寫入輸入地址中存儲單元,讀使能和寫使能同時只能一個有效;SRAM 存儲陣列兩端口相互獨立,可在同拍實現(xiàn)兩個讀操作或一個讀操作和一個寫操作,前端代碼設(shè)計需保證兩端口同時分別進行讀寫操作時,地址不發(fā)生沖突。
圖2 SRAM存儲單元結(jié)構(gòu)
圖3 雙端口SRAM陣列讀操作時序
圖3 給出了雙端口SRAM 陣列的讀操作時序,GClk 為存儲陣列的輸入主時鐘,其上升沿采樣讀使能RdEn 和輸入地址P0Index;preck 時鐘是由GClk 產(chǎn)生的時鐘,低電平時陣列位線rdbl/rdbl_bar被預充到高電平;rdwl 是讀使能RdEn 有效時由譯碼器產(chǎn)生的字線打開信號;saen 為RdEn 有效時生成的靈敏放大器使能信號;在預充階段,rdwl 和saen 不能為高電平,否則會導致預充失?。辉贕Clk上升沿讀地址譯碼,preck 上半拍譯碼完成后讀字線rdwl 到達SRAM 存儲單元的LWLA 端口上,如圖2(b),這時存儲單元的T5 和T6 管打開,由于NT 和NC 中一個為“0”,一個為“1”,rdbl 和rdbl_bar 中的一個開始下降,形成電壓差,當電壓差達到一定的值,saen 信號開始有效,讀出單元數(shù)據(jù)并輸出到dout/dout_bar,最終轉(zhuǎn)換為端口輸出o_P0RdData,完成一次讀操作。
圖4 給出了SRAM 陣列的寫操作時序,在GClk上升沿讀寫端口P1寫使能WrEn有效時,輸入地址P1Index 譯碼;preck 低電平時位線對wrbl/wrbl_bar被預充到高電平,此時寫字線wrwl 和din 不能為“1”,否則將導致預充失敗;preck高電平時,譯碼生成的寫字線wrwl 到達存儲單元端口LWLB,如圖2(b),T7 和T8 管打開,wrbl/wrbl_bar 中的一個根據(jù)din 的值通過T7 或T8 管進行放電,另一個維持不變,這時存儲單元中的NT/NC中的一個隨bl的下降變?yōu)椤?”,另一個保持為“1”;寫入完成后,wrwl 下降,T7 和T8 管關(guān)閉,preck 轉(zhuǎn)為低電平,開始對位線對wrbl/wrbl_bar進行預充,完成一次寫操作。
圖4 雙端口SRAM陣列寫操作時序
本文基于Siliconsmart 工具針對定制SRAM 存儲器開發(fā)了時序功耗模型的自動抽取流程。Siliconsmart是Synopsis提供的一種能對定制電路單元進行模擬刻畫并抽取模型的工具,支持對定制SRAM 存儲器陣列進行模擬刻畫和模型自動抽取[15]。針對上述雙端口SRAM 存儲陣列,整個時序功耗抽取流程如圖5 所示,包括導入設(shè)計數(shù)據(jù)及模板、配置、初次仿真及內(nèi)部約束節(jié)點定位、仿真刻畫、建模五個步驟。
該步驟通過在siliconsmart 的shell 環(huán)境下執(zhí)行如下命令來完成:
import-template xx-netlist xx$CELLName
此步驟的輸入包括:SRAM 存儲陣列帶寄生參數(shù)的網(wǎng)表spf 文件,工藝foundry 提供的spice model文件,全局配置configure.tcl 文件和模板文件template.tcl文件。
全局配置文件configure.tcl 描述了建模過程所需要的溫度、電壓及工藝corner 等PVT 條件,電地pin 名稱、輸入輸出接口pin 的類型信息、還包括spice model文件的路徑、建模仿真器的名稱及其配置選項的信息,此外還包括建模仿真算法所需各種運算資源的調(diào)度方式及其配置信息。
模板文件template.tcl 是Siliconsmart 對定制SRAM 陣列進行模型抽取時所必須提供關(guān)于定制SRAM 存儲陣列結(jié)構(gòu)的描述文件,對于上述雙端口SRAM 存儲陣列,其模板文件內(nèi)容如圖6,圖中兩位的SAEN_SEL用于配置靈敏放大器使能信號SAEN相對preck上升沿的延遲。
圖5 基于Siliconsmart抽取定制SRAM存儲器時序功耗模型流程
完成此步驟后,流程會產(chǎn)生一個$Cellname.inst文件,定制陣列的設(shè)計者需根據(jù)存儲陣列的功能和接口時序關(guān)系在此文件中添加相應配置,對后續(xù)的仿真和建模過程進行配置。
圖6 雙端口SRAM存儲陣列template.tcl配置內(nèi)容
該步驟通過在Siliconsmart 的shell 環(huán)境下運行下列命令來完成:
該步驟吃入全局配置文件configure.tcl 和上一步驟產(chǎn)生的Cellname.inst文件Cellname.inst文件里面已經(jīng)包含了從定制SRAM 存儲器的網(wǎng)表中抽取的端口pin 信息,以及根據(jù)模板template.tcl 得到的接口配置信息等;但是在運行configure配置命令之前,設(shè)計者還需要根據(jù)定制SRAM 陣列的功能和時序要求,添加陣列的狀態(tài)轉(zhuǎn)換表及相應的接口約束到此inst 文件當中,以便對后續(xù)的仿真刻畫和建模過程進行配置,具體如圖7所示。
圖7 定制雙端口SRAM陣列inst文件配置內(nèi)容
圖7 中的add_table 命令給出了定制雙端口SRAM 陣列的狀態(tài)轉(zhuǎn)換表,此表被“:”分成三塊,左邊塊表示陣列輸入pin 的狀態(tài),中間塊表示陣列中的存儲單元和輸出端轉(zhuǎn)換前的初始狀態(tài),其中,mem表示低位地址存儲單元,mem_2表示高位地址存儲單元,iqa/iqb 分別表示端口A/B 的輸出端,右邊塊表示陣列中存儲單元和輸出端發(fā)生轉(zhuǎn)換后的狀態(tài);表中的“r”表示時鐘上升沿,“H/L”表示高/低電平,“-”表示don't care,“n”代表狀態(tài)保持不變。
圖7中的add_forbidden_state給出了輸入pin中讀使能和寫使能在同一端口不能同時有效,在不同端口,操作地址相同時讀使能和寫使能不能同時有效的約束。
此外,add_pin mem_int default-internal-spice{dummy}用于陣列setup/hold 約束的內(nèi)部檢查點定位,將其預置為dummy,在后續(xù)的約束內(nèi)部節(jié)點定位步驟時,dummy 將被改寫替換為實際的setup/hold約束內(nèi)部檢查點,也就是讀寫操作目標存儲單元的網(wǎng)表節(jié)點。
完成配置命令運行后,流程會根據(jù)configure.tcl和$Cellnam.inst 文件的配置,為后續(xù)模擬刻畫步驟生成仿真文件模板、testbench 以及仿真激勵,為后續(xù)的模擬刻畫步驟做準備。
該步驟通過在siliconsmart 的shell 環(huán)境中運行下列命令來完成:
characterize-match delay__GClk__lh__o_P1RdData
find_internal_nodes_for_constraint-match(setup|hold)
通過characterize命令帶-match選項,仿真器將只仿真該定制陣列GClk 上升沿到P1 端口輸出數(shù)據(jù)的讀出延遲的任務,若仿真成功,則驗證了上一步驟inst 文件內(nèi)配置信息的正確性,若失敗,則需要修改上述inst文件。
運行find_internal_nodes_for_constraint 命令將會在定制SRAM 存儲陣列的spf 網(wǎng)表文件中尋找陣列讀寫操作目標存儲單元的存儲節(jié)點NT 做為setup/hold 時序仿真檢查時的內(nèi)部檢查點,步驟完成后流程會自動修改$Cellname.inst 文件中的約束內(nèi)部檢查節(jié)點,將文件中的預置的約束內(nèi)部節(jié)點{dummy}替換為網(wǎng)表中的這個實際的內(nèi)部檢查點。
仿真刻畫步驟通過運行characterize 命令來進行,該步驟根據(jù)配置步驟產(chǎn)生的仿真文件模板以及testbech 文件與仿真激勵,產(chǎn)生若干個模擬仿真任務,這些任務的目標包括:模擬仿真存儲陣列的初始化、讀寫delay、setup/hold 時序、leakage power、輸入pin 翻轉(zhuǎn)時的power 等,每個模擬仿真任務成功完成后都將產(chǎn)生與文件名前綴相關(guān)的任務目標結(jié)果文件,諸如setup __i_P0RdEn__hl__GClk__lh__ACQ_1.sof.gz此類的文件,若模擬仿真任務失敗,則會產(chǎn)生對應的spice 仿真文件供用戶查找失敗原因,再去調(diào)整配置。
當仿真刻畫的所有任務完成后,則進入建模步驟,該步驟通過運行以下命令來完成:
model-timing-power$CellName
該步驟將會吃入仿真刻畫步驟生成的結(jié)果文件,最終為定制SRAM 存儲器產(chǎn)生lib文件。圖8給出了所產(chǎn)生的時序功耗模型lib文件的片段。
我們通過運行上述流程為DCACEH 中使用的定制雙端口SRAM 存儲器抽取了時序功耗模型lib文件,并將其與通過直接多場景spice 仿真得到仿真結(jié)果后通過腳本處理手動得到的lib 文件進行了比對,由于直接多場景spice 仿真結(jié)果的處理腳本只處理時序數(shù)據(jù),即手動生成的lib 文件只有時序信息,故只對兩者的時序結(jié)果進行了比對,比對結(jié)果如表1所示:
圖8 雙端口定制SRAM陣列時序及功耗模型lib文件片段
表1 Siliconsmart建模與hspice+nanotime手動建模時序結(jié)果比較
從上述比較數(shù)據(jù)來看,hold 的偏差似乎較大,但這是由于直接spice 仿真得到的手動建模lib 文件為hold 約束添加了13.5ps 的設(shè)計margin,而siliconsmart 抽取的lib 文件未添加這個margin,故實際偏差應可接受。
另外,通過Siliconsmart 抽取的時序模型比直接spice 仿真手動抽取的模型結(jié)果稍偏樂觀,這是由于Siliconsmart 使用的是包括了整個存儲單元陣列、時鐘、字線譯碼、預充控制、位選和靈敏放大器等所有部分的打平的網(wǎng)表,而直接spice 仿真得到的lib 文件的產(chǎn)生過程,采用的SRAM 陣列只是包含了一列包含位選和靈敏放大器的block 級陣列,根據(jù)多個讀寫場景的仿真結(jié)果產(chǎn)生的手寫model,再通過nanotime 時序分析工具吃入多個例化的block級陣列的model以及時鐘、譯碼電路等進行建模分析得到的lib 文件,其分析是層次化的,這里面會添加一些額外的時序開銷。