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