本文主要是介绍IEEE SystemVerilog Chapter21.6:Command line input,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
读取文件以获得在仿真中使用的信息的替代方案是用调用仿真器的命令指定信息。该信息以可选参数的形式提供给仿真器。这些参数与其他仿真器参数的区别在于它们以加号(+)字符开头。
以下称为plusargs的这些参数可通过以下系统函数访问:
$test$plusargs ( string )
$value$plusargs ( user_string, variable )
$test$plusargs系统函数在plusarg列表中搜索用户指定的plusarg_string。字符串在系统函数的参数中指定为字符串或解释为字符串的整型变量。如果使用变量来指定字符串,则应忽略变量中的前导null,并且不应视为匹配字符串的一部分。该字符串不应包括命令行参数的前导加号。按提供的顺序搜索命令行上存在的plusarg。如果提供的一个plusargs的前缀与提供的字符串中的所有字符匹配,则函数返回非零整数。如果命令行中没有与提供的字符串匹配的plusarg,则函数返回整数值零。
例如:
使用命令运行仿真器: +HELLO
initial beginif ($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.
$value$plusargs系统函数搜索plusarg列表(类似于$test$plusargs系统函数)以查找用户指定的plusarg_string。字符串在系统函数的第一个参数中指定为字符串或解释为字符串的整型变量。如果使用变量来指定字符串,则应忽略变量中的前导null,并且不应视为匹配字符串的一部分。该字符串不应包括命令行参数的前导加号。按提供的顺序搜索命令行上存在的plusarg。如果提供的一个plusargs的前缀与提供的字符串中的所有字符匹配,则函数返回一个非零整数,字符串的其余部分将转换为user_string中指定的类型,并且结果值存储在提供的变量中。如果没有找到匹配的字符串,则函数返回整数值零,并且提供的变量不会被修改。当函数返回零(0)时,不应生成警告。
user_string应采用以下格式:“plusarg_string format_string”。格式字符串与$display系统任务相同。以下是唯一有效的格式字符串(大写和小写以及前导的0格式有效):
%d 十进制转换
%o 八进制转换
%h, %x 十六进制转换
%b 二进制转换
%e 实指数转换
%f 实十进制转换
%g 实数十进制或指数转换
%s 字符串(无转换)
提供给仿真器的plusargs列表中的第一个字符串与指定的user_string的plusarg_string部分匹配,应是可用于转换的plusarg字符串。匹配的plusarg的余数字符串(余数是与用户的plusarg_string匹配的部分之后的plusarg字符串的部分)应从字符串转换为格式字符串指示的格式,并存储在提供的变量中。如果没有剩余的字符串,存储在变量中的值应为零或空字符串值。
如果变量的大小大于转换后的值,则存储的值将以零填充到变量的宽度。如果转换后变量不能包含值,则应截断该值。如果值为负,则应认为该值大于提供的变量。如果可用于转换的字符串中存在对于指定转换非法的字符,则应使用值“bx”写入变量。
考虑下面的SystemVerilog 代码:
`define STRING logic [1024 * 8:1]
module goodtasks;`STRING str;integer i1;logic [31:0] vect;real realvar;initialbeginif ($value$plusargs("TEST=%d", i1))$display("value was %d", i1);else$display("+TEST= not found");#100 $finish;end
endmodule
module ieee1364_example;real frequency;logic [8*32:1] testname;logic [64*8:1] pstring;logic clk;initialbeginif ($value$plusargs("TESTNAME=%s",testname))begin$display(" TESTNAME= %s.",testname);$finish;endif (!($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
(1)并将plusarg添加到该工具的命令行
+TEST=5
将产生以下输出:
value was 5
frequency = 8.333330
Running text number x.
(2)将plusarg添加到工具的命令行
+TESTNAME=t1
将产生以下输出:
+TEST= not foundTESTNAME= t1.
(3)将plusarg添加到工具的命令行:
+FREQ+9.234
将产生以下输出:
+TEST= not found
frequency = 9.234000
(4)将plusarg添加到工具的命令行:
+TEST23
将产生以下输出:
+TEST= not found
frequency = 8.333330
Running test number 23.
这篇关于IEEE SystemVerilog Chapter21.6:Command line input的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!