Когда я компилирую свой код Verilog, я получаю это сообщение. Кто-нибудь знает в чем причина? - PullRequest
0 голосов
/ 27 января 2019

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

Это код verilog для процессора

assign Imm = instruction[7:0];
assign OUT1addr = instruction[2:0];
assign OUT2addr = instruction[10:8];
assign INaddr = instruction[18:16];


assign address = instruction[23:16];

assign address = instruction[7:0];

Следующее сообщение приходит для ВЫШЕ ЛИНИЙ

tgt-vvp Извините: процедурные непрерывные назначения не являютсяпока полностью поддерживается.RHS этого присвоения будет оцениваться только один раз во время выполнения оператора присвоения.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Короткий ответ: вам, вероятно, следует удалить ключевое слово assign.

Ключевое слово assign имеет два разных значения в зависимости от контекста, который вы не показываете.

При использовании наНа верхнем уровне модуля ключевое слово assign является постоянным процессом, чувствительным к изменениям RHS, и назначает его на провод LHS.Оператор assign имеет эквивалентную функциональность для блока always ниже

module mod;
 ...
 assign Awire = B + C;
 always @(B or C) begin
   Areg  = B + C; 
 end
endmodule

При использовании внутри процедурного процесса это временный процесс, который назначает переменную LHS каждый раз, когда изменяется RHS.Два блока always ниже имеют одинаковую функциональность

module top;
  ...
  always @(sel)
    begin
    if (sel)
      assign Areg = B;
    else
      assign Areg = C;
    end
 always @(sel or B or C) // @*
    begin
    if (sel)
      Areg = B;
    else
      Areg = C;
    end
endmodule

К сожалению, почти все инструменты синтеза требуют написания кода с полным списком чувствительности, как в последнем блоке всегда.Таким образом, это исключает возможность использования assign внутри процедурного блока.

0 голосов
/ 27 января 2019

Вы не сделали то, что я просил, чтобы показать мне, где этот код.

Из сообщения об ошибке я очень подозреваю, что код находится внутри всегда блока:

always @( ...)
...
   assign Imm = instruction[7:0];

Это называется "процедурным непрерывным назначением".

Альтернатива:

always @( ...)
...
   Imm = instruction[7:0];

Это стандартное задание.

Между ними есть существенная разница. Обычно вы не используете первую форму (если вы действительно не знаете, что делаете.)

Таким образом, решение состоит в том, чтобы удалить все ключевые слова 'assign' , если они находятся внутри всегда блока .

За пределами всегда нужно задание:

always @( * )
begin
  ...
  x = y ^ z;
end

assign write = valid & select;
...