Rocket-Chipの実装を見ながら、乗除算回路を自作CPUに実装してみている。
除算回路については面倒くさいのでとりあえずRocket-ChipのChiselから生成した回路をくっつけた。インタフェースはこのようになっている。
module MulDiv( input clock, input reset, output io_req_ready, input io_req_valid, input [3:0] io_req_bits_fn, input io_req_bits_dw, input [63:0] io_req_bits_in1, input [63:0] io_req_bits_in2, input [4:0] io_req_bits_tag, input io_kill, input io_resp_ready, output io_resp_valid, output [63:0] io_resp_bits_data, output [4:0] io_resp_bits_tag );
io_req_bits_fn
命令のfn
エンコーディングをそのまま挿入すればいいらしい。io_req_bits_dw
は32ビットか64ビットかを指定している。32ビット演算なら0、64ビット演算ならば1を指定する。
Rocket-Chipの除算器はEarlyOutを指定しているので演算レイテンシは可変となっている。パイプライン化もしていないので命令発行後は演算完了するまでスケジューラをストールさせる必要がある。
そのままスケジューラに接続するとちゃんと演算できていることが確認できた。