20 |
BSVによるメモリダンプモジュールの設計 (5) |
RAMアドレスマルチプレクサの設計
VRAMアクセスするマスタに、FSM、CRTCに加えてメモリダンパが加わりました。しかしながらBRAMのポートが2つまでなので、FSM側のアドレスバスをシェアします。CRTCは常にアクセスしているのに比べて、メモリダンパはFSMが動作していない時のメモリ状態を観測するためだからです。アドレスシェアのためのマルチプレクサを設計します。
Mux.bsv
typedef Bit#(16) Addr_t;
interface Mux_ifc;
(* prefix="" *)
method Addr_t outp(Bool sel, Addr_t a, Addr_t b);
endinterface
(* synthesize, always_ready = "outp", no_default_clock, no_default_reset *)
module mkMux(Mux_ifc);
method Addr_t outp(Bool sel, Addr_t a, Addr_t b);
if (sel) return b;
else return a;
endmethod
endmodule
出力のハンドシェーク端子は不要であるため、
(* synthesize, always_ready = "outp" *)
を指定して削除しています。さらに、組み合わせ回路であるため、clock, resetを使用していないので、それらポートを削除するために、
(* no_default_clock, no_default_reset *)
を指定しています。また、入力ピン名が、メソッド名_変数名、例えばoutp_a等のように複雑になるのを防止するため、
(* prefix="" *)
を指定してメソッド名を消しています。
これを合成すると以下のようなVerilogになります。
mkMux.v
//
// Generated by Bluespec Compiler (build 38534dc)
//
// On Thu May 20 14:21:23 JST 2021
//
//
// Ports:
// Name I/O size props
// outp O 16
// sel I 1
// a I 16
// b I 16
//
// Combinational paths from inputs to outputs:
// (sel, a, b) -> outp
//
//
`ifdef BSV_ASSIGNMENT_DELAY
`else
`define BSV_ASSIGNMENT_DELAY
`endif
`ifdef BSV_POSITIVE_RESET
`define BSV_RESET_VALUE 1'b1
`define BSV_RESET_EDGE posedge
`else
`define BSV_RESET_VALUE 1'b0
`define BSV_RESET_EDGE negedge
`endif
module mkMux(sel,
a,
b,
outp);
// value method outp
input sel;
input [15 : 0] a;
input [15 : 0] b;
output [15 : 0] outp;
// signals for module outputs
wire [15 : 0] outp;
// value method outp
assign outp = sel ? b : a ;
endmodule // mkMux
わずか、 assign outp = sel ? b : a ;
という一行のverilogを得るためにいろいろと記述していますが、これはBSVの練習のためでもあります。