扫描功能在系统verilog中无法正常工作

问题描述 投票:0回答:1

我正在尝试使用 fscanf 函数读取系统 verilog 中的 csv 文件。 这是csv文件的格式 REG_1,0xab4556 REG_2,0x124d 等等...

我必须扫描这些值并将它们分配给变量寄存器名称和值。 我稍后将在代码中调用这些值,现在这是我面临的问题

这是我用来扫描的功能

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 的两列读入第一列。如何解决这个问题?

csv scanf verilog system-verilog
1个回答
0
投票

问题是您的文件内容不能很好地使用 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
© www.soinside.com 2019 - 2024. All rights reserved.