编译代码时,出现以下几行的错误消息。有人可以解释。
这是处理器的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仅会评估一次。
答案 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
。