тестовый стенд для записи вывода Verilog в текстовый файл

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

Код:

module LFSR( clk,reset,out);
parameter width =4;
input clk,reset;
output [width-1:0] out ;
reg [width-1:0] lfsr;

integer r;
wire feedback = lfsr[width-1]^lfsr[width-2];


always @(posedge clk)
  if (reset)
    begin
      lfsr <= 4'b1000; 
    end
  else
    begin
      lfsr[0] <= feedback;
      for(r=1;r<width;r=r+1)
        lfsr[r]<=lfsr[r-1];
    end

  assign out=lfsr;
endmodule

Испытательный стенд:

module aaatest();

  parameter width =4;
  reg clk,reset;
  wire [width-1:0] out;
  reg [width-1:0] lfsr[13:0];
  integer f,i;

  initial
    begin
      f = $fopen("output.txt","w");
    end

    LFSR patt (clk,reset,out);

    always #5 clk=~clk;

    initial begin
      clk=1; reset=1;
      #10 reset=0;
      # 140 $stop;
    end

    initial
      begin
        clk=1;
        for (i = 0; i<14; i=i+1)
          @(posedge clk)
            lfsr[i]<= out;
      end

    initial begin
      for (i = 0; i<14; i=i+1)
        $fwrite(f,"%b\n",lfsr[i]);
    end

    initial begin
      $display("clk out");
      $monitor("%b,%b", clk, out);
    end   

    initial
      begin
        $fclose(f);  
      end
    endmodule

person user3432905    schedule 01.09.2014    source источник
comment
прилагается код.. если вы можете проверить, плз.. (некоторое время рассматриваю 4-битный LFSR, так как мне нужно внести в него некоторые изменения..) также скажите, есть ли способ сравнить выходные данные в verilog. например, я не хочу, чтобы какой-либо вывод повторялся, так что могу ли я его проверить?   -  person user3432905    schedule 01.09.2014
comment
Если у вас есть другие вопросы, пишите отдельными вопросами. Таким образом, вы получите лучший ответ для каждого из них, и ответы могут быть приняты / одобрены в зависимости от вопроса, на который они отвечают. NB: вы можете изучить утверждения перед публикацией.   -  person Morgan    schedule 02.09.2014


Ответы (1)


Я бы хотел, чтобы вы подумали об этих участках кода:

initial begin
  f = $fopen("output.txt","w");
end

initial begin
  for (i = 0; i<14; i=i+1)
    $fwrite(f,"%b\n",lfsr[i]);
end

initial begin
  $fclose(f);  
end

При описании оборудования у нас есть массовая параллельная симуляция. Все инициалы должны начинаться в одно и то же время, время 0.

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

Что-то вроде ниже может быть более подходящим:

initial begin
  f = $fopen("output.txt","w");

  @(negedge reset); //Wait for reset to be released
  @(posedge clk);   //Wait for fisrt clock out of reset

  for (i = 0; i<14; i=i+1) begin
    $fwrite(f,"%b\n",lfsr[i]);
  end

  $fclose(f);  
end

Чтобы отреагировать на предложения Грега о слишком раннем выпуске сброса, рассмотрите что-то похожее на:

initial begin
  clk=0; reset=1; //Clock low at time zero
  @(posedge clk);
  @(posedge clk);
  reset=0;
  # 140 $stop;
end

Которые поддерживают сброс в течение 2 нарастающих фронтов тактов.

Обновление с рабочим примером

Происходит несколько странных вещей, вы вызываете $stop (не $finish) после #140, но также пытаетесь зациклиться 14 раз, $stop означает, что выполняются только 4 цикла.

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

Следующий пример правильно имитирует и записывает текстовый файл, который вы ищете:

module aaatest();

  parameter width =4;
  reg   clk,reset;
  wire [width-1:0] out;
  reg  [width-1:0] lfsr[13:0];
  integer f,i;

  LFSR patt (clk,reset,out);

  always #5 clk=~clk;

  //Clock and reset release
  initial begin
    clk=0; reset=1; //Clock low at time zero
    @(posedge clk);
    @(posedge clk);
    reset=0;
  end

  initial begin
    f = $fopen("output.txt","w");

    @(negedge reset); //Wait for reset to be released
    @(posedge clk);   //Wait for fisrt clock out of reset

    for (i = 0; i<14; i=i+1) begin
      @(posedge clk);
      lfsr[i] <= out;
      $display("LFSR %b", out);
      $fwrite(f,"%b\n",   out);
    end

    $fclose(f);  

    $finish;
  end
endmodule
person Morgan    schedule 02.09.2014
comment
@user3432905 user3432905, вы также можете посмотреть начальный блок, который устанавливает lfsr для вывода. Во-первых, вы устанавливаете в нем clk=1, что не нужно, так как вы имеете дело с clk в другом блоке. Во-вторых, поскольку вы используете неблокирующее присваивание, предложенное Морганом исправление может не уловить обновленный lfsr, потому что fwrite сработает в том же цикле sim, но после того, как выходные данные будут переданы lfsr. - person Unn; 04.09.2014