2017-11-30 2 views
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); 

を書き、ワイヤ割り当てを入れ替える場合は、私が期待される結果を得ます。 ワイヤの割り当て順序は問題ではないと思うので、これは奇妙です。

私が気づいていないワイヤアサインメントについては微妙な点がありますか?

答えて

0

あなたは競合状態にあります。組み合わせブロックalwaysがあり、可能なすべてのブランチにRESETを割り当てていません。具体的には、VALID_PKTがfalseになると、RESETはどのように元の値に戻ることができますか?常にブロックを組み合わせから同期に変換することができます。

+0

それは素晴らしいです。私は 'updateReset'と' nextReset'レジスタを作成しました。これらのレジスタは常に組み合わせブロックにセットされ、同期ブロックの 'RESET'に転送されます。すでに櫛ブロックですべての変数が常に設定されるべきであることを読んでください。しかし、この場合、私は次のように書きました。 "[...]レジスタに割り当てます。次の(有効な)パケットが来て変更するまで、どこに残るべきか、すなわち私はしません。 – divB

+2

レディは、ラッチイネーブル(VALID_PKT)とそのデータ入力(SET_RESET)の間のレースです。 –

関連する問題