を変更:順序は、私は私のステート・マシンで、以下のデータ遷移を持って行動
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);
を書き、ワイヤ割り当てを入れ替える場合は、私が期待される結果を得ます。 ワイヤの割り当て順序は問題ではないと思うので、これは奇妙です。
私が気づいていないワイヤアサインメントについては微妙な点がありますか?
それは素晴らしいです。私は 'updateReset'と' nextReset'レジスタを作成しました。これらのレジスタは常に組み合わせブロックにセットされ、同期ブロックの 'RESET'に転送されます。すでに櫛ブロックですべての変数が常に設定されるべきであることを読んでください。しかし、この場合、私は次のように書きました。 "[...]レジスタに割り当てます。次の(有効な)パケットが来て変更するまで、どこに残るべきか、すなわち私はしません。 – divB
レディは、ラッチイネーブル(VALID_PKT)とそのデータ入力(SET_RESET)の間のレースです。 –