当我编译Verilog代码时,会收到此消息。有人知道原因吗?

时间:2019-01-27 12:14:09

标签: verilog cpu

编译代码时,出现以下几行的错误消息。有人可以解释。

这是处理器的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 :(得分:2)

您没有执行我要求的操作,即告诉我该代码在哪里。

从错误消息中,我非常怀疑代码位于Always块内:

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

这称为“程序连续分配”。

替代方法是:

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

这是标准作业。

两者之间存在显着差异。通常您不会使用第一种形式(除非您真的非常了解自己在做什么。)

因此,解决方案是删除所有'assign'关键字(如果它们始终位于块内)

始终需要分配:

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

assign write = valid & select;

答案 1 :(得分:0)

简短的答案是您应该删除assign关键字。

assign关键字具有两种不同的含义,具体取决于您未显示的上下文。

在模块的最高级别使用时,assign关键字是一个对RHS更改敏感的永久过程,并将其分配给LHS导线。 assign语句具有与下面的always块相同的功能

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

在过程过程中使用时,它是一个临时过程,每次RHS更改时,都会分配LHS变量。以下两个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