【问题标题】:iterative read data from more than one files in verilog从verilog中的多个文件迭代读取数据
【发布时间】:2013-12-02 10:10:04
【问题描述】:

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

【问题讨论】:

    标签: file-io verilog scanf iteration


    【解决方案1】:

    以下内容应该可以帮助您入门,它会加载 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 似乎是多余的。

    $fopen 仅使用 1 个参数“文件名”调用时,它返回一个 32 位无符号整数,它是一个 MCD、多通道描述符。每个文件获得 1 位的 MCD,允许同时打开 32 个文件,优点是一次写入多个文件,一个文件的 MCD 可以一起 OR'd。

    自 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
    

    【讨论】:

    • 非常感谢您的回答!但是,我的目标是从 10,000 多个文件中读取数据并创建相应的输出文件......有没有更复杂的方法来做到这一点......?
    • @gathanas 我不知道其他方法。可以从文本文件中加载文件列表,并将其用作要打开的文件的字符串列表。
    • 您的最后一个想法(来自文本文件的文件列表并将其用作要用作要打开的文件的字符串列表。)对我来说是最佳选择。非常感谢你!!我目前尝试在我的 verilog 测试平台中实现这一点,但我还没有设法让它工作。如果你知道怎么做,我会很高兴听到!
    • @gathanas 可能是另一个问题的好人选。只需说出您尝试做什么,发布您尝试过的内容,您就可以链接回这个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2021-03-22
    • 1970-01-01
    • 2015-01-14
    • 2016-07-05
    • 1970-01-01
    • 2012-01-31
    • 2012-01-13
    相关资源
    最近更新 更多