FPGA開発日記

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

BOOMのTLBに関する調査 (1. TLBのインタフェース)

BOOMのTLBに関してその仕様と動作を調査する。SonicBOOMのTLBは以下の場所に定義されている。

chipyard/generators/boom/src/main/scala/lsu/tlb.scala

github.com

この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())
  })
f:id:msyksphinz:20210501001313p:plain
f:id:msyksphinz:20210501001351p:plain

インタフェースをまとめる。

  • 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: TLBExceptionsAccess 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).asInputPMPの情報
    • customCSRs = coreParams.customCSRs.asInput:カスタムCSRの情報
  • kill = Input(Bool()):処理を殺すための使用する