摘要:近年來,由于設計復雜度的增長,對于驗證提出了更高的要求。驗證環境變得越來越大,越來越復雜,設計和驗證的雙重壓力導致仿真變得越來越慢。所有驗證/仿真的速度已經成為當前SOC設計進程中的重大挑戰。本文網絡版地址:http://www.eepw.com.cn/article/192738.htm
關鍵詞:SoC;Synopsys;驗證
DOI: 10.3969/j.issn.1005-5517.2013.12.013
在我們的項目中,我們使用Synopsys的驗證flow以及近年來Synopsys提供的新的方法/工具,比如性能分析工具來分析仿真瓶頸,使用分塊編譯來加速編譯,使用并行多核技術來加速編譯/運行。使用UVM來增加環境的可復用性,等等,這些技術/特性的引入都大幅度加速了我們的仿真速度并減少了仿真時間。
我們的項目是GPU的項目,對于仿真性能有較高的要求,所以在項目中希望使用盡可能多的新技術來縮短仿真時間以及加速驗證。
我們的驗證環境使用UVM標準庫來搭建的。驗證環境如圖1所示。
使用了Synopsys公司的VCS來作為我們的仿真工具。
工具版本:VCS 2012.09-SP1,Verdi 2013.04
硬件環境如表1所示。
加速編譯的方法
隨著電路規模的不斷變大,編譯時間也成為了仿真過程中重要因素,如何加快/重用編譯數據庫,是加速整個仿真過程不可缺少的部分。VCS提供了很多好的技術來加速編譯過程。
并行編譯
當前基本上我們的服務器都能提供多核支持,并行編譯選項可以使用服務器的多核來提供更快的并行處理,來快速編譯生成數據庫。VCS并行編譯的選項如下:
-j[no_of_processes]
比如 vcs –j4 ?,注意no_of_ processes的數目不要超過實際可以提供的物理核數目。
增量編譯
在編譯過程中,VCS會創建設計/驗證的層次結構,當你重新編譯的時候,VCS只會就那些更改的設計單元進行重新編譯,這樣可以縮短編譯時間。現在增量編譯選項已經成為VCS的默認選項。
分區編譯 (Partition Compile)
分區編譯是VCS提供的一個比較新的特性。這個特性可以讓我們把設計/驗證中的實例/模塊分成不同的大得區塊來編譯。這樣如果之后只對其中一部分區塊相關的文件進行了修改,那么可以重用之前分區編譯的數據庫來減少其它區塊編譯的時間,只對修改的區塊進行重新編譯即可。同時針對驗證環境中的package,比如像UVM標準庫或者一些算法庫,分區編譯也可以提前把它們分塊編譯好,然后這樣可以加速驗證環境的編譯速度。
在仿真過程中,運行的時間以及內存消耗是單次仿真的主要瓶頸,因此本文會關注在運行過程中如何提升性能,包括如何找到運行過程的瓶頸以及使用多核技術來加速仿真。
運行性能分析工具
VCS提供了用于分析性能的Profile工具Simprofile,使用在仿真過程中生成時間/內存消耗的報告,然后可以通過對于報告的分析來找到限制當前仿真性能的瓶頸。使用方式:
編譯:%VCS –simprofile –lca –f
flelist.f ?
運行:%simv –simprofle time|mem
一般在運行后會自動生成名為simprofile_dir的報告目錄,也可以后處理生成報告:
%profrpt –output_dir simprofle_dir–view time_all|mem_all
Simprofile會默認生成基于HTML的報告,然后可以進行選擇查看相關的性能選項(支持模塊/功能/DPI/ PLI/約束/覆蓋率等),同時支持對多次仿真的報告進行比較。
多核仿真技術
VCS提供了多核仿真技術用于使用服務器的物理多核來加速仿真。使用多核技術可以把一次仿真的不同部分分配到多個物理運算單元上以達到加速仿真的目的。現在提供了兩種多核模式:應用級并行技術(ALP)和設計級并行技術(DLP),ALP/DLP以及二者的組合通過多核CPU來優化仿真進程。
應用級多核技術(ALP)
應用級多核技術(ALP)是把按照應用把驗證的不同部分(Testbench、SystemVerilog斷言、覆蓋率統計、波形保存等等)放到多個處理核上去做并行運行。
例如:在一個4核服務器上我們可以把覆蓋率統計放到第一個核上,把斷言檢測放到第二個核上,把波形保存放到第三個核上,剩下的仿真放到最后一個核上。結果會看到仿真性能可以得到很大提升。表1是ALP支持的開關參數以及推薦的使用示例
如果VCS使用了ALP+fsdb多核(+mtfsdb),那么會在控制臺看到如下打印:
*Novas* : Multi-Thread VCS dumping is enabled
同時Verdi3自動支持對FSDB進行并行保存,如果使能了并行保存,那么會有如下信息:
*Novas* : Enable parallel dumping
設計級多核技術(DLP)
DLP允許我們可以把一個大的設計分成多個區塊,然后把不同的區塊放入不同的計算核去運行。DLP的一般會根據profiler的報告結果以及設計部件之間的相關性分析來做劃分。把劃分寫入一個配置文件中,然后把這個配置文件讀入VCS進行仿真,比如:
%vcs test.v–parallel+design=partition_cfg.cfg
同時DLP還支持自動分區劃分。考慮到DLP的適用情況以及進度,我們的項目上暫時沒有使用,會在后繼的項目中進行嘗試。
其他進行性能加速的模式
Debug參數
在影響仿真的性能參數中,文件I/O是占很大比重的一部分,所以對于性能的提升,可以從減少磁盤I/O讀取來入手,比較多的磁盤I/O訪問操作就是波形保存的動作。
(1)盡量只保存需要的層次結構的波形而不要總是保存所有芯片的波形
(a)FSDB波形保存
$fsdbDumpvars(1, tb_top);
$fsdbDumpvars(2, tb_top.design_ inst);
(b)VPD波形保存
$vcdpluson (level|\"LVL=integer\",sco pe*,signal*);
(2)可以指定波形保存的時間來進行波形保存
(a)在VCS運行時參數行進行指定(以FSDB為例)
+fsdb+dumpon+time[+htime ]
+fsdb+dumpof+time[+htime]
(b)在驗證環境中進行指定(以VPD為例)
$vcdpluson; // Enable Dumping
#5 $vcdplusof; //Disable Dumping afer 5ns
為了能找到最適合我們驗證環境的性能仿真模式(包括編譯、執行和仿真),以使得我們能得到最大的性能提升增益,我們定義了三種場景模式進行測試,三種模式是:不保存波形、保存FSDB波形和保存VPD波形。然后每種模式下我們還會分為做覆蓋率收集和不做覆蓋率收集兩種情況。
在模式1 (不保存波形中)我們有四個基礎場景,然后針對著四個基礎場景,來進行了如下的組合,編譯:是否開啟快速編譯,運行是否開啟debug_all/debug_pp,是非開啟覆蓋率ALP,共擴展運行為24個場景。
在模式2(保存vpd波形)針對兩個基礎場景,選擇是否開啟和模式1類似的參數,同時還選擇是否進行vpd波形ALP,總共運行16個場景。
模式3(保存fsdb波形)針對兩個基礎場景,在進行和模式2類似的組合之后還組合了是使用verdi3進行波形并行保存還是FSDB ALP,用于比較二者的性能差別。
模式1下各場景仿真性能比較
模式1下的性能比較如表3所示,從表3的運行結果可以看到快速編譯有10%~40%的性能提升,多核技術的使用有最多20+%的速度提升,使用了性能參數之后整體仿真有最大20%的性能提升。
模式2下各場景仿真性能比較
在模式2下的各場景性能比較如表4所示。
(1)不做覆蓋率分析
快速編譯會有最多2倍左右的編譯時間提升,并行VPD保存會有最多20%的仿真時間提升。對于內存空間最多有1.5倍的虛擬內存空間減少以及3倍的memory空間減少。
(2)做覆蓋率分析
快速編譯會有大概2倍左右的編譯時間提升,就總的仿真時間,大概提升1%左右。
多核并行VPD保存以及并行覆蓋率分析對于正常用例仿真時間有1%~9%的提升,會有2倍~3倍的內存使用減少。
模式3各場景仿真性能比較
在開啟FSDB波形保存的場景三,性能比較如表5所示。
(1)關閉覆蓋率分析
Verdi3的并行開關比ALP的并行保存快2%左右,二者性能基本相同。快速編譯會有2倍以上的編譯時間減少,總仿真時間基本相同。并行保存會帶來30%+的仿真時間減少。
(2)開啟覆蓋率分析
從在項目中的結果來看,使用快速編譯選項可以帶來最大2倍的編譯時間提升。當我們運行回歸測試時,如果不做波形保存,快速編譯選項是很好的選擇。并行多核技術可以對于運行時間給與很大的性能提升,不管是進行VPD波形保存還是FSDB波形保存,使用ALP技術都能帶來20%以上的性能提升,性能提升顯著。
另外基于不同的驗證階段,建議使用不同調試粒度的仿真參數,也可以節省很多的仿真時間/內存消耗。后繼我們會考慮使用DLP技術以及一些更新的有關performance的工具去嘗試對性能進行進一步的優化。