线路语句的顺序改变行为
Order of wire statements change behavior
我的状态机中有以下数据转换:
wire VALID_PKT = (FIFO_DATAIN[7] == 1) & (FIFO_DATAIN[6] == 0)& (FIFO_DATAIN[5] == 1) & (FIFO_DATAIN[1] == 1) & (FIFO_DATAIN[0] == 1);
wire SET_RESET = FIFO_DATAIN[3];
reg RESET;
always @(*) begin
case (CurrentState)
STATE_DECODE: begin
if(VALID_PKT) begin
RESET = SET_RESET;
end
end
endcase
end
这是 RESET
更改的地方。
我的意图是:只有在DECODE状态下,当数据包有效时,才给寄存器赋值。在下一个(有效的)数据包到来并更改它之前它应该停留的位置。
当我用 iVerilog 对此进行仿真时,我得到了意想不到的结果。具体来说,当一个无效数据包(8'b00000000
)到来时,RESET
被设置为零。但这不应该发生,因为 VALID_PKT
不是真的。
现在是奇怪的部分:如果我交换线路分配,即我写
wire SET_RESET = FIFO_DATAIN[3];
wire VALID_PKT = (FIFO_DATAIN[7] == 1) & (FIFO_DATAIN[6] == 0)& (FIFO_DATAIN[5] == 1) & (FIFO_DATAIN[1] == 1) & (FIFO_DATAIN[0] == 1);
然后我得到了预期的结果。
这很奇怪,因为我认为电线分配的顺序无关紧要。
有没有我不知道的电线分配的微妙之处?
您有竞争条件。您有一个组合 always
块,并且没有在所有可能的分支中分配 RESET
。具体来说,如果 VALID_PKT
变为假,RESET
怎么可能回到它以前的值?您可能希望将 always 块从组合块转换为同步块。
我的状态机中有以下数据转换:
wire VALID_PKT = (FIFO_DATAIN[7] == 1) & (FIFO_DATAIN[6] == 0)& (FIFO_DATAIN[5] == 1) & (FIFO_DATAIN[1] == 1) & (FIFO_DATAIN[0] == 1);
wire SET_RESET = FIFO_DATAIN[3];
reg RESET;
always @(*) begin
case (CurrentState)
STATE_DECODE: begin
if(VALID_PKT) begin
RESET = SET_RESET;
end
end
endcase
end
这是 RESET
更改的地方。
我的意图是:只有在DECODE状态下,当数据包有效时,才给寄存器赋值。在下一个(有效的)数据包到来并更改它之前它应该停留的位置。
当我用 iVerilog 对此进行仿真时,我得到了意想不到的结果。具体来说,当一个无效数据包(8'b00000000
)到来时,RESET
被设置为零。但这不应该发生,因为 VALID_PKT
不是真的。
现在是奇怪的部分:如果我交换线路分配,即我写
wire SET_RESET = FIFO_DATAIN[3];
wire VALID_PKT = (FIFO_DATAIN[7] == 1) & (FIFO_DATAIN[6] == 0)& (FIFO_DATAIN[5] == 1) & (FIFO_DATAIN[1] == 1) & (FIFO_DATAIN[0] == 1);
然后我得到了预期的结果。 这很奇怪,因为我认为电线分配的顺序无关紧要。
有没有我不知道的电线分配的微妙之处?
您有竞争条件。您有一个组合 always
块,并且没有在所有可能的分支中分配 RESET
。具体来说,如果 VALID_PKT
变为假,RESET
怎么可能回到它以前的值?您可能希望将 always 块从组合块转换为同步块。