File io 从verilog中的多个文件迭代读取数据

File io 从verilog中的多个文件迭代读取数据,file-io,verilog,scanf,iteration,File Io,Verilog,Scanf,Iteration,我是Verilog新手,我必须为我设计的核心创建一个测试台文件。 在测试台上,我需要从txt文件中读取数据,并将它们作为输入输入输入到我的设计中。然后,设计的输出将写入一个输出txt文件。 对于一个输入文件和一个输出文件(使用fscanf读取一个文件,处理数据并使用fwrite将输出写入另一个文件),我已经做到了这一点 现在,我想通过从多个文件读取数据并将输出结果写入多个输出文件来进一步测试我的设计 例如,我希望有1000个输入文件,从中迭代读取数据并将其提供给我的设计,然后将输出写入1000个

我是Verilog新手,我必须为我设计的核心创建一个测试台文件。 在测试台上,我需要从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

下面应该让您开始,它加载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并等待时钟的边缘。
#2
似乎是多余的

当仅使用1个参数“filename”调用
$fopen
时,它返回一个32位无符号整数,它是一个MCD多通道描述符。每个文件可以同时打开32个文件中的1位MCD,其优点是一次写入多个文件,一个文件的MCD可以一起或一起写入

自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
整数i;//循环变量
整数j;//循环变量
字符串列表[0:99]//100针
reg[31:0]fd[0:99];
初始开始
列表[0]=“C:/TEST_FILE1.dat”;
列表[1]=“C:/TEST_FILE2.dat”;

对于(i=0;我非常感谢你的回答!但是,我的目标是从10000多个文件中读取数据并创建相应的输出文件…有没有更复杂的方法来实现这一点?@gathanas我知道没有其他方法。可能是从文本文件加载一个文件列表,并将其用作文件的stings列表您的最后一个想法(文本文件中的文件列表,并将其用作要打开的文件的stings列表)是我最好的选择。非常感谢!!我目前正试图在我的verilog测试台上实现这一点,但我还没有成功实现。如果你知道怎么做,我将不胜感激!!@gathanas这可能是另一个问题的一个很好的候选人。只要说出你想做什么,发布你已经尝试过的,你就可以n链接回这个问题。