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 中。 不要使用它。
您的错误消息来自 error
和 overflow
被声明为 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
我正在尝试测试电线是否打开,以表示我的 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 中。 不要使用它。
您的错误消息来自 error
和 overflow
被声明为 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