verilog系统函数:$value$plusargs、$test$plusargs

命令行输入

读取文件以获取用于模拟的信息的另一种方法是使用调用仿真器的命令来指定信息。该信息以**可选参数(plusargs)**的形式提供给仿真器。这些参数形式上与其他仿真器参数不同,因为它们以加号(+)字符开头。

作用:运行仿真时输入参数

$test$plusargs (string)

*用于只输入字符串时

系统函数$test$plusarg搜索用户指定的plusarg_stringplusargs列表。字符串在系统函数的参数中指定为字符串或被解释为字符串的非实数变量。这个字符串不包含命令行参数的前导加号(+)。按照提供的顺序搜索命令行上的plusargs。如果提供的一个plusargs的前缀匹配提供的字符串中的所有字符,则函数返回一个非零整数。如果命令行中没有匹配提供的字符串的plusarg,函数将返回整数值0。

例如:
运行仿真器时添加命令: +HELLO

有如下Verilog代码:

`timescale 1ns/1ps  
module test ();
initial begin
    if ($test$plusargs("HELLO")) $display("Hello argument found.");
    if ($test$plusargs("HE")) $display("The HE subset string is detected.");
    if ($test$plusargs("H")) $display("Argument starting with H found.");
    if ($test$plusargs("HELLO_HERE"))$display("Long argument.");
    if ($test$plusargs("HI")) $display("Simple greeting.");
    if ($test$plusargs("LO")) $display("Does not match.");
end 
endmodule

这里以modelsim仿真软件为例进行仿真: 这将产生下列输出:

在这里插入图片描述

可以看到,执行仿真时在命令后增加+HELLO会产生下面的输出:

Hello argument found.:
The HE subset string is detected.
Argument starting with H found.

说明$test$plusargs执行的是从输入字符串开头开始的部分匹配。

可以输入多个参数:
在这里插入图片描述

$value$plusargs (user_string, variable)

*既可以输入字符串也可以输入各种进制的参数

$value$plusarg系统函数搜索用户指定的plusargs列表(类似于$test$plusargs系统函数)。字符串在系统函数的第一个参数中指定为字符串或被解释为字符串的非实数变量。这个字符串不包含命令行参数的前导加号。按照提供的顺序搜索命令行上的plusargs。如果提供的一个plusargs的前缀匹配提供的字符串中的所有字符,函数将返回一个非零整数,字符串的其余部分将转换为user_string中指定的类型,并将结果值存储在提供的变量中。如果没有找到匹配的字符串,函数将返回整数值0,并且不修改提供的变量。当函数返回0(0)时不会产生任何警告。

user_string的格式如下:“plusarg_string format_string”。格式字符串与$display系统任务相同。这些是唯一有效的(大写和小写以及前导0形式是有效的):

格式说明
%d转换为十进制数
%o转换为八进制数
%h转换为十六进制数
%b转换为二进制数
%e转换为实指数
%f转换为实数
%g转换为实数小数或指数
%s字符串(不转换)

提供给仿真器的plusargs列表中的第一个字符串,它与指定的user_string的plusarg_string部分相匹配,应该是可用于转换的plusarg字符串。匹配的plusarg的剩余部分字符串(剩余部分是plusarg字符串中与用户的plusarg_string匹配的部分后面的部分)将从字符串转换为格式字符串指定的格式,并存储在提供的变量中。如果没有剩余的字符串,则存储到变量中的值应该是0或空字符串值。

如果变量的大小大于转换后的值,则存储的值将被填零到变量的宽度。如果变量不能包含转换后的值,则该值将被截断。如果该值为负数,则认为该值大于所提供的变量。如果字符串中存在可用于转换的字符,而该字符对指定的转换是非法的,则该变量应写入值’bx。

例子:

有如下Verilog代码:

`timescale 1ns/1ps  
module test ();
reg     [255:0]                 testname;
reg     [7:0]                   num;
initial begin
    if ($value$plusargs("TESTNAME=%s", testname)) 
        $display("Running test {%0s}......", testname);
    if ($value$plusargs("num=%d", num)) 
        $display("num= {%0d}......", num);
end 
endmodule

使用modelsim仿真结果:

在这里插入图片描述

可以看到我们输入参数+TESTNAME=dma_test0 +num=1

代码$value$plusargs("TESTNAME=%s", testname)

TESTNAME=进行匹配,然后将剩余的字符串按格式进行转换。

  • 24
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值