![]() |
31 |
BSVにおけるコマンドバッファ制御 (2) |
まず、ChatGPTに、BSVの2線ハンドシェイクアルゴリズムを尋ねてみます。
bluespecのモジュールでは自動的に2線方式のハンドシェークが行われるが、そのアルゴリズムを解説してください。
BSVにおける2線ハンドシェークのアルゴリズム
Bluespec SystemVerilog(BSV)では、モジュール間やルール間の通信において、Ready/Enable方式(2線ハンドシェーク)が自動的に挿入されます。
本記事では、BSVのハンドシェークの動作アルゴリズムをまとめます。
用語定義
- caller:メソッドを呼び出す側。通常はルールや上位モジュール。
- callee:メソッドを提供する側(FIFO, Reg, モジュール等)。
信号の方向:
ready
は callee から caller への出力(callee が「受け入れ可能」かを知らせる)enable
は caller から callee への入力(caller が「今起動する」意思を伝える)
1. ハンドシェークの基本モデル
各メソッド呼び出し(またはルール起動)には、以下の2本の信号が対応します。
信号名 | BSV上の名称 | 役割 |
---|---|---|
Ready | can_fire() |
callee が実行可能であることを示す純組合せフラグ |
Enable | will_fire |
caller が実際に起動する1サイクルパルス |
- FIFOなら
!full
、Regなら常にTrue
など、内部状態から算出される組合せ信号がready
。 enable
はcan_fire
とスケジューラの許可を元に生成され、callee の*_en
ポートに入力されます。
2. 合成フロー(ルール単位)
2.1 各メソッドのcan_fire
取得
rule foo when (guard);
let v <- A.method1; // メソッド呼び出し①
w <- B.method2; // メソッド呼び出し②
endrule
実際は BSC が.can_fire
を各メソッドに自動付与して評価します。
2.2 can_fire_rule
(= 全 Ready の AND)
複数メソッドがある場合、各 callee の Ready を AND し、ガード条件と組み合わせて以下のように合成されます:
wire can_fire_rule = guard && A_ready && B_ready;
2.3 スケジューラ仲裁 (scheduler_grant
)
競合する他ルールとの排他処理・優先度制御が組み合わさり、fire
生成条件となるgrant_rule
が作られます:
wire grant_rule = can_fire_rule & scheduler_logic(...);
2.4 will_fire
(= 発火パルス)
wire will_fire = grant_rule; // 1サイクルだけ true になる
これが Enableパルスとして callee に伝わります。
2.5 Callee への配線(扇形ファンアウト)
assign A_en = will_fire;
assign B_en = will_fire;
caller はfire
をすべての callee に配線します。
2.6 レジスタ書き込みの en 端子にも使用
同じwill_fire
パルスが、そのルール内で行われるレジスタ更新の*_en
信号にも使われます。
【構造図イメージ】
Ready ─────┐
├──> AND (+guard) ──> fire
──┬──> EN_A
Ready ─────┘ └──> EN_B
3. 複数ルール/メソッドの競合処理
- 同一リソースを書き換えるルール同士は、静的スケジューラにより優先順位が付けられ、同時発火しないように制御されます。
- 同一ルール内のメソッド呼び出しは、すべて同時に
fire
する。 - 非競合のルールは並列に
will_fire
が生成され、同時実行可能です。
例:レジスタの write-data MUX / enable OR
assign reg_din =
(rule2_will_fire) ? data2 :
(rule1_will_fire) ? data1 :
reg_q;
assign reg_en = rule1_will_fire | rule2_will_fire | ... ;
4. まとめ:2線ハンドシェークの要点
- Ready(
can_fire
):callee が「今可能か」を知らせる組合せ出力 - Enable(
will_fire
):caller が実行する1サイクルパルス(fire
) - 論理合成:Ready と guard を AND、スケジューラで仲裁 →
fire
を生成 - 配線:
fire
はすべての callee のenable
に扇形配線される - AND 回路は自動挿入される:ユーザーが手で書く必要はないが、論理上は存在する
- ユーザーの記述負荷は低い:
can_fire
以外の信号論理はすべて BSC が生成する
備考
このアルゴリズムは、BSC コンパイラが提供する強力なスケジューラと構造的合成の基盤であり、明示的な回路記述が不要で高い信頼性と安全性を確保します。