Чтение файла в Icarus Verilog

У меня есть файл 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, но я надеюсь сделать это таким образом.

Любой совет очень ценится.


person Ian    schedule 02.01.2018    source источник
comment
не используйте ключевые слова verilog в качестве имен модулей, т.е. generate.   -  person Serge    schedule 03.01.2018


Ответы (1)


Для начала: называть модуль после зарезервированного слова «генерировать» - очень плохая идея.

Я не уверен, как я могу вызвать generate.v

Это модуль, а не функция. Вы не можете «вызвать» модуль.

Вы читаете каждую строку из файла и назначаете ее входной переменной модуля. Убедитесь, что вы подождали достаточно долго, прежде чем читать следующую строку для вашего модуля (и всех последующих запускаемых модулей), чтобы завершить обработку ввода. Вы можете подождать несколько тактов или использовать сигнал готовности.

Лучше сделать это ..

Может быть. Если ваш паттерн становится очень большим, вам понадобится большая память.

person Oldfart    schedule 02.01.2018