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

时间:2013-12-02 10:10:04

标签: file-io verilog scanf iteration

我是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

1 个答案:

答案 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