Files
tatu/ARCHITECTURE.md
2026-06-26 08:20:25 +00:00

12 KiB
Raw Blame History

RISC-V RV64G 双发射乱序处理器架构设计

目标规格

  • ISA: RV64IMAFD (RV64G without C extension)
  • Issue Width: 双发射每周期2条指令
  • Physical Registers: 64个物理寄存器
  • Branch Predictor: Gshare
  • Memory: Sv39分页分离的L1 ICache/DCache
  • Pipeline: 11级流水线乱序执行

1. 流水线架构

流水线阶段

┌─────┐   ┌─────┐   ┌────┐   ┌────┐   ┌────┐   ┌────┐   ┌─────┐   ┌─────┐   ┌─────┐   ┌────┐
│ IF1 │ → │ IF2 │ → │ ID │ → │ RN │ → │ DP │ → │ IS │ → │ EX1 │ → │ EX2 │ → │ MEM │ → │ WB │ → │ CM │
└─────┘   └─────┘   └────┘   └────┘   └────┘   └────┘   └─────┘   └─────┘   └─────┘   └────┘
  TLB      ICache    Decode  Rename  Dispatch  Issue    Execute   Execute   DCache    Write   Commit
  BPU                2-way                                                    Access    Back    ROB

各阶段功能

  1. IF1 (Instruction Fetch 1)

    • PC生成与选择
    • ITLB查询虚拟地址 → 物理地址)
    • Gshare分支预测
    • 取两条指令(双发射)
  2. IF2 (Instruction Fetch 2)

    • ICache访问64B缓存行
    • 指令对齐与缓冲
  3. ID (Instruction Decode)

    • 双路译码器每周期译码2条指令
    • 指令类型识别
    • 立即数生成
    • 依赖分析RAW检测
  4. RN (Rename)

    • 寄存器重命名32逻辑寄存器 → 64物理寄存器
    • 空闲列表(Free List)管理
    • 重命名表(Rename Map Table)更新
    • ROB分配
  5. DP (Dispatch)

    • 分发到保留站(Reservation Station)
    • 根据指令类型选择功能单元队列
  6. IS (Issue)

    • 从保留站唤醒就绪指令
    • 乱序发射到执行单元
    • 读取物理寄存器文件
  7. EX1 (Execute 1)

    • ALU运算
    • 分支计算
    • 地址生成load/store
    • 浮点运算第一阶段
  8. EX2 (Execute 2)

    • 多周期运算完成
    • 浮点运算完成
    • 分支结果检查
  9. MEM (Memory)

    • DTLB查询
    • DCache访问
    • Load/Store执行
    • Store Buffer管理
  10. WB (Write Back)

    • 写回物理寄存器
    • 唤醒依赖指令
    • 更新ROB状态
  11. CM (Commit)

    • ROB按序提交
    • 架构状态更新
    • 异常/中断处理
    • 物理寄存器释放

2. 核心部件设计

2.1 前端 (Front-End)

Gshare 分支预测器

├── Global History Register (GHR): 12-bit
├── Pattern History Table (PHT): 4096 entries × 2-bit saturating counter
├── Branch Target Buffer (BTB): 512 entries
│   ├── Tag: 20-bit
│   ├── Target Address: 64-bit
│   └── Valid bit
└── Return Address Stack (RAS): 16 entries

Gshare索引计算: index = (PC[13:2] XOR GHR[11:0])

要求Branch Target Buffer大小可配置Return Address Stack大小可配置

ICache

├── Capacity: 32 KB
├── Associativity: 4-way set-associative
├── Line Size: 64 bytes
├── Sets: 128
└── Replacement: Pseudo-LRU

要求Capacity大小可配置Associativity大小可配置

ITLB

├── Entries: 32 (Fully associative)
├── Page Size: 4KB (Sv39)
├── Replacement: LRU
└── Support: Mega pages (2MB), Giga pages (1GB)

要求Entries大小可配置

2.2 乱序执行核心

重命名逻辑

Rename Map Table (RMT)
├── Arch Regs: 32 (x0-x31)
├── Phys Regs: 64 (p0-p63)
└── Mapping: arch_reg → phys_reg

Free List
├── Available physical registers
└── FIFO allocation

Committed Map Table (CMT)
└── For precise exception recovery

Reorder Buffer (ROB)

