0

我有一个文件 data.txt,它有 1200 行,每行代表一个 16 位二进制字符串,如下所示。

“0001111111000000”

我正在尝试使用 Icarus Verilog 编写一个测试平台,它读取文件的每一行并将每一行发送到一个 .v 文件,该文件将在文件的每一行上运行一些简单的 if 语句(一个简单的分类算法)。

我的代码如下。

// Verilog test bench for generate.v
`timescale 1ns/100ps
`include "generate.v"

module generate_tb;

$display('running test bench')

   integer               data_file    ; // file handler
   integer               scan_file    ; // file handler
   logic   signed [21:0] captured_data;
   `define NULL 0    

   initial begin
      $dumpfile("generate.vcd");
      $dumpvars(0, generate_tb);

      data_file = $fopen("./data.txt", "r");
      if (data_file == `NULL) begin
         $display("data_file handle was NULL");
         $finish;
      end
   end

   always @(posedge clk) begin
      scan_file = $fscanf(data_file, "%b\n", captured_data); 
      if (!$feof(data_file)) begin
         generate the_circuit(output, captured_data); // HERE
      end
   end

   $finish;
   endmodule

和我的 generate.v 文件:

module generate(actual_class, data_row);

   output actual_class;
   input  data_row;

   wire stby_flag ;
   wire       [0:15] vect;

   reg [0:1] classe;

   assign vect = data_row;

   always  @(posedge clk) begin
        if (vect[3] == 0) begin
            classe = 2'b10;
        end

        if (vect[11] == 0) begin
            classe = 2'b01;
        end

        if (vect[8] == 1 &&  vect[4] + vect[5] + vect[6] + vect[7] >= 3) begin
            classe = 2'b00;
        end

        if (vect[0] + vect[1] + vect[2] + vect[3] + vect[4] + vect[5] + vect[6] + vect[7] + vect[8] + vect[9] + vect[10] + vect[11] + vect[12] + vect[13] + vect[14] + vect[15] <= 1) begin
        classe = 2'b11;
    end

end

assign actual_class = classe;

endmodule

我被困在这部分代码上。我不确定如何为文件的每一行调用 generate.v 文件。

if (!$feof(data_file)) begin
             generate the_circuit(output, captured_data); // HERE
end

一个更好的方法是将我的数据保存到 $readmemb 并使用它,但我希望这样做。

非常感谢任何建议。

4

1 回答 1

0

首先:在保留字“生成”之后命名您的模块是一个非常糟糕的主意。

我不确定如何调用 generate.v

它是一个模块,而不是一个函数。您不能“调用”模块。

您从文件中读取每一行并将其分配给模块的输入变量。确保在读取模块(以及所有后续触发的模块)的下一行以完成输入处理之前等待足够长的时间。您可以等待多个时钟周期或使用“就绪”信号。

更好的方法是..

也许。如果你的模式变得非常大,你需要一个大内存。

于 2018-01-02T21:15:37.347 回答