在学习system verilog的时候遇到了一个长的很奇怪的函数,奇怪到啥程度?别的函数都是一个$xxx,这个函数一次来了两个$,长的虽然奇怪,但是这个函数的作用很大。
首先看一下它的基本格式:
$value$plusargs(user_string , variable)
它还有一个和它很像的兄弟
$test$plusargs(string)
01 作用:
如果验证平台是一台汽车,那它就是司机和汽车之间沟通的车钥匙。
如果验证平台是杯可乐,那它就是可乐和嘴巴之间的那根吸管。
怎么样?是不是很形象!?
02 怎么用:
相信大家只看描述还是不太清楚具体应该怎么用这个两个函数,我们在仿真的时候在Makefile中会加很多的编译和执行选项 "+",而这两个函数就是与这些命令字符串里应外合的,把参数传递给验证环境的。
03 举例:
if($value$plusargs("BLOGGER_NAME_IS = %s", name))
$display("blogger's name is %s",name);
在验证平台(tb)中加上上述代码,然后在仿真运行的命令中(Makefile)加上如下的命令:
+BLOGGER_NAME_IS = Pengyuyan
最后验证平台会打印出来啥呢?
blogger's name is Pengyuyan
通过上面的实验是不是能发现点什么东西?
04 理解:
$value$plusargs()这个函数,前一个参数是要传变量的格式(%s),后一个参数是要传的变量具体是谁(Pengyuyan),括号里的 BLOGGER_NAME_IS = 和验证平台中的 +BLOGGER_NAME_IS = 需要保持一致。
函数就是去验证平台中拿 BLOGGER_NAME_IS = Pengyuyan ,然后把Pengyuyan 传递进去到验证平台中去。
再来说说它的兄弟:
$test$plusargs(string)
举个例子:
if( $test$plusargs ( “BLOGGER_IS_COOL”) )
$display(“blogger is so cool !”);
else
$display(“blooger is handsome !”);
在验证环境里加上 +BLOGGER_IS_COOL
验证平台会打印出来啥呢?
打印出来 blogger is so cool !
$test$plusargs(string) 意味着我们可以通过外面的标记修改平台的逻辑,比如我想给某个代码加个使能。
外面不传这个BLOGGER_IS_COOL,它就不能使能。
使用上有什么坑呢?
看一段知乎老哥的代码:
if( $test$plusargs ( “shanghai”) )
$display(“shanghai”);
if( $test$plusargs ( “shanghai1”) )
$display(“shanghai1”);
if( $test$plusargs ( “shanghai11”) )
$display(“shanghai11”);
if( $test$plusargs ( “shanghai111”) )
$display(“shanghai111”);
if( $test$plusargs ( “BLOGGER_IS_COOL”) )
$display(“BLOGGER_IS_COOL”);
如果外面传
+shanghai11
请问会打印哪句话???
有人说,这个不是很明显吗?肯定是打印这句:
shanghai11
注意注意!错了!这就是坑啊!
这句话其实会打印这三句:
shanghai
shanghai1
shanghai11
为什么会打印这三句呢?
$test$plusargs()其实是由括号里往外匹配,只要外面传的命令有相同的字符串,就算匹配成功!这个字符串可能是外面命令完整的字符串,也可能是外传字符串的子串!