Ошибка «Недопустимое значение l» в Verilog - PullRequest
0 голосов
/ 06 июля 2018

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

У меня возникли проблемы со средним значением (проектирование линий 14-17, тестирование 24-28), и я получаю сообщение об ошибке "o2 / out не является допустимым значением l в файле tb.avg." и "o2 / out объявлен здесь как провод". Как мне это исправить?

Вот мой дизайн:

module absolute_value(i1,o1);
  input signed [11:0] i1;
  output signed [11:0] o1;

  assign o1 = i1[11] ? -i1 : i1;
endmodule 

module moving_average(k1,k2,k3,k3,k4,o2,out);
  input k1, k2, k3, k4, k5;
  output [11:0] o2;
  output [11:0] out;
  integer t;

  always begin
    assign o2 = (k1 + k2 + k3 + k4 + k5) / 5;
    assign out = o2;
  end
endmodule

А вот мой испытательный стенд:

module tb;
  reg signed [11:0] i1;
  wire signed [11:0] o1;

  reg k1;
  reg k2;
  reg k3;
  reg k4;
  reg k5;
  wire [11:0] o2;
  wire [11:0] out;

  absolute_value abs(i1,o1);  
  moving_average avg(k1,k2,k3,k4,k5,o2,out);

  integer t;

  initial begin
    for (t = -10; t < 30; t = t + 1) begin
      #1
      i1 <= t;
      $display("i1 = %d, o1 = %d", i1, o1);

      assign k5 = k4 ? k4 : o1;
      assign k4 = k3 ? k3 : o1;
      assign k3 = k2 ? k2 : o1;
      assign k2 = k1 ? k1 : o1;
      assign k1 = o1;

      $display("out = %d", out);

      $moniter($time, "i1 = %d, o1 = %d, o2 = %d, out = %d k1 = %d, k2 = %d, k3 = %d, k4 = %d, k5 = %d", i1, o1, o2, out, k1, k2, k3, k4, k5);
    end
  end
endmodule

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

1 Ответ

0 голосов
/ 06 июля 2018

Как уже упоминалось в комментариях:

Удалить всегда и оставить output [11:0] out
или
Изменить на:

reg [11:0] o2;
reg [11:0] out;
always @( * )
begin
  o2 = (k1 + k2 + k3 + k4 + k5) / 5;
  out = o2;
end

Вторая ошибка: Ваш порт использует k1, k2, k3, k3 , k4 и отсутствует k5.

В-третьих: пожалуйста, не используйте стиль порта прошлого века. Советую перейти на новый формат:

module moving_average(
  input k1, k2, k3, k4, k5,
  output signed [11:0] o2,out
);

Или для второго случая: output signed reg [11:0] o2,out

Далее: это $ монитор, а не $ монитор

...