Verilog error: not a valid l-value

Verilog error: not a valid l-value

我正在尝试测试电线是否打开,以表示我的 alu 代码中是否有 error/overflow。鉴于此代码:

output reg[3:0]x;                       // line 149
output wire error;
output wire overflow;

always @* begin
    if(error || overflow) begin         
        assign x = 4'b1111;             // line 155
        assign error = ~error;
        assign overflow = ~overflow;
    end else begin
        assign x = opcode;
    end
end

我收到以下错误消息:

uut 是我在测试台中的实例化单元,名为 main

您使用赋值不正确。可以在 always 进程之外使用,但不能在进程内部使用。
此外,分配

需要类型线
wire [3:0] x;
assign x = 4'b1111;

在always进程中,去掉assign语句,直接说

reg [3:0] x;  // Note that this is assigned as a reg now
 always @* begin
    if(blah) begin 
       x = 4'b1111;
    end else begin
       x = opcode;
    end
 end

示例中的代码有几个问题。

1) 您尝试使用 'procedural assignments' 这是一个高级 verilog 主题。换句话说,assign 语句位于 always 块内。这是不可综合的,只能用于 reg 类型,并且在非常特殊的情况下存在于 verilog 中。 不要使用它。

您的错误消息来自 erroroverflow 被声明为 wire

2) 您正在尝试在非时钟逻辑中将值的反转版本分配给自身。它不会像您期望的那样运行。根据使用情况,它要么不能切换,要么会导致无限的零延迟循环,或者在您的情况下,它可能只会产生故障。

因此,您的代码可能如下所示:

input wire clk; // << you need clock
output reg[3:0]x;                       // line 149
output wire error;
output wire overflow;

reg error_reg, overflow_reg; 

 always @(posedge clk) begin
    if(error || overflow) begin         
        x <= 4'b1111;             // line 155
        error_reg <= ~error;
        overflow_reg <= ~overflow;
    end else begin
        x <= opcode;
    end
 assign error = error_reg;
 assign overflow = overflow_reg;
end