$fscanf函数在CSV字符串输入时无法正常工作

5jvtdoz2  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(153)

我尝试使用$fscanf函数在SystemVerilog中读取CSV文件。
这是CSV文件的格式:

REG_1,0xab4556
REG_2,0x124d

字符串
等等
我必须扫描这些值并将它们分配给变量Register Name和Value。我将在代码中稍后调用这些值,但现在这是我面临的问题。
这是我用来扫描它的函数:

while (!$feof(file)) begin
    $fscanf(file, "%s,%x", register_name, expected_value);

    $display("Register Name: %s, Value: %h", register_name, expected_value);
end


但是,我得到这样的输出

Register Name: REG_1,0xab4456, Value: 0x00000000


它将CSV文件的两列都阅读到第一个变量中。我如何修复这个问题?

9bfwbjaz

9bfwbjaz1#

问题是您的文件内容不能很好地与Verilog $fscanf一起工作。
%s基本上读取整行。%s是一个字符串格式规范,其中包括逗号。
如果你不能很容易地改变文件的内容,你需要在Verilog中做很多工作。例如,这段代码将每一行读入2个string变量:

module tb;

string register_name, line, expval;
int i;
initial begin
    int file;
    file = $fopen("file.csv", "r");
    while (!$feof(file)) begin
        $fscanf(file, "%s\n", line);
        register_name = "";
        for (i=0; i<line.len(); i++) begin
            if (line[i] == ",") begin
                break;
            end
            register_name = {register_name, line[i]};
        end
        expval = line.substr(i+1, line.len()-1);
        $display("Register Name: %s, Value: %s", register_name, expval);
    end
end

endmodule

字符串
输出量:

Register Name: REG_1, Value: 0xab4556
Register Name: REG_2, Value: 0x124d


如果希望Value被解释为Verilog数字而不是字符串,则需要执行更多的字符串解析和转换。

相关问题