SonicBoom Front-end Highlights

SonicBoom前端时序图

  • ICache: 32K 8-way VIPT
  • Fetch Width = 8 * 16 = 128-bit (L2 resp width = 128-bit)
  • 2-level BTB
    • FauBTB (Fully Associative BTB): 0-cycle delay, 16-way, built by register bank
    • BTB (L1-BTB/Main BTB): 1-cycle delay, 128-set, 2-way, 8-slot per set, built by SRAM
      • BIM: 2048-set, directly map, 8-slot per set, for storing 2-bit ctr information
      • eBTB: extended BTB, 128-set, directly map, for storing full target address (VA)
  • TAGE-L main predictor
    • TAGE: T1 – T6 (Don’t found T0), 3-bit ctr + 2-bit useful design, periodly reset, write bypass supported
    • Loop Predictor: 16-sets, built by register bank

SonicBOOM前端取指为4个cycle:

  • F0:
    • Next PC Mux Select
    • Request L1-BTB
  • F1:
    • Access ICache/ITLB (VIPT ICache)
    • Access FauBTB, get F1 resp
    • Access TAGE
    • L1-BTB SRAM resp
  • F2:
    • ICache resp
    • L1-BTB output F2 resp
    • TAGE resp
  • F3:
    • Access Loop Predictor (Register Bank)
    • GE-L resp
    • st. pre-decode
    • check (direct jump check/update BTB)

BTB timing

BTB timing

  • F0:
    • Next PC Mux Select
    • Latch F0 PC
    • Request L1-BTB (include BIM)
  • F1:
    • Access FauBTB, get F1 resp
    • L1-BTB SRAM resp
    • Latch L1-BTB resp
  • F2:
    • F2 resp from latched F1 resp of L1-BTB

FauBTB

FauBTB

  • Fully Associative 16-way
  • Register bank
  • 8-slot per way (Fetch Width)
  • 分开存储offset以及[tag/ctr/br]信息
    • offset用于计算next-PC
    • tag直接使用PC低位(没有hash)
    • is_br用于标记是否是分支指令

FauBTB access

FauBTB access

  • 对于8个slot,并行比较16个way的tag信息,若命中则:
    • 对于每个slot,io.resp.f1输出其[predicted_pc/is_br/is_jal/taken]信息
  • 在Front-End层会对F1 resp进行检查,若8个slot存在valid的结果,则将最小命中的slot的结果作为F1 redirect的结果

FauBTB update

Allocate algorithm

flatten_tag = {meta[15][7].tag, meta[15][6].tag, ..., meta[0][0].tag, s1_idx[tagSz-1:0]};
ft_width    = getWidth(faltten_tag);
alloc_way   = flatten_tag[ft_width-1:ft_width-4] ^ flatten_tag[ft_width-5:ft_width-8] ^ ... ^ flatten_tag[3:0];  // chunk length = log2(16)
  • Update信息的来源有两种:
    • FTQ的更新信息(优先级最高)
    • F3阶段,对指令pre-decode后得到的直接跳转地址,若与BTB的结果不符合则打一排在F4更新
  • FauBTB-btb更新:当对应slot是cfi指令且taken时,仅更新所需要way对应的slot的offset值(没有对overflow做处理)
  • FauBTB-meta更新:除了update btb对应的slot外,在taken的slot前的br也需要更新(若FG有br,但没有taken,则这些br也都要更新)
    • 更新ctr,taken +1; not-taken -1;

Main-BTB

main-BTB

  • 基本结构与FauBTB类似,offset以及meta信息分开存放,但ctr使用一个单独的BIM SRAM来存放,且带有write bypass机制
  • ebtb用于存放完整的target PC
  • 推测BIM兼顾了T0的作用;且BOOM的main predictor没有ijr预测,也是由BTB来兼任

Main-BTB access

main-BTB access

  • Allocate算法与FauBTB一致
  • Update信息的来源与FauBTB一致
  • 且BTB/meta更新的逻辑与FauBTB也一致
  • eBTB更新取决于target PC是否overflow offset,如果overflow就放到eBTB中,且BTB对应项标记为extended(对应的BTB entry也会更新)
  • BIM更新也与FauBTB的ctr更新逻辑一致

Main-BTB SRAM & write bypass

  • BIM中实现有两个entry的write bypass结构,与xiangshan的TAGE wrbypass功能一致(xiangshan的要大得多),也就是当读写冲突时,读优先,然后将写的信息暂存在这个wrbypass当中。下次更新时,查看是否hit wrbypass,若hit则从wrbypass中更新ctr值写入。
  • 但BOOM并没有做读写冲突的处理,而是直接用chisel built-in SyncReadMem来实现SRAM
    • 双端口SRAM?- timing/area过不去,且wrbypass没用
    • 单端口SRAM?- 推测是,但无法确定,原因见下
  • BOOM (chipyard) 的SRAM mapping flow:

Chisel SRAM mapping flow

RISC-V CPU design engineer.