在verilog HDL中读取文本文件

在verilog HDL中读取文本文件,verilog,Verilog,我无法在verilog中读取包含以下内容的文本文件: b05_test.dut.n509 0 我被fgets指令阻塞scan\u faults=$fgets(文件错误、字符串、数据)因为它不起作用,我尝试使用fsancf,但没有任何积极的结果 需要帮忙吗 完整代码: integer file_faults; integer scan_faults; wire data; initial begin file_faults = $fopen("faults.txt", "r"); if

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

b05_test.dut.n509 0

我被fgets指令阻塞
scan\u faults=$fgets(文件错误、字符串、数据)因为它不起作用,我尝试使用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
根据§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
如果要在某个变量输入特定格式时将其输出,请查看
$fscanf
。参见§21.3.4.3从§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

如果要在某个变量输入特定格式时将其输出,请查看
$fscanf
。请参见§21.3.4.3读取格式化数据

谢谢您的回答,但我在模拟中没有发现任何差异,我不明白为什么。实际上,我正试图向电路注入故障,但它不起作用。您能帮我一下吗?很抱歉,我没有解释我要做的事情,我有一个电子电路,我想在出现错误时估计它的行为。问题是如何使用verilog和modelsim注入单个故障(串行故障注入),所以我想到了写一个故障列表,并在我的测试台上读取。我使用了$fscanf,它在modelsim上运行良好。我用它来测试我的分支预测器<代码>$fscanf(数据文件,“B%d,%s\n”,分支索引已满,捕获的数据)为了帮助您,您需要给我们一个代码的工作示例。
integer file\u faults;整数扫描错误;有线数据;初始开始文件_faults=$fopen(“faults.txt”,“r”);如果(file_faults==0)开始$display(“数据_文件句柄为空”)$完成;结束始终@(*)开始如果(!$feof(文件故障))开始扫描故障=$fgets(文件故障,数据);结束或开始$finish$fclose(文件故障);end end
谢谢你的回答,但我看不出模拟有什么不同,我不明白为什么。实际上我正试图向电路注入故障,但它不起作用。你能帮我一下吗?很抱歉,我没有解释我要做什么,我有一个电子电路,我想在出现错误时估计它的行为。问题是如何使用verilog和modelsim注入单个故障(串行故障注入),所以我想到了写一个故障列表,并在我的测试台上读取。我使用了$fscanf,它在modelsim上运行良好。我用它来测试我的分支预测器<代码>$fscanf(数据文件,“B%d,%s\n”,分支索引已满,捕获的数据)为了帮助您,您需要给我们一个代码的工作示例。
integer file\u faults;整数扫描错误;有线数据;初始开始文件_faults=$fopen(“faults.txt”,“r”);如果(file_faults==0)开始$display(“数据_文件句柄为空”)$完成;结束始终@(*)开始如果(!$feof(文件故障))开始扫描故障=$fgets(文件故障,数据);结束或开始$finish$fclose(文件故障);结束