我是Verilog的新手,我必须为我设计的核心创建一个testbench文件。 在测试平台中,我需要从txt文件中读取数据并将其作为输入提供给我的设计。然后,设计的输出将写入输出txt文件。 我已经设法做了一个关于一个输入文件和一个输出文件(使用fscanf读取文件,处理数据并使用fwrite将输出写入另一个文件)。
现在我想通过从多个文件中读取数据来进一步测试我的设计,并将输出结果写入多个输出文件中。
例如,我想拥有1000个输入文件,迭代地从它们读取数据并将其提供给我的设计,并将输出写入1000个输出文件(读取第一个文件,处理其数据,写入第一个输出文件,读取第二个文件,处理其数据,写入第二个输出文件等)。每个输出文件都将涉及相应的输入文件。在Verilog甚至可能吗?如果是这样,我必须以哪种方式实施它?我在网上搜索了但是我没有找到任何与迭代读/写许多文件有关的内容......
提前致谢!
我用来引导文件和读取数据的代码是:
fd_test = $fopen("C:/TEST_FILE.dat","r");
fd_out_test = $fopen("C:/TEST_OUT_FILE.dat","w");
while(cnt_test>0) begin
if (fifo_read_request) begin
cnt_test = $fscanf(fd_test,"%H",read_block);
mpdu_block = read_block;
end else begin
cnt_test = cnt_test;
mpdu_block = mpdu_block;
end
if (valid_enc_mpdu_block) begin
$fwrite(fd_out_test, "%H\n", enc_mpdu_block);
end
#2; @(posedge clk);
end
答案 0 :(得分:0)
以下内容应该让您入门,它会加载2个文件并同时读取这些行。
initial begin
fd_test1 = $fopen("C:/TEST_FILE.dat","r");
fd_test2 = $fopen("C:/TEST_FILE_2.dat","r");
fd_out_test = $fopen("C:/TEST_OUT_FILE.dat","w");
// Check lines left in file
while((cnt_test>0) & !$feof(fd_test1) & !$feof(fd_test2)) begin
if (fifo_read_request) begin
cnt_test = $fscanf(fd_test1,"%H",read_block);
cnt_test2 = $fscanf(fd_test2,"%H",read_block);
mpdu_block = read_block;
end else begin
cnt_test = cnt_test;
cnt_test2 = cnt_test2;
mpdu_block = mpdu_block;
end
if (valid_enc_mpdu_block) begin
$fwrite(fd_out_test, "%H\n", enc_mpdu_block);
end
#2; @(posedge clk);
end
end
这一行令人困惑#2; @(posedge clk);
为什么要有#2并等待时钟的构成。 #2
似乎是多余的。
当仅使用1个参数'filename'调用$fopen
时,它返回一个32位无符号整数,它是一个MCD,多通道描述符。每个文件获得MCD的1位,同时打开32个文件,优点是一次写入多个文件,文件的MCD可以一起进行OR运算。
自Verilog-2001添加模式'r','w','a'将MCD的输出切换为新格式(fd,文件描述符),允许同时打开更多文件。如果设置了位31,则它是文件描述符。当verilog-95打开第32个文件时,这会破坏向后兼容性。
默认定义了三个fd:
32'h8000_0000 STDIN
32'h8000_0001 STDOUT
32'h8000_0002 STDERR
为了覆盖多个文件,使用for循环可能是一个好主意。
integer i; // loop variable
integer j; // loop variable
string list [0:99]; //100 Stings
reg [31:0] fd [0:99];
initial begin
list[0] = "C:/TEST_FILE1.dat";
list[1] = "C:/TEST_FILE2.dat";
for( i=0; i<100; i=i+1) begin
fd[i] = $fopen(list[i], "r");
end
end
always @(posedge clk) begin
// Every clock load the next sample from all files
for( j=0; j<100; j=j+1) begin
cnt_test[j] = $fscanf(fd[j], "%H", read_block);
end
end