這篇文章再探討一下如何利用verilog驗(yàn)證二分法查找的設(shè)計(jì)代碼。
話說IC君當(dāng)時(shí)畢業(yè)的時(shí)候,拿了一個(gè)專門做驗(yàn)證的offer,最終為了愛情放棄了它。現(xiàn)在集成電路的規(guī)模越來越大,需要的驗(yàn)證人員越來越多,薪資待遇也是水漲船高。
verilog驗(yàn)證不同于設(shè)計(jì),不需要遵循可綜合的限制,只要verilog支持的語法都能拿來用,這個(gè)時(shí)候就需要大家發(fā)揮自己的想象力,竭盡所能找到所有的bug,并且能夠快速的報(bào)告錯(cuò)誤。
有時(shí)候甚至可以利用一些腳本自動(dòng)將錯(cuò)誤信息發(fā)送到郵箱。想象一下,下班前丟一個(gè)testbench到服務(wù)器上仿真,第二天上班的時(shí)候喝喝茶看看郵件就把bug抓了,是不是美滋滋的
如果我不是驗(yàn)證工程師,有沒有必要學(xué)點(diǎn)簡(jiǎn)單的驗(yàn)證技術(shù)呢?平時(shí)在做項(xiàng)目的過程中,大家負(fù)責(zé)的電路中可能有很多跟二分法查找類似的小模塊。你可能一不小心寫錯(cuò)了代碼,或者搭錯(cuò)了電路。這些小模塊我們最好隨手驗(yàn)證一下,雖然最終也會(huì)有其它人專門驗(yàn)證,但一些明顯的錯(cuò)誤如果被別人抓到了,還是有點(diǎn)不太爽的。
通常驗(yàn)證的代碼要包含三個(gè)部分:
1) 產(chǎn)生模擬激勵(lì)(波形)。
2) 將輸入激勵(lì)加入到測(cè)試模塊并收集其輸出響應(yīng);
3) 將響應(yīng)輸出與期望值進(jìn)行比較。
1
由于verilog是一個(gè)模擬硬件并行執(zhí)行的過程,所以上面三個(gè)部分沒有順序之分。
將輸入激勵(lì)加入到測(cè)試模塊并收集其輸出響應(yīng):
首先是模塊信號(hào)的定義,輸入信號(hào)會(huì)作為激勵(lì)加入到測(cè)試模塊SAR,SAR的輸出信號(hào)也會(huì)送到tb_sar模塊的線網(wǎng)信號(hào)pucode。
然后就是產(chǎn)生模擬激勵(lì)(波形)的過程:
從前2篇文章我們知道,6位的SAR查找過程需要跳5次clk,每次clk上升沿的INCR可能為1,也可能為0。驗(yàn)證過程必須要覆蓋所有可能的INCR的值。
這里我們?nèi)缟蠄D先產(chǎn)生RSTB 信號(hào),接著CLK信號(hào)toggle 5次,并用val[0],val[1],val[2],val[3],val[4]分別賦值給這5次的INCR,這是代碼中內(nèi)部小for循環(huán)(count)來實(shí)現(xiàn)。
為了遍歷所有的INCR,我們必須重復(fù)前面的過程32次,遍歷val[4:0]的取值從0-31,這樣就可以覆蓋到所有可能的INCR值了。這是代碼中外部大for循環(huán)(val)來實(shí)現(xiàn)。
下面是產(chǎn)生輸出文件的過程,這里我們?cè)O(shè)置輸出結(jié)果的格式是fsdb,當(dāng)然我們也可以設(shè)置成vcd的格式。fsdb的文件size比較小,而且利用verdi的波形工具nWave看起來也比較方便。在實(shí)際項(xiàng)目過程中,有時(shí)候我們要跑的testbench很多,跑出來的結(jié)果文件就會(huì)很多,如果不用fsdb格式,最終需要更大的存儲(chǔ)空間。
fsdb(fast signal database)文件是verdi使用一種專用的數(shù)據(jù)格式,類似于VCD,但是它是只保留了仿真過程中信號(hào)的有用信息,除去了VCD中信息冗余,就像對(duì)VCD數(shù)據(jù)進(jìn)行了一次huffman編碼。因此fsdb數(shù)據(jù)量小,而且會(huì)提高仿真速度。fsdb是通過verilog的PLI接口來實(shí)現(xiàn)的。$fsdbDumpfile,$fsdbDumpvars等
VCD是一個(gè)通用的波形文件格式,是IEEE1364標(biāo)準(zhǔn)(Verilog HDL語言標(biāo)準(zhǔn),p325)中定義的一種ASCII文件.可以通過Verilog HDL的系統(tǒng)函數(shù)$dumpfile,$dumpvars等來生成,基本所有的Verilog仿真器都會(huì)支持。
將響應(yīng)輸出與期望值進(jìn)行比較:
接下來是產(chǎn)生期望值,期望值這里我們定義為nextpu,驗(yàn)證工程師的主要工作職責(zé)就是用與設(shè)計(jì)工程師不同的方法產(chǎn)生期望值。一般的公司都會(huì)是不同的人來做驗(yàn)證,可能有些小公司是一個(gè)人既做設(shè)計(jì)又做驗(yàn)證。
最后是比較期望值和測(cè)試模塊SAR的輸出,如果不同則打印出錯(cuò)誤信息。這里用一個(gè)always語句實(shí)現(xiàn),如果pucode發(fā)生變化就比較結(jié)果,有錯(cuò)誤就輸出到屏幕。
2
下圖就是整個(gè)驗(yàn)證的波形:
可以看出val從0-31依次變化,pucode和nextpu的值也是一樣,沒有什么錯(cuò)誤。
再看一下某一次的二分法查找過程:
首先rstb會(huì)從low到high,這樣pucode就會(huì)被設(shè)置成初始值6'b100000;
在5次clk toggle的過程中,incr一直為0,pucode會(huì)一直發(fā)生變化,最終pucode變?yōu)?'b000001。
驗(yàn)證了我們之前文章的2個(gè)版本的設(shè)計(jì)代碼,竟然都沒有錯(cuò)誤,因?yàn)楸緛砭褪且粋€(gè)小模塊,出現(xiàn)錯(cuò)誤的可能性也不大。
不過沒有錯(cuò)誤,感覺怪怪的,把設(shè)計(jì)代碼改一改,確認(rèn)我們的驗(yàn)證代碼是不是真正起作用了,哈哈。
我們把設(shè)計(jì)代碼中一句:
改成如下所示:
再run一下驗(yàn)證代碼:
pucode和nextpu就有了不一致性:
這時(shí)候debug一下,就很容易定位錯(cuò)誤的代碼。
寫到這里關(guān)于二分法查找(二進(jìn)制搜索/逐次逼近SAR)的學(xué)習(xí)就告一段落了。這個(gè)模塊雖然小,但是起碼把開出spec,設(shè)計(jì)電路,驗(yàn)證電路基本的流程都過了一遍,以后可能還會(huì)嘗試類似小模塊的學(xué)習(xí)。
不積跬步無以至千里,IC的學(xué)習(xí)就是一個(gè)慢慢積累違反人性的過程,希望大家能一起學(xué)習(xí)進(jìn)步~。
-
電路
+關(guān)注
關(guān)注
172文章
5826瀏覽量
171771 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8958瀏覽量
85081 -
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109925
原文標(biāo)題:收尾篇:verilog驗(yàn)證二分法查找
文章出處:【微信號(hào):icstudy,微信公眾號(hào):跟IC君一起學(xué)習(xí)集成電路】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論