FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Rocket-Chipの除算器について調査と自作CPUへの接続

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を指定する。

f:id:msyksphinz:20210725223552p:plain

Rocket-Chipの除算器はEarlyOutを指定しているので演算レイテンシは可変となっている。パイプライン化もしていないので命令発行後は演算完了するまでスケジューラをストールさせる必要がある。

そのままスケジューラに接続するとちゃんと演算できていることが確認できた。

f:id:msyksphinz:20210725224030p:plain