【问题标题】:Reading a text file in verilog HDL在 Verilog HDL 中读取文本文件
【发布时间】:2017-06-15 12:41:19
【问题描述】:

我无法在 verilog 中读取包含以下内容的文本文件:

b05_test.dut.n509 0

我被 fgets 指令 scan_faults = $fgets(file_faults , string , data); 阻止,因为它不起作用,我尝试使用 fsancf 没有任何积极结果。

有什么帮助吗?


完整代码:

integer file_faults;
integer scan_faults;
wire data;

initial begin
  file_faults = $fopen("faults.txt", "r");
  if (file_faults == 0) begin
    $display("data_file handle was NULL");
    $finish;
  end
end

always @(* ) begin
  if (!$feof(file_faults)) begin
    scan_faults = $fgets(file_faults , data);
  end
  else begin
    $finish;
    $fclose(file_faults);
  end
end

【问题讨论】:

  • 感谢您的回答,但我在模拟中看不到任何差异,我不明白为什么。实际上我正在尝试将故障注入电路但它不起作用。可以请你帮我解决这个问题?
  • 对不起,我没有解释我要做什么,我有一个电子电路,我想估计它在出现错误时的行为。问题是如何注入使用 verilog 和 modelsim 的单个故障(串行故障注入),所以我想到了编写故障列表并在我的测试平台中读取它。
  • 我使用了 $fscanf,它在 modelsim 上运行良好。我用它来测试我的分支预测器。 $fscanf(data_file, "B%d,%s\n", branch_index_full,captured_data); 为了帮助您,您需要向我们提供您的代码的工作示例。
  • integer file_faults; integer scan_faults; wire data; initial begin file_faults = $fopen("faults.txt", "r"); if (file_faults == 0) begin $display("data_file handle was NULL"); $finish; end end always @(* ) begin if (!$feof(file_faults)) begin scan_faults = $fgets(file_faults , data); end else begin $finish; $fclose(file_faults); end end

标签: verilog


【解决方案1】:

来自IEEE Std 1800-2012 § 21.3.4.2 一次读取一行

可以使用 $fgets 从文件中读取一行。例如:

integer code;
code = $fgets ( str, fd );
fd 指定的文件中将字符读入变量str,直到str 被填满,或者读取换行符并传输到str,或者遇到EOF 条件。如果str 的长度不是整数字节,则不使用最高有效部分字节来确定大小。
如果从文件读取时发生错误,则code 设置为零。否则,在code 中返回读取的字符数。应用程序可以调用$ferror 来确定最近错误的原因(参见 21.3.7)。

因此,您的代码需要如下所示:

integer file_faults;
integer scan_faults;
reg [7:0] data; // needs to be an "integral number of bytes in length"

initial begin
  file_faults = $fopen("faults.txt", "r");
  if (file_faults == 0) begin
    $display("data_file handle was NULL");
    $finish;
  end
  while (!$feof(file_faults)) begin
    scan_faults = $fgets(data, file_faults); // arg order was wrong in original
    $display("scan_faults: %0d  data: %s", scan_faults, data);
  end
  $fclose(file_faults); // Close file before finish
  $finish;
end

如果您想在遇到特定格式时从 a 中取出变量,请查看 $fscanf。请参阅IEEE Std 1800-2012 § 21.3.4.3 读取格式化数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多