# 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启动需求 要成功启动Linux,CPU必须支持: ### 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处理器(前端参考)