Verilog错误:不是有效的l值

时间:2017-11-14 23:29:22

标签: verilog alu

我试图测试一条线是否打开,或者表示我的alu代码中是否有错误/溢出。鉴于此代码:

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

我收到以下错误消息:

Errors

uut是我的测试平台中的实例化单元main

2 个答案:

答案 0 :(得分:0)

您错误地使用了分配。这可以在一个永远的过程之外使用,但不能在一个过程中使用。
此外,类型线是分配

所必需的
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 :(得分:0)

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

1)您尝试使用'程序分配'这是一个高级的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