SonicBOOMのデザインを読んでいる。次はTLBについて調査する。
TLBは仮想アドレスから物理アドレスを引いてくるための機構なのだが、テーブルサーチ部分は以下のような構成になっていた。
1つの仮想アドレスに対して4-WAY同時に格納できる構成になっており、最終的にどれかがヒットすればHitsVec
が1になる。そうでなければHitsVec
は1にならずmiss
がアサートされる。このミスはリクエストと同じサイクルで通知される。
リクエスト側(つまりフロントエンドパイプライン側)はHitの応答があるまでひたすらリクエストを繰り返している。いいんだけど、これだと電力においてかなり影響がありそうな気がする。
で、ここから先の動作が良く分からない。理想の状態を言うのであれば、以下のような遷移をするはずである。
<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
- PTEアドレスが80003000に設定されている(これはSATPが0x80003000に設定されていることと、VPN[3]=0であることから)ので、まずは0x80003000にアクセスする。
- 0x80003000がPTEのLeafテーブルではないので、次に0x80004000にアクセスする。
- 最後に
8x0006010
にアクセスする。この時点で有効なテーブルではないので再度例外が発生する。
信号の動きを見ると、まずはTLBからPTWユニットに対して0x00002が出力されている。これはおそらくオフセットを除く0x2ac8の2が出力されたのであろう。
SATPに基づき最初の物理アドレスを計算し、それをPTWがリクエストを出す。そしてレスポンスをベースに次のアドレスを計算することで最終的な物理アドレスを計算する。
最終的に物理アドレスには0しか格納されておらずこれはページテーブルエラーになるので、io_resp_pf_inst
(PageFault)が返される。