在verilog HDL中读取文本文件
我无法在verilog中读取包含以下内容的文本文件: b05_test.dut.n509 0 我被fgets指令阻塞在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
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(文件故障);结束