1 |
BSVの設計トライアル (19) |
実行結果
以下に実行結果を示します。
senderFSM 20 FSM started
receiverFSM 20 receiver FSM started
senderFSM 30 Enq 10
senderFSM 40 Enq 20
receiverFSM 40 FIFO popped data 10
senderFSM 50 Enq 30
receiverFSM 70 FIFO popped data 20
receiverFSM 100 FIFO popped data 30
10nsずつ見ていきます。最初の10nsはリセット期間なので、20nsからFSM動作を開始します。
senderFSM 20 FSM started
receiverFSM 20 receiver FSM started
同時にセンダーFSMとレシーバーFSMが動作を開始しました。
senderFSM 30 Enq 10
センダーFSMがデータ10をエンキューしました。FIFOには1段のデータがあるはずです。
senderFSM 40 Enq 20
receiverFSM 40 FIFO popped data 10
レシーバーFSMが10をデキューすると同時にセンダーFSMがデータ20をエンキューしました。FIFOには差し引き1段のデータがあるはずです。
senderFSM 50 Enq 30
センダーFSMのレイテンシは1サイクル10nsなので次々に(FIFO FULLにならない限り)エンキューします。これが最後のデータです。FIFOには2段のデータがあるはずです。
receiverFSM 70 FIFO popped data 20
レシーバーFSMのレイテンシは3サイクル30nsなので、70nsにならないと次データの20がデキューできません。FIFOには1段のデータがあるはずです。
receiverFSM 100 FIFO popped data 30
レイテンシである3サイクル後にレシーバーFSMがデキューしました。FIFOには0段のデータがあるはずです。つまりFIFOは空になったはずです。
波形で見たほうが判りやすいです。エンキュー動作(オレンジの信号)はFIFOがフルでない限り1サイクルで行われるのに対してデキュー動作(ブルーの信号)は3サイクル毎に実行されています。
以上はデータを3つエンキューした場合ですが、ここで4つ目をエンキューすると動作が異なります。図252.2に示すように、3つまではレイテンシ1でエンキューできていましたが、3つめでFIFO FULLとなり、その後はレシーバーFSMのレイテンシが見えてきます。つまりエンキュー動作もレイテンシが3となります。
実は、FIFO段数もコントロール可能であり、任意の段数のFIFOを作成するにはmkSizedFIFOFを使用します。
FIFOF#(Bit#(8)) fifo <- mkSizedFIFOF(2);
mkSizedFIFOFの引数サイズを2とすると、上記と同じ動作を行います。サイズを1にすると、デキューするまでエンキューが待たされる、図252.3のような動作となります。