我试图测试一条线是否打开,或者表示我的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
我收到以下错误消息:
uut
是我的测试平台中的实例化单元main
答案 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中。 不使用它。
来自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