在晶片研發階段至少存在三種模擬,只有在這三種模擬都透過後才可能進入到晶片的tape out階段,這三種模擬分別是rtl 功能級模擬、綜合後網表模擬(pre gate sim)、PR後網表模擬(post gate sim)。下面簡單記錄一下兩種gate sim模擬。
不論是pre還是post的gate sim都是門級網表的模擬,進行門級模擬主要有兩個目的:1 檢查門級網表的功能是否符合設計意圖;2 將門級網表的模擬波形用於功耗分析。
這裡建議進行門級模擬的case由程式碼設計者或者演算法設計人員提供場景,原因是他們十分清楚什麼樣的場景能充分得到可與目標功耗具有比較意義的功耗資料;同時也建議做門級模擬的人員最好是驗證人員,因為門級模擬的環境是在功能模擬的環境上進行修改得到的,驗證的人員更熟悉驗證環境,同時需要門級功耗資料時已經進行到研發時間緊迫的階段,這樣能減少門級模擬所花費的時間,提升功耗決策效率,而且驗證人員也更熟悉每支case如何確認波形的正確性,避免功耗的輸入波形有誤,造成決策失誤,從而影響專案程序。
門級網表概念
數字前端設計的RTL程式碼 中的暫存器和組合邏輯,其物理實現還是對應到具體閘電路。由於基本的暫存器或組合邏輯,對應的電路結構已經很穩定,電學特性也很明確,故而在綜合級別較高的 EDA 工具中,一般不需要再親自去描述它們的實現方法,而是呼叫現成的庫資訊。EDA 工具會根據 RTL 描述自動編譯出門級的電路描述,這就是門級網表。門級網表分為pr前網表和pr後網表。
-
PR前網表: 又稱為綜合(一般為Design Compiler)後網表,採用的是工藝庫中default的timing,且只有cell的timing資訊。此時由於內部的setup和hold沒有修好,會出現不少violation的情形。
-
PR後網表: 相比於pr前網表,pr後網表加上了buf,decap,filler和antenna等器件,timing資訊也與pr前網表一致。
三、什麼是sdf檔案?
SDF檔案(standard delay format),直譯過來就是標準延時格式。它描述設計中的timing資訊,指明瞭模組管腳與管腳之間的delay,時鐘到資料的delay,內部連線delay等。後端佈局佈線之後由“QRC”出spef,透過PT生成sdf,所以sdf中timing資訊都是佈局佈線之後客觀存在的timing。總而言之,SDF檔案是把佈局佈線過程中的器件延時和線延時資訊記錄下來,從而在進行路徑時序分析時可以將整條路徑的時序計算出來,再根據時序約束條件判斷是否滿足時序要求。
設計過程中如果時序不滿足時需要多次迭代的。每次佈局佈線後都會透過QRC抽取連線寄生引數,配合timing library得到當前的SDF時序反標資訊,從而幫助設計人員對時序違背的路徑進行修改。一般來講,在時序收斂前用SDF分析幫助修改設計,時序滿足後,利用SDF進行動態模擬double check下時序滿足情況。
四、如何反標sdf檔案?
較為常見的方法是在bench中呼叫系統函式$sdf_annotate來完成。還有其他的方法,比如作為elaboration的選項指定等。$sdf_annotate的標準格式如下:
$sdf_annotate(“sdf_file”[,module_instance][,“sdf_configfile”][,“sdf_logfile”][,“mtm_spec”][,“scale_factors”][,“scale_type”]);
其中:
-
“sdf_file”: 指定SDF檔案的路徑。
-
“module_instance”: 指定反標設計的範圍(scope)
-
“sdf_configfile”: 指定SDF配置檔案
-
“sdf_logfile”: 指定VCS儲存error 和warnings訊息的SDF日誌檔案。也可以使用+sdfverbose runtime option來列印所有反標訊息
-
“mtm_spec”: 指定延遲型別"MINIMUM(min)", "TYPICAL(typ)“或者"MAXIMUM(max)”。
-
“scale_factors”: 分別指定min:typ:max的縮放因子,預設是"1.0:1.0:1.0"
-
“scale_type”: 指定縮放之前延遲值的來源。
在反標SDF後,specify塊中定義的延遲不再有用,取代的將是SDF檔案中的延遲。
pre gate sim
前門級模擬使用綜合後的網表進行的,一般綜合時會在ss corner下完成,而用於功耗分析的前門級模擬會在tt corner下進行,因此在用vcs模擬時需要設定+nospecify+notimingcheck,即使加了反標sdf的語句:-sdf min:tb_top.u_asic_top:$(pre_sdf),也是需要設定+nospecify+notimingcheck。
pre gate sim是沒有路徑延時的,但存在cell內部的延時。如果pre gate sim模擬是使用的tt corner,而網表使用的是ss corner,則在pre gate sim模擬時會出現時序違例,模擬錯誤的情況,因此需要+nospecify和+notimingcheck。
為什麼power 只需要在typical corner 做sign off?
關於tt corner、ss corner可以參看如下連結:
Corner晶片TT,FF,SS_tt corner_別想太多的部落格-CSDN部落格
在使用VCS模擬時使用的引數設定可參考如下網址:
模擬條件+nospecify +notimingcheck +delay_mode_zero的區別_no specify_風起雲湧66的部落格-CSDN部落格
post gate sim
post gate sim是對在PR之後的網表和sdf進行功耗分析,在PR之後已經新增了完整的路徑延時且不論是在SS還是TT corner下都應該能滿足時序要求實現晶片功能,因此在進行gate sim模擬時不能使用nospecify和notimingcheck,需要把所有的時序都反標上去,這樣才能盡最大限度的模擬真實晶片工作時的情況(如不同訊號的延時導致毛刺的產生,導致功耗增大)。
同時,post gatesim也是最終網表的時序檢查,當然時序檢查的另一個方法是靜態時序分析(STA)。
在進行post gate sim時會出現某個或者某些寄存的初始值為x,由於X的傳播導致post gate sim無法正常模擬下去;同樣某些memory也存在未初始化最開始的輸出為X,由於X傳播導致模擬不能繼續。因此需要在進行模擬時需要將它們進行初始化,初始化這裡用config_file.txt檔案。
config_file.txt檔案裡的內容格式如下所示
defaultvalue x
tree tb_top.asic_top.u_module_a 0 random
這裡“0”表示hierarchy中的層級,和dumpfsdb裡的層級一個用法,“random”表示為將指定層級的暫存器或者儲存器初始化為某個隨機的確定值。
如果晶片中存在跨時鐘域的同步處理,在post gate sim中可能會出現同步器件時序違例的情況,此時需要對同步器件進行針對性的notimingcheck,此處用config_list.f檔案進行處理。
config_list.f檔案裡的內容如下所示
instance {tb_top.u_asic_top.u_module_b.u_sync1_reg} {noTiming};
以上兩個檔案需要在vcs模擬選項裡手動加上,如:+vcs+initreg+config_list.f+../config_filt.txt \
gatesim debug技巧小記
(1)用gatesim的波形和同一個case的功能模擬波形對比分析;
(2)將門級網表和rtl的Verdi都開啟,追訊號用rtl程式碼對比分析溯源;
(3)門級網表的波形需要核對,比較的除了相應的標誌訊號,還需要比較資料,如最終輸出的資料、輸入到ram的資料作為每次門級網表波形正確的判斷標準;
(4)在追資料X態時,使用Verdi中顯示資料狀態的功能,可以使用快捷鍵——鍵盤的x;
(5)在追資料X態時,需要從整體架構設計出發考慮,結合架構進行追溯X態訊號的出處;
(6)需要明白復位訊號和時鐘訊號的最開始的先後順序,若順序不當則會導致錯誤時序;同時也需要先確認模組的時鐘訊號和復位訊號正確;
(7)跨時鐘域訊號的第一級暫存器時序違例可以忽略,寫在config.list 檔案中;
(8)mem有時需要初始化,未初始化會導致資料無法正常讀寫,可以在tb裡面初始化mem,初始化方式之一:
initial begin #10; for (int i=0;i<128;i++)begin tb_top.u_digital_top.u_a.u_mem.mem[i]=0; end end
(9)rom檔案的.rcf檔案是否載入正確,可以檢視rom的.v檔案中memread處載入的.rcf檔案是否正確(包括路徑是否存在,裡面的資料是否正確);
(10)mem的控制訊號是否正確;
補充1 saif檔案生成
在進行pre gatesim時,有時需要將fsdb波形檔案轉換成saif檔案,用於進行功耗最佳化。用於轉換saif的fsdb生成有一定的要求,格式可參考如下:
$fsdbDumpfile("xx_xx_xx.fsdb");
$fsdbDumpvars(100,"tb_top.u_top_module","+all");
注:tb即testbench的意思,在這個fsdb中不需要tb裡訊號的內容,因此要將層級直接引用到晶片邏輯的頂層。
將生成好的fsdb檔案用fsdb2saif的命令直接在terminal中轉換,格式如下:
fsdb2saif xx_xx_xx.fsdb -o xx_xx_xx.saif
如果波形檔案過大,只需擷取某段時間的波形,命令為:fsdb2saif xx_xx_xx.fsdb -bt 100ns -et 300ns -o xx_xx_xx.saif
補充2 模擬環境建立
可以比對一下功能模擬、pre gatesim和post gatesim的模擬設定。
功能模擬的makefile
VCS_OPTION= -V -Mupdate -full64 -debug_pp -sverilog +v2k +notimingcheck +no_tck_msg \ -P /tools/Synopsys/Verdi2017-SP1/share/PLI/VCS/linux64/verdi.tab \ /tools/Synopsys/Verdi201712-SP1/share/PLI/VCS/linux64/pli.a \ +vcs+initreg+config+config_file.txt \ +nospecify \ +define+vcs+sdfverbose+ASIC+FSDB+$(DF)+$(TC) \ -Marchive=128+noline-transport-pathpulse -timescale=1ns/1ps -notice \
pre gatesim模擬的makefile
VCS_OPTION=-V -Mupdate -full64 -debug_pp -sverilog +v2k +notimingcheck +no_tchk_msg \ -P /tools/Synopsys/Verdi2017-SP1/share/PLI/VCS/linux64/verdi.tab \ /tools/Synopsys/Verdi201712-SP1/share/PLI/VCS/linux64/pli.a \ +vcs+initreg+config+config_file.txt \ +nospecify \ -sdf min:tb_top.u_asic_top: /xx/xx/xx/xx_pre.sdf \ +vcsd+v2k+pathpulse+delay_mode_path+fsdb \ +define+vcs+ASIC+FSDB+$(DF)+$(TC) \ -Marchive=128+noline-transport-pathpulse -timescale=1ns/1ps -notice
post gatesim模擬的makefile
VCS_OPTION=-V -Mupdate -full64 -debug_pp -sverilog +v2k +negdelay +sdfverbose +neg_tchk \ -P /tools/Synopsys/Verdi2017-SP1/share/PLI/VCS/linux64/verdi.tab \ /tools/Synopsys/Verdi201712-SP1/share/PLI/VCS/linux64/pli.a \ -sdf min:tb_top.u_asic_top: /xx/xx/xx/xx_post.sdf \ +vcsd+v2k+pathpulse+delay_mode_path+fsdb \ +optconfigfile+../config.list +vcs+initreg+config+../config_file.txt \ +define+vcs+ASIC+FSDB+$(DF)+$(TC) \ -Marchive=128+noline-transport-pathpulse -timescale=1ns/1ps -notice
而compile的設定除了VCS_OPTION外其它都一樣
compile:
vcs $(VCS_OPTION) \ -f /xx/xx/filelist.f \ -top sim_top_name \ -l /xx/xx/log/xxx_compile.log; \ ./simv+no_pulse_msg +fsdb+force \ -cm line+cond+tgl_fsm+branch -l /xx/xx/log/xxx_sim.log; \
注:這裡的filelist.f應該包含(1)網表檔案;(2)sdf檔案;(3)網表中各種cell對應的Verilog模型的.v檔案;(4)用於驗證模擬的testbench檔案。
補充3 將bin檔案轉成rom檔案
如果是SOC級別的模擬,可能會存在直接將嵌入式人員匯出的bin檔案用於模擬的情況。SOC級別的功能執行是透過CPU讀取指令來調動各個模組協調工作來實現的,而嵌入式匯出的bin檔案就是cpu執行的指令檔案,只不過是二進位制檔案。雖然模擬中指令ROM中儲存的也是二進位制檔案,但模擬時需要ROM的行為級模型中初始化呼叫的可能不是二進位制格式,因此需要將bin檔案轉換成ROM能識別呼叫的檔案格式,因此可以透過linux的od命令來實現。