如何在systemverilog中将值数组作为参数获取,我的要求是我需要从命令行获取一个未定义大小的命令数组,以及如何将这些参数传递给数组/队列
例如:
+CMDS=READ,WRITE,READ_N_WRITE
:它应该被带到一个数组?
答案 0 :(得分:6)
$value$plusargs
不支持数组,它支持字符串。请参阅IEEE Std 1800-2012§21.6“命令行输入”。在SystemVerilog中解析字符串只是有点麻烦但仍然非常可行,尤其是当分隔符表示为单个字符时。以下是使用SystemVerilog队列重新编码索引的通用字符串解析器和IEEE Std 1800-2012§7.10“队列”和第6.16.8节“子程序”中定义的字符串方法substr
function void parse(output string out [], input byte separator, input string in);
int index [$]; // queue
foreach(in[i]) begin // find commas
if (in[i]==separator) begin
index.push_back(i-1); // index before comma
index.push_back(i+1); // index after comma
end
end
index.push_front(0); // first index
index.push_back(in.len()-1); // last index
out = new[index.size()/2];
foreach (out[i]) begin
out[i] = in.substr(index[2*i],index[2*i+1]);
/*$display("cmd[%0d] == in.substr(%0d,%0d) == \"%s\"",
i, index[2*i],index[2*i+1], out[i]); */
end
endfunction : parse
然后将其与$value$plusargs
组合以解析输入:
string cmd[];
string plusarg_string;
if ( $value$plusargs("CMDS=%s",plusarg_string) ) begin
parse(cmd, ",", plusarg_string);
end
foreach(cmd[i])
$display("CMD[%0d]:'%s'",i,cmd[i]);
答案 1 :(得分:3)
根据IEEE Std 1800-2012(第21.6节“命令行输入”),$value$plusargs
系统函数接受字符串,而不是数组。你必须在Verilog中解析字符串,这可能非常麻烦(参见第6.16节“字符串数据类型”的字符串运算符)。
其他选项可能是:
+CMD1=READ +CMD2=WRITE
$readmemh
从文件中读取数据,但这仅限于数字数据$fopen