| 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のサイズでした。
 前のブログ
前のブログ
 
    
    
    
Leave a Comment