2 |
BSVにおけるコマンドバッファ制御 (11) |
前の記事でChatGPTの回答があたかもalways_ready, always_enable疑似命令を付加すればalways_ready, always_enableとなるように聞こえたので、確認します。
このように、属性だけ変えても中身を正しく書かないとエラーになるのでは?
always_ready / always_enabled を使うときの注意
属性の意味
- always_ready : can_fire が常に True と解釈される
- always_enabled: ルールが発火したら必ずメソッドも実行される
メソッド本体にはガードを書かない
- if や case で条件分岐するとコンパイルエラーになる
- 無条件でレジスタへ書き込むだけにする
(* always_ready, always_enabled *)
method Action soundPreempt(Code_t d);
lastCode <= d; // 無条件で最新コードを保持
hasNewCmd <= True; // 新コマンド到着フラグ
endmethod
- 忙しいかどうかの判定は別ルールで行う
rule start_play (!busy && hasNewCmd);
current <= lastCode;
busy <= True;
hasNewCmd <= False;
endrule
- 上位モジュールはガード無しで毎サイクル呼んでよい
rule send_cmd;
sndFsm.soundPreempt(latestCode); // guard を付けない
endrule
これで busy の間に新しいコードが来ても、旧コードは上書きされて演奏されない。プリエンプションの目的を達成できます。