Bootstrap

说一说system verilog内建函数$value$plusargs()

在学习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()其实是由括号里往外匹配,只要外面传的命令有相同的字符串,就算匹配成功!这个字符串可能是外面命令完整的字符串,也可能是外传字符串的子串

;