读取文件以获取用于模拟的信息的另一种方法是使用调用仿真器的命令来指定信息。该信息以**可选参数(plusargs)**的形式提供给仿真器。这些参数形式上与其他仿真器参数不同,因为它们以加号(+)字符开头。
作用:运行仿真时输入参数
$test$plusargs (string)*用于只输入字符串时
系统函数$test$plusarg
搜索用户指定的plusarg_string
的plusargs
列表。字符串在系统函数的参数中指定为字符串或被解释为字符串的非实数变量。这个字符串不包含命令行参数的前导加号(+)。按照提供的顺序搜索命令行上的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$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=
进行匹配,然后将剩余的字符串按格式进行转换。