我正在尝试使用
$fscanf
函数读取 SystemVerilog 中的 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 的两列读入第一列。如何解决这个问题?
问题是您的文件内容不能很好地使用 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数字而不是字符串,则需要进行更多的字符串解析和转换。