├── Entries: 64
├── Fields per entry:
│   ├── Valid
│   ├── PC
│   ├── Instruction Type
│   ├── Destination Physical Register
│   ├── Old Physical Register (for freeing)
│   ├── Exception Info
│   ├── Completed
│   └── Branch Mispredict
├── Head Pointer (commit)
└── Tail Pointer (allocate)

要求Entries可配置

Reservation Stations

Integer RS
├── Entries: 16
└── ALU, Branch, Integer Multiply/Divide

Load/Store RS
├── Entries: 12
└── Address generation, Memory ops

FP RS
├── Entries: 16
└── FP Add, FP Multiply, FP Divide

Physical Register File

Integer PRF
├── Registers: 64 × 64-bit
└── Read Ports: 4 (dual-issue × 2 operands)
└── Write Ports: 2 (dual-issue)

FP PRF
├── Registers: 64 × 64-bit
└── Read Ports: 4
└── Write Ports: 2

2.3 执行单元

├── ALU0: Integer ALU (ADD, SUB, AND, OR, XOR, SLT, etc.)
├── ALU1: Integer ALU
├── Branch Unit: Branch comparison
├── AGU: Address Generation Unit (Load/Store)
├── MDU: Multiply/Divide Unit (3-cycle latency for MUL, iterative for DIV)
├── FPU0: FP Add/Sub (4-cycle latency)
├── FPU1: FP Multiply (5-cycle latency)
└── FPU2: FP Divide/Sqrt (iterative, variable latency)

2.4 后端 (Memory Subsystem)

DCache

├── Capacity: 32 KB
├── Associativity: 8-way set-associative
├── Line Size: 64 bytes
├── Sets: 64
├── Replacement: Pseudo-LRU
├── Write Policy: Write-back
└── MSHR: 4 entries (Miss Status Holding Registers)

要求Capacity大小可配置Associativity大小可配置

DTLB

├── Entries: 32 (Fully associative)
├── Page Size: 4KB (Sv39)
├── Replacement: LRU
└── Support: Mega pages (2MB), Giga pages (1GB)

要求Entries大小可配置

MMU (Sv39)

├── Virtual Address: 39-bit
├── Physical Address: 56-bit (RISC-V spec allows up to 56)
├── Page Table Walker:
│   ├── 3-level page table
│   ├── Hardware page table walk
│   └── PTE cache (8 entries per level)
└── CSR Support:
    ├── satp (Supervisor Address Translation and Protection)
    ├── sstatus, sie, sip, stvec
    └── sepc, scause, stval, sscratch

Load/Store Queue

Load Queue (LQ)
├── Entries: 16
└── Track in-flight loads

Store Queue (SQ)
├── Entries: 16
├── Store-to-Load forwarding
└── Drain on fence/commit

要求Entries大小可配置

2.5 提交阶段

Commit Logic
├── Commit Width: 2 instructions per cycle
├── In-order commit from ROB head
├── Exception handling:
│   ├── Flush pipeline
│   ├── Restore architectural state from CMT
│   └── Free speculative physical registers
└── Branch mispredict recovery:
    ├── Flush younger instructions
    ├── Restore RMT from ROB checkpoint
    └── Redirect fetch

3. 数据通路

3.1 指令流

PC → ITLB → ICache → Instruction Buffer → Decoder (×2) → Rename → 
Dispatch → Reservation Stations → Issue → Execute → Write Back → ROB → Commit

3.2 数据流

Read PRF → Execute → Write Result → Broadcast (Bypass) → Write PRF → Update ROB
                                                        └→ Wakeup dependent instructions

3.3 控制流

Branch Predictor → Speculative Fetch → Execute Branch → Compare → 
[Match: Continue] / [Mispredict: Flush + Redirect]

4. 关键设计决策

4.1 双发射策略

  • 静态配对: 在ID阶段检查指令间依赖
  • 限制: 不允许同时发射两条分支指令、两条访存指令
  • 对齐: 指令对必须来自连续的PC

4.2 物理寄存器分配

  • 64个物理寄存器: 32个用于映射当前架构状态32个用于投机执行
  • 回收时机: 指令提交时,释放旧的物理寄存器

4.3 分支预测恢复

  • 检查点机制: 每条分支在RN阶段创建RMT快照
  • 恢复: 分支错误预测时恢复到该分支的RMT快照

