Процедурное присвоение ошибки незарегистрированному результату не допускается.

я получаю сообщение об ошибке

[Synth 8-2576] процедурное присвоение незарегистрированному результату не разрешено ["lpm_mult.v":29]

Что я делаю не так?

module lpm_mult (
    dataa, datab,     // multiplicand,multiplier
    sum,              // partial sum 
    clock,            // pipeline clock
    clken,            // clock enable
    aclr,             // asynch clear
    result            // product
);

input  clock;
input  clken;
input  aclr;
input  [31:0] dataa;
input  [31:0] datab;
input  [63:0] sum;
output [63:0] result;

always @ (clken or posedge clock) begin
    if (1==clken) begin
        assign result = dataa * datab;
    end
end

endmodule

person Helyx    schedule 17.07.2015    source источник


Ответы (3)


Есть больше проблем, чем сообщение об ошибке. Как уже указывали другие, result следует определять как output reg [63:0] result;

Другие проблемы не вызовут ошибки компиляции; они генерируют неправильное поведение и не синтезируются. С кодом:

always @ (clken or posedge clock) begin
    if (1==clken) begin
        assign result = dataa * datab;
    end
end
  • clken — асинхронный триггер; его не должно быть в списке чувствительности.
  • Оператор assign внутри блока always вызывает процедурное непрерывное присваивание. После запуска назначения оно будет постоянно и немедленно обновляться при любом изменении dataa или datab (игнорируя условия clken и clock).

    • Примечание. IEEE рассматривает возможность обесценивания процедурного непрерывного присваивания, поэтому в будущем он, вероятно, станет незаконным синтаксисом. Стандарт IEEE 1800-2012 C.4.2 Процедурное назначение и операторы отмены назначения:

      Процедурные операторы assign и deassign могут быть источником ошибок проектирования и могут мешать реализации инструмента. Процедурные операторы assign и deassign не предоставляют возможностей, которые нельзя реализовать другим методом, позволяющим избежать этих проблем. Поэтому процедурные операторы assign и deassign находятся в списке устаревших. Другими словами, будущая версия IEEE Std 1800 может не требовать поддержки этих утверждений. Этот текущий стандарт по-прежнему требует инструментов для поддержки процедурных операторов assign и deassign. Однако пользователям настоятельно рекомендуется перенести свой код, чтобы использовать один из альтернативных методов процедурных или непрерывных назначений.

      Обычные непрерывные присваивания (assign за пределами процедурного блока) останутся допустимым юридическим синтаксисом.
      Verilog и SystemVerilog были официально объединены IEEE со стандартом IEEE Std 1800-2009.

  • Синхронная логика должна использовать неблокирующие (<=) назначения. Это допустимый синтаксис для блокировки (=) назначений в синхронных логических блоках, но он не рекомендуется. Использование блокирующих назначений в синхронных логических блоках может вызвать состояние гонки в симуляторе, что приведет к несоответствию поведения между RTL и синтезированной схемой.

    • Note: assign statements must use blocking assignments (non-blocking is illegal syntax).

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

...
output reg [63:0] result;

always @ (posedge clock) begin
    if (clken==1) begin
        result <= dataa * datab;
    end
end
person Greg    schedule 17.07.2015

Вы присваиваете result внутри блока always, что недопустимо, потому что result — это wire, а не reg.

Объявите result следующим образом, чтобы заставить его работать:

output reg [63:0] result;
person mkrieger1    schedule 17.07.2015

По умолчанию все входные и выходные сигналы являются «проводными». Провода не могут быть назначены в процедурных блоках.

output reg [63:0] result;

Это должно исправить ошибку.

person PAVAN ANAND    schedule 17.07.2015