17.10 Command line input
读取文件以获取用于仿真的信息的另一种方法是使用调用模拟器的命令指定信息。该信息以可选参数的形式提供给仿真器。这些参数在视觉上与其他模拟器参数不同,因为它们以加号(+)字符开头。
这些参数,下面称为plusargs,可以通过在17.10.1和17.10.2描述的系统函数访问。
17.10.1 \$test$plusargs (string)
\$test$plusargs系统函数在plusargs列表中搜索用户指定的plusarg_string。该字符串在系统函数的参数中指定为字符串或解释为字符串的非实数变量。此字符串不包括命令行参数的前导加号。在命令行中出现的plusargs将按照提供的顺序进行搜索。如果所提供的plusargs的前缀匹配所提供的字符串中的所有字符,则函数返回一个非零整数。如果命令行中没有plusarg与所提供的字符串匹配,函数将返回整数值零。
例如:
加此命令运行仿真: +HELLO
Verilog代码如下:
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
这将产生以下输出:
Hello argument found.
The HE subset string is detected.
Argument starting with H found.
17.10.2 \$value$plusargs (user_string, variable)
$value\$plusargs系统函数搜索plusargs列表以查找用户指定的plusarg_string。该字符串在系统函数的第一个参数中指定为字符串或解释为字符串的非实数变量。此字符串不包括命令行参数的前导加号。在命令行中出现的plusargs将按照提供的顺序进行搜索。如果所提供的plusargs的前缀与所提供的字符串中的所有字符匹配,该函数将返回一个非零整数,字符串的其余部分将转换为user_string中指定的类型,并将结果值存储在所提供的变量中。如果没有找到匹配的字符串,则函数返回整数值零,并且不修改所提供的变量。当函数返回零(0)时,不应产生警告。
user_string必须是"plusarg_string format_string"的形式。格式字符串与\$display系统任务相同。以下是唯一有效的格式(大写、小写以及前导0形式都是有效的):
格式 | 描述 |
---|---|
%d | decimal conversion |
%o | octal conversion |
%h | hexadecimal conversion |
%b | binary conversion |
%e | real exponential conversion |
%f | real decimal conversion |
%g | real decimal or exponential conversion |
%s | string (no conversion) |
提供给仿真器的plusargs列表中的第一个字符串,它与指定的user_string的plusarg_string部分相匹配,应该是可用于转换的plusarg字符串。匹配plusarg的剩余字符串(剩余部分是plusarg字符串中与用户的plusarg_string匹配的部分之后的部分)应该从字符串转换为格式字符串所指示的格式,并存储在提供的变量中。如果没有剩余的字符串,存储在变量中的值应该是零或空字符串值。
如果变量的大小大于转换后的值,则存储的值将被零填充到变量的宽度。如果变量不能包含转换后的值,则该值将被截断。如果该值为负值,则应认为该值大于所提供的变量。如果可用于转换的字符串中存在的字符在指定的转换中是非法的,则该变量应被写入值’bx。
给定Verilog HDL
`define STRING reg [1024 * 8:1]
module goodtasks;
`STRING str;
integer int;
reg [31:0] vect;
real realvar;
initial
begin
if ($value$plusargs("TEST=%d",int))
$display("value was %d",int);
else
$display("+TEST= not found");
#100 $finish;
end
endmodule
module ieee1364_example;
real frequency;
reg [8*32:1] testname;
reg [64*8:1] pstring;
reg clk;
initial
begin
if ($value$plusargs("TESTNAME=%s",testname))
begin
$display(" TESTNAME= %s.",testname);
$finish;
end
if (!($value$plusargs("FREQ+%0F",frequency)))
frequency = 8.33333; // 166 MHz
$display("frequency = %f",frequency);
pstring = "TEST%d";
if ($value$plusargs(pstring, testname))
$display("Running test number %0d.",testname);
end
endmodule
并在工具的命令行中添加plusarg
+TEST=5
将导致以下输出:
value was 5
frequency = 8.333330
Running text number x.
在工具的命令行中添加plusarg
+TESTNAME=bar
将导致以下输出:
+TEST= not found
TESTNAME=bar.
在工具的命令行中添加plusarg
+FREQ+9.234
将导致以下输出:
+TEST= not found
frequency = 9.234000
在工具的命令行中添加plusarg
+TEST23
将导致以下输出:
+TEST= not found
frequency = 8.333330
Running test number 23.