4.4 内存一致性

  • 顺序模型: RISC-V Weak Memory Order (RVWMO)
  • Load乱序: 可以越过Store执行需要地址消歧
  • Store Buffer: Store指令提交后写入按序释放到Cache

4.5 异常处理

  • 精确异常: 通过ROB实现
  • 异常类型:
    • Page Fault (ITLB/DTLB miss)
    • Illegal Instruction
    • Misaligned Access
    • Breakpoint
    • System Call

5. 性能参数估算

指标 目标值
IPC (理想) 1.8-2.0
IPC (实际) 1.2-1.5 (考虑分支错误、Cache miss)
分支预测准确率 >90% (Gshare)
ICache命中率 >95%
DCache命中率 >90%
TLB命中率 >98%
频率目标 100-200 MHz (FPGA)

6. Linux启动需求

要成功启动LinuxCPU必须支持

6.1 特权级

  • M-mode (Machine): 最高特权级,处理异常/中断
  • S-mode (Supervisor): Linux内核运行在此
  • U-mode (User): 用户程序

6.2 必需的CSR

Machine Mode:
- mstatus, misa, medeleg, mideleg
- mtvec, mepc, mcause, mtval
- mip, mie, mtime, mtimecmp

Supervisor Mode:
- sstatus, stvec, sepc, scause, stval
- satp (MMU配置)
- sip, sie

Counters:
- cycle, time, instret

6.3 中断/异常

  • Timer interrupt (CLINT)
  • External interrupt (PLIC)
  • Software interrupt
  • 所有RISC-V异常类型

6.4 原子指令 (A扩展)

  • LR/SC (Load-Reserved/Store-Conditional)
  • AMO (Atomic Memory Operations): AMOSWAP, AMOADD, AMOXOR, AMOAND, AMOOR, AMOMIN, AMOMAX

6.5 外设接口

  • UART (串口输出)
  • CLINT (核心本地中断器)
  • PLIC (平台级中断控制器)

7. 验证策略

7.1 单元测试

  • 每个模块的功能验证
  • Chisel Unit Tests

7.2 ISA测试

  • riscv-tests (官方ISA测试套件)
  • rv64ui, rv64um, rv64ua, rv64uf, rv64ud

7.3 随机测试

  • riscv-torture (随机指令生成)

7.4 系统测试

  • CoreMark, Dhrystone (性能基准测试)
  • Linux boot (最终目标)

8. Chisel实现模块划分

src/main/scala/
├── common/
│   ├── Consts.scala          // 常量定义
│   ├── Parameters.scala      // 参数配置
│   └── Bundles.scala         // 数据结构定义
├── frontend/
│   ├── ICache.scala
│   ├── ITLB.scala
│   ├── BranchPredictor.scala // Gshare
│   ├── BTB.scala
│   ├── RAS.scala
│   └── Frontend.scala        // 前端顶层
├── decode/
│   ├── Decoder.scala
│   └── IDStage.scala
├── rename/
│   ├── RenameTable.scala
│   ├── FreeList.scala
│   ├── ROB.scala
│   └── RenameStage.scala
├── issue/
│   ├── ReservationStation.scala
│   ├── IssueQueue.scala
│   └── IssueStage.scala
├── execute/
│   ├── ALU.scala
│   ├── BranchUnit.scala
│   ├── Multiplier.scala
│   ├── Divider.scala
│   ├── FPU.scala
│   └── ExecStage.scala
├── memory/
│   ├── DCache.scala
│   ├── DTLB.scala
│   ├── MMU.scala
│   ├── LSU.scala             // Load/Store Unit
│   ├── LoadQueue.scala
│   ├── StoreQueue.scala
│   └── MemStage.scala
├── writeback/
│   └── WriteBackStage.scala
├── commit/
│   └── CommitStage.scala
├── regfile/
│   └── PhysicalRegFile.scala
├── csr/
│   ├── CSRFile.scala
│   └── PrivilegeControl.scala
└── Core.scala                // 处理器顶层

9. 参考资料

  • RISC-V Spec: https://riscv.org/technical/specifications/
  • Sv39 Paging: RISC-V Privileged Spec Chapter 4
  • Gshare Predictor: "Two-Level Adaptive Training Branch Prediction" (Yeh & Patt, 1991)
  • BOOM Processor: Berkeley Out-of-Order Machine (参考设计)
  • Rocket Chip: 顺序发射RISC-V处理器前端参考