目錄
一. 前期準備
二. 跑case且分析覆寫率
三. 更換随機種子提高覆寫率
四. 再次分析覆寫率
五. 寫定向激勵去提高覆寫率
六. 覆寫率到100%
一. 前期準備
前期準備工作包括驗證環境的搭建,定義功能覆寫率,準備makefile腳本。熟悉常用指令。
根據自定義的makefile腳本,主要用到三個指令:
任務 | 指令 |
跑一次case | make comp elab run COV=1 TESTNAME=... |
合并覆寫率 | make mergecov |
打開DVE分析覆寫率 | make dvecov |
用sh腳本跑case | source ... |
注意: makefile裡面是否給随機種子+ntb_random_seed,必須加上随機種子,這樣在多次跑相同case的時候才會産生不同的随機種子。
用sh腳本跑case需要提前準備一個sh腳本(友善一次跑多個case),在terminal下touch my_test1即可建立一個名為my_test1的文檔,一般我習慣命名為my_test1,my_test2。在文檔中将多條case和合并覆寫率和打開DVE分析的指令放在其中,随後在terminal中source my_test1則可自動執行下面指令。
一個sh腳本控制的文檔![]()
小白練習跑覆寫率從0到100%
二. 跑case且分析覆寫率
跑一次冒煙測試
跑一次不同位址的測試
跑一次不同位寬的資料測試
字不對齊測試
複位測試
在跑完不同的case後,覆寫率增長如下表
測試 | 代碼覆寫率 | 功能覆寫率 |
冒煙測試 | 71.34 | 20.07 |
不同位址 | 76.34 | 39.80 |
不同位寬 | 79.68 | 52.30 |
字不對齊測試 | 96.68 | 71.05 |
複位測試 | 96.78 | 71.05 |
字不對齊測試後,代碼覆寫率增長比較快,主要是在這個case中首次将data的高16位指派了,前面三個case的指派主要在低16位,于是data高位的代碼toggle覆寫到了。但是覆寫率沒有達到100%,于是我們嘗試更換随機種子重新跑。
三. 更換随機種子提高覆寫率
為了提高覆寫率,可以更換随機種子将中間三個case再跑四次(這裡可以用到sh腳本),但是覆寫率提升并不大,代碼覆寫率沒變,功能覆寫率從71.05%提高到72.37%。
四. 再次分析覆寫率
于是我們分析檢視哪些地方沒有覆寫到,先分析代碼覆寫率的toggle;
- 此時HWDATA和HRDATA在某些位置的toggle還沒有覆寫,可以寫定向激勵去覆寫,依次發送HWDATA的值為32’h0000_0000,32’hFFFF_FFFF, 32’h0000_0000,實作各個bit位的0->1,1->0跳轉;
- HREADY,HREADYOUT由于DUT的行為恒1,是以可以exclude掉;
- HRESP由于設計的DUT恒0,是以可以exclude掉;
- HSELBRAM可以給初值1,在複位任務中非阻塞指派将其置0,随後釋放的時候置1;
- HTRANS由于DUT不支援突發傳輸,是以并沒有BUSY和SEQ狀态,可以exclude掉;
然後分析功能覆寫率:
可以看到多次随機但仍然沒有随機到addr_end,邊界位址難以覆寫到,是以應該寫一個定向激勵去覆寫邊界位址,同時發現非法位址沒有覆寫,因為我們本身并沒有寫非法位址的激勵,是以我們另外寫一個seq,裡面去覆寫這三個點。
注意:主要exclude掉的應該是設計的行為導緻的必然不可能出現的情況。
五. 寫定向激勵去提高覆寫率
寫定向激勵去滿足HWDATA和HRDATA的toggle。
寫定向激勵去滿足功能覆寫率
注意:新寫seq,test,且兩個sv檔案都要放入到頭檔案svh裡面,在test中挂載對應的seq。
六. 覆寫率到100%
将新寫的兩個test放到另一個文檔裡面my_test2。
在重新跑完定向的激勵後,導入之前exclude的檔案,最後發現功能覆寫率和代碼覆寫率均達到100%