出现这个错误的原因在于,在不同的always逻辑块中,对同一个reg变量进行了赋值。在多个alwasy逻辑块同时并行工作的时候,会出现冲突。解决的办法就是,对于一个变量,只在一个always块中,进行赋值。
例如我的代码中,分别有2个always块,内部分别对同一个变量 sda_out 进行的赋值
always@ (*)
case(state)
IDLE:
sda_out <= 1'b1;
START:
if(cnt_i2c_clk <= 2'd0)
sda_out <= 1'b1;
else
sda_out <= 1'b0;
always@ (*)
case(state)
ACK_1,ACK_2,ACK_3,,ACK_4,ACK_5:
if(cnt_i2c_clk == 2'd0)
ack <= sda_in;
else
ack <= ack;
default:
sda_out <= 1'b1; // 估计是粘贴复制,未修改,此处应该为ack <= 1'b1;