verilog $test$testpluargs使用方法介紹
0 前言
這段時(shí)間在整合一個(gè)小ip,因?yàn)橐?yàn)證每個(gè)feature是否可行,需要用testbench + C語言的方式進(jìn)行仿真驗(yàn)證,由于每種feature不僅要在C語言中修改寄存器配置,還要再testbench修改寄存器的配置,這導(dǎo)致每驗(yàn)證一種feature既需要修改C語言,也需要修改testbench,非常繁瑣

并且也不想把所有的feature寫在一個(gè)testbench中(仿真時(shí)間會變長很多,尤其是需要dump波形的時(shí)候),如果驗(yàn)證完一個(gè)feature后,把調(diào)教好的testbench注釋掉,一番注釋下來,看著也惡心,并且等所有feature都搞好后,仿真的時(shí)間還是很長
于是就希望能有一種方式,在驗(yàn)證不同的feature時(shí)可以吃不同的 testbench,一番搜索下來,找到了$test$plusargs
的方法
1 語法介紹
先捋清兩個(gè)詞:plusargs
、plusargs_string
plusargs:仿真時(shí)添加的參數(shù)
plusargs_string:編譯時(shí)提供的字符串
上面提到兩個(gè)詞,編譯和仿真,以vcs為例,整個(gè)執(zhí)行過程主要分為兩步,編譯和仿真(irun/xrun有三步,編譯、細(xì)化elaborate、仿真)
編譯的過程是檢查語法、展開所有的參數(shù)、宏以及include的文件等等;仿真的過程我的理解就是打入設(shè)定的激勵,驗(yàn)證功能是否符合預(yù)期
vcs成功編譯后會生成一個(gè)可執(zhí)行文件simv,如下圖

在執(zhí)行simv即可進(jìn)行仿真
開始介紹主角,直接抄文檔中的例子了
在上面這段代碼中,$test$plusargs("HELLO")
中的HELLO是plusargs_string,也就是編譯時(shí)提供的字符串,編譯完成后,在進(jìn)行仿真時(shí)(執(zhí)行simv),+
不同的plusargs會打印不同的內(nèi)容
只有當(dāng)plusargs_string的內(nèi)容完全匹配plusargs的部分或全部內(nèi)容時(shí),$test$plusargs()
會返回一個(gè)非0的整數(shù)
原文如下:

原文的plusargs是HELLO,并給出了執(zhí)行結(jié)果

2 示例
做個(gè)實(shí)驗(yàn)測試一下,代碼如下:
編譯之后生成可執(zhí)行文件 simv
,然后執(zhí)行simv +test

仿真結(jié)果如下

在上面的例子中,只有test
和te
部分或全部匹配test
,因此只打印了這兩個(gè)語句的內(nèi)容
3 多種情況的testbench怎么寫
就像開頭說的情況,我需要多種testbench如何借助這種方法實(shí)現(xiàn)呢,思路如下:
針對不同的情況,寫多份配置過程,并保存在不同的文本中,比如需要三種配置,可以寫三份文本,并保存為test_1.sv, test_2.sv, test_3.sv
在testbench中,利用plusargs include這三個(gè)文本
給出一個(gè)簡單的模板
在仿真時(shí),通過+
不同的plusargs就可以執(zhí)行不同testbench了