$value$plusargs
不支持数组,但支持字符串。看IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html§ 21.6“命令行输入”。在 SystemVerilog 中解析字符串虽然有点麻烦,但仍然非常可行,特别是当分隔符表示为单个字符时。这是一个通用字符串解析器,使用 SystemVerilog 队列重新编码索引和字符串方法substr
定义于IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html§ 7.10“队列”和§ 6.16.8“子字符串”
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]);
完整的工作示例:http://www.edaplayground.com/s/6/570 http://www.edaplayground.com/s/6/570