$test$plusargs(),$value$plusargs()

$test$plusargs ( string )

$value$plusargs ( user_string, variable )

如果验证平台是人类的宠物,他们就是人与宠物之间沟通的钥匙。

01 怎么用?

相信从这首诗中大家已经很清楚的知道这两个函数什么作用了!没错!

我们在仿真运行过程中可以“+”很多的命令字符串,而这两个函数就是与这些命令字符串里应外合,从而改变验证平台的!

上代码!

if( $test$plusargs ( “xiaoyao_IS_COOL”) )

$display(“xiaoyao is so cool !! ”);

else

$display(“xiaoyao is handsome !! ”);

int jerry_face_score;

if( $value$plusargs ( “XIAOYAO_FACE_SCORE= %0d”, xiaoyao_face_score ) )

$display(“^_^ xiaoyao_face_score=%0d ^_^”, xiaoyao_face_score );

我们在平台中加入如上的代码,然后在仿真运行的命令中加入如下命令:

+XIAOYAO_IS_COOL

+XIAOYAO_FACE_SCORE=100

最后平台会打印出什么呢?是的,会打印出如下的字符出来:

xiaoyao is so cool !!

^_^ xiaoyao_face_score=100 ^_^

我们来分析分析哈,稍微观察不难发现:

$test$plusargs (“XIAOYAO_IS_COOL”) 这个函数只有一个参数,是一个字符串!只要外面传了这个字符串,那这个函数就会反回1,否则返回0. 如上代码,当我们传“XIAOYAO_IS_COOL”时,就返回了1.

$value$plusargs ( “XIAOYAO_FACE_SCORE= %0d”, xiaoyao_face_score ),这个就更厉害了,两个参数,前面的参数是一个传数据的格式,后面是要改变的变量!我们传+XIAOYAO_FACE_SCORE=100

结合这个函数是什么意思呢?意思等价于: xiaoyao_face_score=100;

所以通过上面的分析,各位初学者应该明白这两个函数多牛逼了吧?

$test$plusargs() 意味着我们可以通过外面的标记改平台的逻辑,比如我想给某段代码加个使能,那有了这个就太方便了!

if( $test$plusargs (“ENABLE”) )

begin

……

end

外面不传这个ENABLE,它就不使能!

$value$plusargs ( ) 就更厉害了,相当于想传什么值就传什么值啊!你可以在外面给值!当然这个函数不一定给值,还可以给字符串!传字符串时,我们可以在sequence的重载等处,用处非常广哦~

(1)$test$plusargs

$test$plusargs的主要作用是检查运行时可执行命令中是否存在给定的plusarg,其函数原型为:

$test$plusargs(“plusarg_without_the_+”);

当运行的命令行中传了给定的plusarg,$test$plusargs返回值为1,否则返回值为0。使用$test$plusargs系统函数可以代替+define+定义的宏,+define+定义的宏是在编译时生效的,一旦修改就需要重新编译才能生效,而$test$plusargs系统函数是在运行期间检查命令行的参数,加上或取消该参数定义不需要重新再编译,更加灵活。$test$plusargs常见的一种用法是根据传入的参数,决定是否dump波形。举例如下(这里基于VCS和Verdi):

initial begin

    if ($test$plusargs('DUMP_FSDB')) begin

        $fsdbDumpfile('novas.fsdb');

        $fsdbDumpvars(0, 'top_tb');

    end

end

上述代码中DUMP_FSDB就是plusarg,仅需在Makefile运行命令中加上+DUMP_FSDB,就可以dump fsdb波形;当在Makefile中去掉+DUMP_FSDB,无需重新编译,仅重新运行,会发现仿真没有再dump novas.fsdb波形。

(2)$value$plusargs

$value$plusargs的主要作用是可以使用plusarg将运行时的参数值传递给testbench中的某个信号,从而给tb使用,其函数原型为:

integer=$value$plusargs(“plusarg_format”,signalname);

其中,plusarg_format可以是字符串,也可以是各种进制的参数,signalname是即将传递给的信号。如果$value$plusargs获取到了参数,该函数返回值为1,并修改signalname,否则返回值为0,且不会修改signalname的默认值。$value$plusargs一种常见的用法是将testcase name等参数传递给testbench。举例如下(这里基于VCS和Verdi):

reg [127:0] testname;

initial begin

    if ($value$plusargs('TEST_NAME=%s', testname)) begin

        $display('testname=%s', testname);

    end

end

运行代码前,在makefile中加+TESTNAME=case0,将case0传给tb中的testname。

.$test$plusargs()与$value$plusargs()——TB与命令行交互
$test$plusargs( string ) —— 这个函数只有一个参数,是一个字符串!只要外面传了这个字符串,那这个函数就会反回1,否则返回0.

$value$plusargs ( user_string, variable ) —— 该函数有两个参数,前面的参数是一个传数据的格式,后面是要改变的变量,用处更广

  上述两个系统函数,可以实现外部编译仿真命令与验证平台的沟通连接,如果验证平台是一座雄伟的城堡,他们就是城堡内部与外界联系的电话。;在实际的仿真运行过程中可以“+”很多的命令字符串,而这两个函数就是与这些命令字符串里应外合,从而改变验证平台的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值