线程语句的顺序改变了行为

时间:2017-11-30 21:08:43

标签: verilog variable-assignment iverilog

我的状态机中有以下数据转换:

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);

然后我得到了预期的结果。 这很奇怪,因为我认为电线分配的顺序无关紧要。

我不知道有关电线分配的任何细微之处吗?

1 个答案:

答案 0 :(得分:0)

你有竞争条件。您有一个组合always块,并且未在所有可能的分支中分配RESET。具体来说,如果VALID_PKT变为假,那么RESET如何回到之前的值?您可能希望将总是从组合转换为同步。