27 |
BSVの設計トライアル (15) |
マクロ命令定義
以上の議論から再定義したマクロ命令のコードです。
`define call(SUB) `_pushNext; state <= State_t {func:SUB, step:S0}
`define _pushNext rs.upd(sp, State_t {func:state.func, step:nextStep()}); sp <= sp + 1
`define pushCall(FUNC,SUB) _pushFunc(FUNC); state <= State_t {func:SUB, step:S0}
`define _pushFunc(FUNC) rs.upd(sp, State_t {func:FUNC, step:S0}); sp <= sp + 1
`define nextFunc state <= State_t {func:nextFunc(), step:S0}
`define return state <= rs.sub(sp-1); sp <= sp - 1
`define next state.step <= nextStep()
今回、アプリ(インベーダサウンドFSM)の必要上pushCallを定義しています。これは、call命令の一般化であり、次ステートではなく任意のファンクションに戻るコールを実装するものです。以上のマクロ命令の説明を表248.1に示します。
マクロ命令名 | 説明 |
---|---|
call(SUB) | サブルーチンコールです。次ステートをプッシュして、サブルーチンSUBをコールします。 |
_pushNext | callに使用されており、次のステートをプッシュする内部マクロ命令です。nextStep()関数を使用しています。ユーザは陽に使う必要は無いため、先頭にアンダースコアを付けています。 |
pushCall(FUNC,SUB) | サブルーチンコールです。戻り先ファンクションFUNCをプッシュして、サブルーチンSUBをコールします。戻り先は指定されたファンクションFUNCの先頭S0となります。 |
_pushFunc(FUNC) | pushCallに使用されており、戻り先ファンクションFUNCをプッシュする内部マクロ命令です。ユーザは陽に使う必要は無いため、先頭にアンダースコアを付けています。 |
nextFunc | 次のファンクションに進めるためのマクロ命令です。nextFunc()関数を使用しています。 |
return | 呼び出し元(の次のステート)に戻るためのマクロ命令です。 |
next | 次のステートに進めるためのマクロ命令です。nextStep()関数を使用しています。 |
合成結果
Vivadoによる合成結果は22 LUTのサイズでした。