BOOMのTLBに関してその仕様と動作を調査する。SonicBOOMのTLBは以下の場所に定義されている。
chipyard/generators/boom/src/main/scala/lsu/tlb.scala
このNBDTLBがそれに相当する。NBDというのはNonBlockingの意味だと思う。
class NBDTLB(instruction: Boolean, lgMaxSize: Int, cfg: TLBConfig)(implicit edge: TLEdgeOut, p: Parameters) extends BoomModule()(p) { require(!instruction) val io = IO(new Bundle { val req = Flipped(Vec(memWidth, Decoupled(new TLBReq(lgMaxSize)))) val miss_rdy = Output(Bool()) val resp = Output(Vec(memWidth, new TLBResp)) val sfence = Input(Valid(new SFenceReq)) val ptw = new TLBPTWIO val kill = Input(Bool()) })
インタフェースをまとめる。
req = Flipped(Vec(memWidth, Decoupled(new TLBReq(lgMaxSize))))
:TLBアクセスのリクエストを受け付けるvalid
ready
TLBReq(lgMaxSize)
:vaddr = UInt(width = vaddrBitsExtended)
:変換対象となる仮想アドレスpassthrough = Bool()
:あまり使用用途が分からないが、アドレスをそのままパススルーしたいときに使用する。size = UInt(width = log2Ceil(lgMaxSize + 1))
対象となるアドレスサイズ。TLBのエントリサイズcmd = Bits(width = M_SZ)
:読み込み・書き込みなどのメモリリクエストの種類を示す。
miss_rdy = Output(Bool())
:TLBアクセスが実行中に1となる。resp = Output(Vec(memWidth, new TLBResp))
:TLBアクセスに対するレスポンスを出力する。TLBResp
miss: Bool
:TLBエントリにヒットせずPTWが発生したことを示すpaddr: UInt(width = paddrBits)
:変換後の物理アドレスpf: TLBExceptions
:Page Faultを示す(ものと思われる)ld: Bool
/st: Bool
/inst: Bool
:ロード・ストア・命令フェッチのどれに対するエラー化を示す。
ae: TLBExceptions
:Access Errorを示す(ものと思われる)ld: Bool
/st: Bool
/inst: Bool
ma: TLBExceptions
:Misaligned Acccesを示す(ものと思われる)ld: Bool
/st: Bool
/inst: Bool
cacheable: Bool
:Cachable領域へのアクセスかどうかを示すmust_alloc: Bool
:TLBエントリへのAllocationをしなければならないprefetchable: Bool
:プリフェッチ可能なアドレスかどうかを示す。
ptw = new TLBPTWIO
:ページテーブルウォークを行うためのインタフェースreq = Decoupled(Valid(new PTWReq))
:PTWのリクエスト信号valid
addr = UInt(width = vpnBits)
:変換対象となる仮想アドレスのVPNビット
resp = Valid(new PTWResp).flip
:PTWのレスポンス信号ae = Bool()
:Access Error(と思われる)pte = new PTE
:Paget Table Entry、ページテーブルエントリppn: UInt(width = 54)
reserved_for_software: Bits(width = 2)
d: Bool
a: Bool
g: Bool
u: Bool
x: Bool
w: Bool
r: Bool
v: Bool
level = UInt(width = log2Ceil(pgLevels))
:変換時のレベルfragmented_superpage = Bool()
homogeneous = Bool()
ptbr = new PTBR().asInput
:PTBR(おそらくSATPのことだと思われる)の信号status = new MStatus().asInput
:MSTATUSシステムレジスタの情報pmp = Vec(nPMPs, new PMP).asInput
:PMPの情報customCSRs = coreParams.customCSRs.asInput
:カスタムCSRの情報
kill = Input(Bool())
:処理を殺すための使用する