6 / 24 · 概念
FSMで共有リソースをスケジュールする
状態遷移と取り込みを定義し、1つの加算器で4個の値を累積します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
制御状態は演算のスケジュールを表す
共有リソースでは演算を時間軸上でスケジュールする必要があります。1つの加算器と10ビットのアキュムレータを使ってx0からx3を加算する例を考えます。要求を受け入れるときに4個のオペランドをすべて取り込みます。後から外部入力が変わっても、未完了の要求を変えてはいけません。コントローラはオペランドを選択し、累積を有効にし、結果が有効になる時点を決めます。
状態はIDLE、ADD0、ADD1、ADD2、ADD3、DONEとします。IDLEでの受け入れエッジは入力を取り込み、accをクリアします。次の4つのエッジでは、保存したオペランドを1個ずつ加算します。ADD3のエッジ直後に最終的な和が格納され、状態がDONEになります。DONEは消費側が受け入れるまで結果を保持します。この簡単な版は、そのエッジでIDLEに戻り、新しい要求を同時に受け入れません。
| エッジ | 更新前の状態 | 動作 | 更新後のacc |
|---|---|---|---|
| 0 | IDLE | 3,5,7,9を取り込み、accをクリア | 0 |
| 1 | ADD0 | 3を加算 | 3 |
| 2 | ADD1 | 5を加算 | 8 |
| 3 | ADD2 | 7を加算 | 15 |
| 4 | ADD3 | 9を加算し、DONEへ移行 | 24 |
| 5 | DONE | 消費側が結果を受け入れ | 24 |
エッジ4の後に結果が利用可能になることと、エッジ5で転送されることを区別します。消費側のストールによりDONEはいつまでも続く可能性があります。リソースの再利用は算術ハードウェアを減らしますが、毎サイクル受け入れるパイプラインに比べスループットを制限します。完了と新しい要求の受け入れを同時に行うには、古い結果の引き渡しと新しい要求の初期化の優先順位を明示する必要があります。
- IDLE: 4個すべての値を受け入れて取り込む
- ADD0..ADD3: 4つのエッジで1つの加算器を再利用する
- DONE: 消費されるまで結果を保持する
制御を状態から導きます。ADD状態ではアキュムレータを有効にし、状態に対応するオペランドを選択し、DONEで結果を有効にします。組み合わせの制御出力には既定値を与えます。要求が継続してアサートされても誤って繰り返さないよう、受け入れを定義してください。リセットはIDLEに戻し、未完了の処理を破棄します。カウンタによる実装なら状態の符号化を小さくできますが、エッジごとのスケジュールは同じように必要です。
自分で考えてみましょう
4入力がすべて255のとき、ADD0からADD3の後のaccはいくつですか。エッジ5で出力readyがゼロなら、どうする必要がありますか。
解説を見る
値は255、510、765、1020で、すべて10ビットに収まります。ready=0では引き渡しが起きないため、DONE、acc=1020、valid=1を保持します。