如何在systemverilog中获取值数组作为plusargs?

时间:2013-12-11 12:37:53

标签: command-line-arguments verilog system-verilog

如何在systemverilog中将值数组作为参数获取,我的要求是我需要从命令行获取一个未定义大小的命令数组,以及如何将这些参数传递给数组/队列

例如:

+CMDS=READ,WRITE,READ_N_WRITE:它应该被带到一个数组?

2 个答案:

答案 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]);

完整的工作示例:http://www.edaplayground.com/s/6/570

答案 1 :(得分:3)

根据IEEE Std 1800-2012(第21.6节“命令行输入”),$value$plusargs系统函数接受字符串,而不是数组。你必须在Verilog中解析字符串,这可能非常麻烦(参见第6.16节“字符串数据类型”的字符串运算符)。

其他选项可能是:

  1. 使用几个plusargs:+CMD1=READ +CMD2=WRITE
  2. 通过$readmemh从文件中读取数据,但这仅限于数字数据
  3. 通过$fopen
  4. 从文件中读取数据