如何在systemverilog测试台上从循环文件中读取输入刺激?
我需要自动验证我的硬件设计。 我以前用VHDL做的是:如何在systemverilog测试台上从循环文件中读取输入刺激?,verilog,hardware,system-verilog,test-bench,Verilog,Hardware,System Verilog,Test Bench,我需要自动验证我的硬件设计。 我以前用VHDL做的是: 使用随机数据创建.txt文件,超过200k(Python) 通过VHDL测试台采集数据,作为硬件设计的输入,然后采集结果 将结果与用C/C++/Python等编写的模型生成的结果进行比较 每件事都是通过终端中启动的脚本来完成的 我想在系统Verilog中做同样的事情,但我遇到了一些麻烦 输入数据文件的典型行(200k中的一行)为: 1 0000000000000000000 1110101 0000000000000000000000000
initial begin
fin_pointer= $fopen("../common/divisorInSample.txt","r");
fout_pointer= $fopen("../common/divisorHWResults.txt","w");
@(posedge rst_n);
@(posedge clk);
while (! $feof(fin_pointer)) begin
$fscanf(fin_pointer,"%b %b %b\n",usigned,dividend,divisor);
valid=1;
@(posedge clk);
valid=0;
@(posedge res_ready);
$fwrite(fout_pointer,"%b %b\n",quotient,reminder);
end
$finish;
$fclose(fin_pointer);
$fclose(fout_pointer);
end
我在fscanf中尝试了不同的格式,如“%b%b%b”。
但我总是有同样的行为:
代码似乎在第一次执行“fwrite”后停止,因为我可以在输出文件中看到正确的结果。
我怎样才能解决这个问题?谢谢我在Vivado 2018.2中使用了您的代码,没有发现任何问题 我不得不做一些更改,但我没有触及文件I/O代码的核心
integer fin_pointer,fout_pointer;
reg usigned;
reg [31:0] dividend,divisor;
task ee_se;
begin
fin_pointer= $fopen("../../../../tbench/se_ee_in.txt","r");
if (fin_pointer==0)
begin
$display("Could not open file '%s' for reading","se_ee_in.txt");
$stop;
end
fout_pointer= $fopen("../../../../se_ee_out.txt","w");
if (fout_pointer==0)
begin
$display("Could not open file '%s' for writing","se_ee_out.txt");
$stop;
end
// @(posedge rst_n);
// @(posedge clk);
# 100;
while (! $feof(fin_pointer)) begin
$fscanf(fin_pointer,"%b %b %b\n",usigned,dividend,divisor);
// valid=1;
// @(posedge clk);
#100 ;
// valid=0;
// @(posedge res_ready);
$fwrite(fout_pointer,"%b %b\n",~dividend,~divisor);
end
$finish;
$fclose(fin_pointer);
$fclose(fout_pointer);
end
endtask
输入文件se_ee_in.txt:
1 00000000000000000000000001110101 00000000000000000000000000001010
0 00000000000000000000000001110111 00000000000000000000000000001111
1 00000000000000000000000001111111 00000000000000000000000000001000
输出文件se_ee_out.txt:
11111111111111111111111110001010 11111111111111111111111111110101
11111111111111111111111110001000 11111111111111111111111111110000
11111111111111111111111110000000 11111111111111111111111111110111
您并没有从“fin_pointer”读取数据,您只使用它来检查文件的结尾。相反,你有一些奇怪的“s”,你试图从中读取。对不起,只是复制代码的错误!显然我是从文件指针上读的我用的是ModelSim的最新版本。。。你知道还有其他的方法来做同样的事情吗?请注意,我的使用、股息和除数被声明为“逻辑”!你认为这可能是问题所在吗?我下载了VIvado,但仍然没有停止模拟!就好像它在最后一次循环时被卡住了