FPGA開発日記

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

SonicBOOMのデザインを読み解く (FetchBuffer)

引き続きSonicBOOMのデザインを読んでいる。SonicBOOMではf3にて簡単なデコードが完了すると、バックエンドに命令が渡される。その時のフロントエンドとバックエンドのインタフェースとしてFetchBuffer(fb)に格納される。FetchBufferからバックエンドに命令が発行されるわけだ。

f:id:msyksphinz:20210105005605p:plain

このときFetchBufferに何が格納されるかをチェックしているが、まずはマスクの情報だ。128ビットのフェッチサイズに対して4命令分のはずなのだが、実際には16ビット命令も存在しているので8ビット分のマスクが存在している。マスクは分岐命令(でかつ分岐予測に予測値が存在しない場合)または、JAL命令・JALR命令でDisableに設定される。

  • src/main/scala/ifu/frontend.scala
  for (b <- 0 until nBanks) {
    val bank_data  = f3_data((b+1)*bankWidth*16-1, b*bankWidth*16)
    val bank_mask  = Wire(Vec(bankWidth, Bool()))
    val bank_insts = Wire(Vec(bankWidth, UInt(32.W)))

...
      // Redirect if
      //  1) its a JAL/JALR (unconditional)
      //  2) the BPD believes this is a branch and says we should take it
      f3_redirects(i)    := f3_mask(i) && (
        brsigs.cfi_type === CFI_JAL || brsigs.cfi_type === CFI_JALR ||
        (brsigs.cfi_type === CFI_BR && f3_bpd_resp.io.deq.bits.preds(i).taken && useBPD.B)
      )
...
      redirect_found = redirect_found || f3_redirects(i)
    }
f:id:msyksphinz:20210105005422p:plain
f:id:msyksphinz:20210105005431p:plain