0

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

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

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

我不知道电线分配有什么微妙之处吗?

4

1 回答 1

0

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

于 2017-11-30T22:23:50.107 回答