各位朋友,在SystemVerilog中有兩個函數作用很大,他們是:
$test$plusargs ( string )
$value$plusargs ( user_string, variable )
如果驗證平臺是人類的寵物,他們就是人與寵物之間溝通的鑰匙。
如果驗證平臺是一座雄偉的城堡,他們就是城堡內部與外界聯繫的電話。
如果驗證平臺是一杯奶茶,他們就是喝奶茶的那根吸管!!
太感動了,這首詩太美了!
01、怎麼用?
相信從這首詩中大家已經很清楚的知道這兩個函數什麼作用了!沒錯!
我們在仿真運行過程中可以「+」很多的命令字符串,而這兩個函數就是與這些命令字符串裡應外合,從而改變驗證平臺的!
上代碼!
if( $test$plusargs ( 「JERRY_IS_COOL」) )
$display(「jerry is so cool !! 」);
else
$display(「jerry is handsome !! 」);
int jerry_face_score;
if( $value$plusargs ( 「JERRY_FACE_SCORE= %0d」, jerry_face_score ) )
$display(「^_^ jerry_face_score=%0d ^_^」, jerry_face_score );
我們在平臺中加入如上的代碼,然後在仿真運行的命令中加入如下命令:
+JERRY_IS_COOL
+JERRY_FACE_SCORE=100
最後平臺會列印出什麼呢?是的,會列印出如下的字符出來:
jerry is so cool !!
^_^ jerry_face_score=100 ^_^
我們來分析分析哈,稍微觀察不難發現:
$test$plusargs (「JERRY_IS_COOL」) 這個函數只有一個參數,是一個字符串!只要外面傳了這個字符串,那這個函數就會反回1,否則返回0. 如上代碼,當我們傳「JERRY_IS_COOL」時,就返回了1.
$value$plusargs ( 「JERRY_FACE_SCORE= %0d」, jerry_face_score ),這個就更厲害了,兩個參數,前面的參數是一個傳數據的格式,後面是要改變的變量!我們傳+JERRY_FACE_SCORE=100
結合這個函數是什麼意思呢?意思等價於:jerry_face_score=100;
所以通過上面的分析,各位初學者應該明白這兩個函數多牛逼了吧?
$test$plusargs()意味著我們可以通過外面的標記改平臺的邏輯,比如我想給某段代碼加個使能,那有了這個就太方便了!
if( $test$plusargs (「ENABLE」) )
begin
……
end
外面不傳這個ENABLE,它就不使能!
$value$plusargs ( ) 就更厲害了,相當於想傳什麼值就傳什麼值啊!
你可以在外面給值!當然這個函數不一定給值,還可以給字符串!
傳字符串時,我們可以在sequence的重載等處,用處非常廣哦~
02、有什麼坑?
各位觀眾!Jerry要強調的重點來啦!!
大家看這樣一段代碼!!
if( $test$plusargs ( 「JERRY」) )
$display(「JERRY」);
if( $test$plusargs ( 「JERRY1」) )
$display(「JERRY1」);
if( $test$plusargs ( 「JERRY11」) )
$display(「JERRY11」);
if( $test$plusargs ( 「JERRY111」) )
$display(「JERRY111」);
if( $test$plusargs ( 「JERRY_IS_COOL」) )
$display(「JERRY_IS_COOL」);
如果外面傳
+JERRY11
請問會列印哪句話???
有人說,這個不是很明顯嗎?肯定是列印這句:
JERRY11
注意注意!錯了!這就是坑啊!
這句話其實會列印:
JERRY
JERRY1
JERRY11
這三句!!
為什麼強調這個,你用這個功能用的很爽的時候突然發現邏輯和想像中的不一樣了!也許就是這種坑!
為什麼會列印這三句呢?
$test$plusargs()其實是由括號裡往外匹配,只要外面傳的命令有相同的字符串,就算匹配成功!這個字符串可能是外面命令完整的字符串,也可能是外傳字符串的子串!!
所以在此,Jerry建議,就不要打擦邊球了!
用這個傳參數的時候儘量不要產生這種問題,可以多加一些下劃線後綴什麼的嘛~
哈哈,好了,今天Jerry就和大家聊的這裡,你會了嗎?