FPGA開発日記

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

SonicBOOMのデザインを読み解く(TLBの動作確認)

SonicBOOMのデザインを読んでいる。次はTLBについて調査する。

TLBは仮想アドレスから物理アドレスを引いてくるための機構なのだが、テーブルサーチ部分は以下のような構成になっていた。

f:id:msyksphinz:20210103141135p:plain

1つの仮想アドレスに対して4-WAY同時に格納できる構成になっており、最終的にどれかがヒットすればHitsVecが1になる。そうでなければHitsVecは1にならずmissがアサートされる。このミスはリクエストと同じサイクルで通知される。

リクエスト側(つまりフロントエンドパイプライン側)はHitの応答があるまでひたすらリクエストを繰り返している。いいんだけど、これだと電力においてかなり影響がありそうな気がする。

f:id:msyksphinz:20210103141156p:plain

で、ここから先の動作が良く分からない。理想の状態を言うのであれば、以下のような遷移をするはずである。

<Info: CPU mode changed from MachineMode to UserMode>
      1201:M:Sv39:00000000800000c0:P0000800000c0:10200073:sret                            :mstatus=>8000000a00006000 mstatus<=8000000a00006020 sepc=>0000000000002ac8 pc<=0000000000002ac8
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080003000 : PPTE = 0x0000000020001001>
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080004000 : PPTE = 0x0000000020001801>
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080006010 : PPTE = 0x0000000000000000>
<Page Table Error : 0000000080006010 = 0000000000000000 is not valid Page Table. Generate Exception>
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080003000 : PPTE = 0x0000000020001001>
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080004000 : PPTE = 0x0000000020001801>
<Info: VAddr = 0x0000000000002ac8 PTEAddr = 0x0000000080006010 : PPTE = 0x0000000000000000>
<Page Table Error : 0000000080006010 = 0000000000000000 is not valid Page Table. Generate Exception>
<Info: GenerateException Code=12, TVAL=0000000000002ac8 PC=0000000000002ac8,00007ffffc9de760>
<Info: Exception. ChangeMode from UserMode to SuprevisorMode>
<Info: Set Program Counter = 0xffffffffffe000c4>
<Info: MemResult::MemTlbError occured.>
<Info: VAddr = 0xffffffffffe000c4 PTEAddr = 0x0000000080003ff8 : PPTE = 0x0000000020001401>
<Info: VAddr = 0xffffffffffe000c4 PTEAddr = 0x0000000080005ff8 : PPTE = 0x00000000200000cf>
<Info: TLB[0] <= 0x000ffffffffffe00(0x0000000080000000)>
<Info: Converted Virtual Address is = 0x00000000800000c4>
      1202:S:Sv39:ffffffffffe000c4:P0000800000c4:14011173:csrrw      x02,0x140,x02        :sscratch=>ffffffffffe086d0 x02=>0000000000000000 sscratch<=0000000000000000 x02<=ffffffffffe086d0
<Info: VAddr = 0xffffffffffe086d8 PTEAddr = 0x0000000080003ff8 : PPTE = 0x0000000020001401>
<Info: VAddr = 0xffffffffffe086d8 PTEAddr = 0x0000000080005ff8 : PPTE = 0x00000000200000cf>
<Info: TLB[8] <= 0x000ffffffffffe08(0x0000000080008000)>
<Info: Converted Virtual Address is = 0x00000000800086d8>
      1203:S:Sv39:ffffffffffe000c8:P0000800000c8:00113423:sd         x01,0x008(x02)       :x02=>ffffffffffe086d0 x01=>0000000000000000 (00000000800086d8)<=0000000000000000
      1204:S:Sv39:ffffffffffe000cc:P0000800000cc:00313c23:sd         x03,0x018(x02)       :x02=>ffffffffffe086d0 x03=>0000000000000000 (00000000800086e8)<=0000000000000000
      1205:S:Sv39:ffffffffffe000d0:P0000800000d0:02413023:sd         x04,0x020(x02)       :x02=>ffffffffffe086d0 x04=>0000000000000000 (00000000800086f0)<=0000000000000000
  1. PTEアドレスが80003000に設定されている(これはSATPが0x80003000に設定されていることと、VPN[3]=0であることから)ので、まずは0x80003000にアクセスする。
  2. 0x80003000がPTEのLeafテーブルではないので、次に0x80004000にアクセスする。
  3. 最後に8x0006010にアクセスする。この時点で有効なテーブルではないので再度例外が発生する。

信号の動きを見ると、まずはTLBからPTWユニットに対して0x00002が出力されている。これはおそらくオフセットを除く0x2ac8の2が出力されたのであろう。

f:id:msyksphinz:20210103141212p:plain

SATPに基づき最初の物理アドレスを計算し、それをPTWがリクエストを出す。そしてレスポンスをベースに次のアドレスを計算することで最終的な物理アドレスを計算する。

f:id:msyksphinz:20210103141223p:plain

最終的に物理アドレスには0しか格納されておらずこれはページテーブルエラーになるので、io_resp_pf_inst (PageFault)が返される。

f:id:msyksphinz:20210103141251p:plain