基于开源代码仓库 XUANTIE-RV/opene906 的深度源码分析
 

1. E906 概述

1.1 定位

玄铁E906是阿里巴巴平头哥(T-Head)半导体开源的32位高能效嵌入式RISC-V处理器,定位于中高端MCU、物联网、语音处理、导航、WiFi、TWS耳机等应用场景。

1.2 核心特性

特性 规格
ISA RV32IMA[F][D]C[P] + XT-Head自定义扩展
流水线 7-8级(IF→ID→EX1→EX2→EX3→WB0→WB1→WB2)
发射宽度 单发射(支持尾指令双发射优化)
指令缓存 2路组相联,可配置2KB-64KB,32字节行
数据缓存 2路组相联,写回/写分配可配置
分支预测 BTB(16条目全相联)+ BHT(Gshare)+ RAS
FPU IEEE 754 单精度(可选双精度),FADD/FMA/FDIV/FSQRT
中断 CLIC (128源,硬件向量化,优先级嵌套)
调试 RISC-V Debug Spec 0.13,3个硬件触发器,PC追踪FIFO
内存保护 8区域PMP + 8区域SYSMAP
性能监控 HPM硬件性能计数器
总线接口 3×AHB-Lite(I-side, D-side, System)
功耗管理 细粒度门控时钟(ICG),LPMD低功耗模式,WFI/WFE

1.3 架构图

                          ┌──────────────────────────────────────────────────┐
                          │                    openE906 (Chip Top)           │
                          │                                                  │
   ┌─────────┐            │  ┌─────────────────────────────────────────────┐ │
   │  JTAG   │◄───────────┼──┤  tdt_top (Debug Transport)                  │ │
   │ Debugger│            │  │  DTM → DMI → APB Master → DM (Debug Module) │ │
   └─────────┘            │  └──────────────┬──────────────────────────────┘ │
                          │                 │                                │
                          │  ┌──────────────▼──────────────────────────────┐ │
                          │  │           pa_core_top (Core+Uncore)         │ │
                          │  │                                             │ │
  ┌─────────┐             │  │  ┌──────────────────────────────────────┐   │ │
  │ Interrupt│◄───────────┼──┼──┤  pa_sys_io (CLINT, NMI, Wakeup)      │   │ │
  │ (128src)│             │  │  └──────────────────────────────────────┘   │ │
  └─────────┘             │  │                                             │ │
                          │  │  ┌──────────────────────────────────────┐   │ │
                          │  │  │          pa_core (CPU Pipeline)      │   │ │
                          │  │  │                                      │   │ │
                          │  │  │  ┌──────┐   ┌──────┐   ┌──────┐      │   │ │
                          │  │  │  │ IFU  │──►│ IDU  │──►│ IU   │      │   │ │
                          │  │  │  │      │   │      │   │(ALU/ │      │   │ │
                          │  │  │  │I$/BHT│   │GPR/  │   │ BJU/ │      │   │ │
                          │  │  │  │BTB/  │   │Decode│   │ MUL/ │      │   │ │
                          │  │  │  │RAS   │   │      │   │ DIV) │      │   │ │
                          │  │  │  └──────┘   └──┬───┘   └──┬───┘      │   │ │
                          │  │  │                │          │          │   │ │
                          │  │  │                │    ┌─────▼──────┐   │   │ │
                          │  │  │                │    │    LSU     │   │   │ │
                          │  │  │                │    │ D$/STB/    │   │   │ │
                          │  │  │                │    │ LFB/VB     │   │   │ │
                          │  │  │                │    └───────────┘    │   │ │
                          │  │  │                │                     │   │ │
                          │  │  │         ┌──────▼──────┐    ┌──────┐  │   │ │
                          │  │  │         │     CP0     │    │ FPU  │  │   │ │
                          │  │  │         │ CSR/Trap/   │    │FADD/ │  │   │ │
                          │  │  │         │ Interrupt   │    │FMA/  │  │   │ │
                          │  │  │         └──────┬──────┘    │FDIV  │  │   │ │
                          │  │  │                │           └──┬───┘  │   │ │
                          │  │  │         ┌──────▼──────────────▼───┐  │   │ │
                          │  │  │         │        RTU              │  │   │ │
                          │  │  │         │  Retire / Commit / WB   │  │   │ │
                          │  │  │         └─────────────────────────┘  │   │ │
                          │  │  └──────────────────────────────────────┘   │ │
                          │  │                                             │ │
                          │  │  ┌───────┐ ┌──────┐ ┌────┐ ┌─────┐ ┌─────┐  │ │
                          │  │  │  PMP  │ │SYSMAP│ │BMU │ │IAHBL│ │DAHBL│  │ │
                          │  │  │(8reg) │ │(8reg)│ │Bus │ │I-Bus│ │D-Bus│  │ │
                          │  │  └───────┘ └──────┘ │Mtrx│ └─────┘ └─────┘  │ │
                          │  │                     └──┬─┘                  │ │
                          │  └────────────────────────┼────────────────────┘ │
                          │                           │                      │
                          │              ┌────────────▼───────────┐          │
                          │              │  pa_tcipif_top         │          │
                          │              │  CLIC + CLINT +        │          │
                          │              │  SysMap Bus Bridge     │          │
                          │              └────────────────────────┘          │
                          │                                                  │
                          │  ┌──────────────────────────────────────┐        │
                          │  │       pa_clkrst_top (Clock&Reset)    │        │
                          │  │       ICG Clock Gating + RST Sync    │        │
                          │  └──────────────────────────────────────┘        │
                          └──────────────────────────────────────────────────┘

2. 仓库结构总览

2.1 目录树

e906/
├── E906_RTL_FACTORY/
│   ├── gen_rtl/          ★ 核心RTL源码 (199个Verilog文件, 28个子目录)
│   │   ├── cpu/rtl/      - 顶层集成 (openE906, pa_core_top, pa_core)
│   │   ├── ifu/rtl/      - 取指单元 (23文件)
│   │   ├── idu/rtl/      - 译码单元 (18文件)
│   │   ├── iu/rtl/       - 整数执行单元 (10文件)
│   │   ├── lsu/rtl/      - 访存单元 (39文件, 含D$)
│   │   ├── fpu/rtl/      - 浮点顶层 (5文件)
│   │   ├── falu/rtl/     - 浮点ALU (9文件)
│   │   ├── fmau/rtl/     - 浮点乘累加 (11文件)
│   │   ├── fdsu/rtl/     - 浮点除/开方 (8文件)
│   │   ├── cp0/rtl/      - CSR/特权 (10文件)
│   │   ├── rtu/rtl/      - 退休/异常 (6文件)
│   │   ├── biu/rtl/      - AHB-Lite总线 (5文件)
│   │   ├── bmu/rtl/      - 总线矩阵 (3文件)
│   │   ├── clic/rtl/     - CLIC中断控制器 (10文件)
│   │   ├── clint/rtl/    - 定时器中断 (3文件)
│   │   ├── pmp/rtl/      - 物理内存保护 (5文件)
│   │   ├── pmu/rtl/      - 性能计数器 (3文件)
│   │   ├── sysmap/rtl/   - 系统地址映射 (5文件)
│   │   ├── dtu/rtl/      - 调试/追踪 (13文件)
│   │   ├── tdt/rtl/      - 调试传输 (15文件)
│   │   ├── tcipif/rtl/   - TCIP接口 (3文件)
│   │   ├── clk/rtl/      - 时钟生成 (3文件)
│   │   ├── rst/rtl/      - 复位控制 (1文件)
│   │   ├── common/rtl/   - 通用单元 (1文件)
│   │   ├── fpga/rtl/     - FPGA SRAM模型 (25文件)
│   │   └── filelists/    - 文件列表
│   └── setup/            - 环境变量脚本
├── smart_run/            ★ 仿真验证环境
│   ├── Makefile          - 顶层仿真流程
│   ├── logical/          - SoC Testbench
│   │   ├── tb/tb.v       - 自检对Testbench
│   │   ├── system/soc.v  - SoC顶层(CPU+AHB+APB+外设)
│   │   ├── ahb/          - AHB总线组件
│   │   ├── apb/          - APB总线+外设
│   │   ├── mem/          - 存储器控制器
│   │   ├── uart/         - UART 16550
│   │   ├── timer/        - APB定时器
│   │   ├── gpio/         - GPIO
│   │   ├── pmu/          - 电源管理单元
│   │   └── wic/          - 唤醒中断控制器
│   ├── tests/            - 测试套件
│   │   ├── lib/          - C运行时库(crt0/linker/clib)
│   │   └── cases/        - 测试用例 (hello_world/coremark/ISA/debug/...)
│   ├── impl/             - SDC时序约束 (e906.sdc, 1GHz)
│   └── setup/            - 工具链配置
├── doc/                  - PDF文档(受DRM保护)
├── LICENSE               - Apache 2.0
└── README.md

2.2 源码统计

类别 文件数 描述
Verilog (.v) 199 可综合RTL + 仿真模型
SystemVerilog (.sv/.vh) 若干 JTAG BFM、测试宏
C (.c/.h) 25+ 测试用例、C运行时库
汇编 (.s) 4 启动代码、ISA测试
脚本 (Makefile/.pl/.csh/.tcl) 10+ 构建/仿真/回归流程
PDF文档 3 数据手册、用户手册、集成手册(DRM加密)

3. 模块层次树

openE906  (Chip Top - cpu/rtl/openE906.v)
├── pa_core_top  (Core+Uncore - cpu/rtl/pa_core_top.v)
│   ├── pa_core  (Pipeline Top - cpu/rtl/pa_core.v)
│   │   ├── pa_ifu_top     ← I$/BTB/BHT/RAS/IBUF/IPACK
│   │   │   ├── pa_ifu_ctrl      (取指控制)
│   │   │   ├── pa_ifu_ifetch    (指令fetch + AHB总线接口)
│   │   │   │   └── pa_ifu_icache
│   │   │   │       ├── pa_ifu_icache_data_array
│   │   │   │       └── pa_ifu_icache_tag_array
│   │   │   ├── pa_ifu_pcgen     (PC生成, 8源优先级)
│   │   │   ├── pa_ifu_bht       (Gshare分支方向预测)
│   │   │   ├── pa_ifu_btb       (16条目全相联BTB)
│   │   │   ├── pa_ifu_ras       (返回地址栈)
│   │   │   ├── pa_ifu_ibuf      (指令缓冲FIFO)
│   │   │   ├── pa_ifu_ipack     (16b/32b指令打包)
│   │   │   ├── pa_ifu_id_pred   (ID阶段预译码)
│   │   │   └── pa_ifu_vec       (复位向量/预热)
│   │   │
│   │   ├── pa_idu_top     ← GPR/FPR/Scoreboard/Decoder
│   │   │   ├── pa_idu_ctrl / pa_idu_dp / pa_idu_hs
│   │   │   ├── pa_idu_gpr (34×32bit GPR) / pa_idu_fpr
│   │   │   └── pa_idu_decd_dsp
│   │   │       ├── pa_idu_decd_rv32im / rv32c / rv32x / rv32fd
│   │   │
│   │   ├── pa_iu_top      ← ALU/BJU/MUL(33x33)/DIV/AGU
│   │   │   ├── pa_iu_ctrl / pa_iu_alu / pa_iu_bju
│   │   │   ├── pa_iu_mul (2周期流水线, 33x33部分积)
│   │   │   └── pa_iu_div (多周期除法radix-2)
│   │   │
│   │   ├── pa_lsu_top     ← D$/Store Buffer/Victim Buffer/Line Fill
│   │   │   ├── pa_lsu_dc (D$控制器, 5状态FSM)
│   │   │   ├── pa_lsu_lfb / pa_lsu_stb / pa_lsu_vb
│   │   │   ├── pa_lsu_ncb (非缓存) / pa_lsu_icc (缓存维护)
│   │   │   └── pa_dcache_top (Data/Tag/Dirty Arrays)
│   │   │
│   │   ├── pa_cp0_top     ← CSR/异常/中断/特权
│   │   │   ├── pa_cp0_regs (CSR寄存器文件)
│   │   │   │   ├── pa_cp0_info_csr / trap_csr / ext_csr / float_csr
│   │   │   ├── pa_cp0_special (FENCE/WFI/WFE)
│   │   │   └── pa_cp0_srst (软件复位)
│   │   │
│   │   ├── pa_rtu_top     ← 退休/提交总线/写回/死锁检测
│   │   │   ├── pa_rtu_retire / pa_rtu_cbus / pa_rtu_rbus
│   │   │   ├── pa_rtu_int (中断控制) / pa_rtu_lockup
│   │   │
│   │   └── pa_fpu_top     ← IEEE 754 FPU
│   │       ├── pa_falu_top (FADD/FCVT/FSPU)
│   │       ├── pa_fmau_top (FMA, 24x24部分积, LZA)
│   │       └── pa_fdsu_top (FDIV/FSQRT, SRT算法)
│   │
│   ├── pa_pmp_top (8区域PMP) / pa_sysmap_top (8区域地址映射)
│   ├── pa_bmu_top (总线矩阵) / pa_iahbl_top / pa_dahbl_top
│   ├── pa_hpcp_top (性能计数器) / pa_sys_io (系统IO)
│   └── pa_dtu_top (调试/追踪: 3触发器 + PC FIFO)
│
├── tdt_top (Debug Transport: DTM + DM + DMI/APB)
├── pa_clkrst_top (时钟门控 + 复位同步)
└── pa_tcipif_top (TCIP接口: CLIC + CLINT + SysMap桥)

4. 流水线微架构

4.1 流水线级数

E906采用7-8级流水线

阶段 名称 执行单元 描述
IF Instruction Fetch IFU PC生成、I$访问、BTB/BHT预测
ID Instruction Decode IDU 指令译码、寄存器读、操作数前递
EX1 Execute 1 IU/LSU/CP0/FPU ALU运算、地址生成、分支解析
EX2 Execute 2 IU/LSU 乘法完成、LSU数据返回
EX3 Execute 3 LSU 多周期LSU前递
WB0 Writeback 0 RTU→IDU IU/FPU结果写回(早期)
WB1 Writeback 1 RTU→IDU LSU load结果写回
WB2 Writeback 2 RTU→IDU 第三写回端口

4.2 流水线信号命名约定

  • ifu_idu_id_*: IFU→IDU接口(ID阶段输入)
  • idu_*_ex1_*: IDU→执行单元接口(EX1阶段输入)
  • *_rtu_ex1_*: 执行单元→RTU接口(EX1完成)
  • *_idU_ex2_fwd_*: EX2→IDU前递
  • *_idU_ex3_fwd_*: EX3→IDU前递
  • rtu_idu_wb*_*: RTU→IDU写回(WB0/WB1/WB2)

4.3 流水线互锁数据流

IFU              IDU          EX1(ALU/BJU/MUL/DIV/LSU)     EX2(MUL/LSU)    RTU
│                │                        │                   │             │
│-ifu_idu_id_inst─►│                      │                   │             │
│                  │─idu_iu_ex1_src0/1/2 ►│                   │             │
│                  │                      │iu_idu_ex1_fwd_data─►│           │
│                  │◄── iu_idu_ex1_stall │                    │             │
│◄─idu_ifu_id_stall─│                    │                    │             │
│                   │                    │iu_rtu_ex1_cmplt    ┼─────────────►│
│                   │                    │                    │── ex2_fwd ──►│
│                   │◄── rtu_idu_wb0_data┼───────────         ┼───────│
│                   │                   │              │              │rtu_idu_wb0_vld
│                   │                   │              │              │rtu_ifu_flush_fe

4.4 停顿信号汇总

停顿源 信号 影响
IDU→IFU idu_ifu_id_stall IFU暂停取指
IU→IDU iu_idu_ex1_stall IDU暂停发射
IU→IDU iu_idu_bju_stall BJU EX2等待LSU数据
LSU→IDU lsu_idu_ex1_stall LSU忙
CP0→IDU cp0_idu_ex1_stall CSR操作进行中
FPU→IDU fpu_idu_ex1_stall FPU忙
IDU内部 ctrl_dep_ld_stall RAW: rs依赖进行中的load
IDU内部 ctrl_dep_norm_stall RAW: rs依赖EX1结果
IDU内部 ctrl_dep_div_stall RAW: rs依赖除法结果
IDU内部 ctrl_fence_cp0_stall FENCE等待所有单元空闲
RTU→IDU rtu_idu_flush_stall 冲刷进行中

5. 取指单元 (IFU)

5.1 整体结构

IFU位于 e906/E906_RTL_FACTORY/gen_rtl/ifu/rtl/,由8个子模块组成:

                    ┌──────────────┐
         ┌─────────┤  pa_ifu_vec  │ (复位向量/预热)
         │         └──────────────┘
         │         ┌──────────────┐     ┌───────────────┐
         ├─────────┤pa_ifu_pcgen  │────►│pa_ifu_ifetch  │
         │         │ 8源优先级:   │     │ 5状态FSM       │
         │         │ Vec>RTU>IU>  │     │ 支持2个待处理  │
         │         │ RAS>BHT>BTB  │     │ 事务          │
         │         └──────┬───────┘     └───────┬───────┘
         │                │                     │
         │         ┌──────▼─────────────────────▼───────┐
         │         │       pa_ifu_ipack                 │
         │         │   (16b/32b指令打包)                 │
         │         └──────────────┬──────────────────── ┘
         │                        │
┌────────▼──────┐         ┌──────▼───────┐
│pa_ifu_btb     │         │ pa_ifu_ibuf  │
│(16条目全相联)  │         │ (指令FIFO)   │
└────────┬──────┘         └──────┬───────┘
         │                       │
┌────────▼──────┐         ┌──────▼───────┐         ┌──────────────┐
│pa_ifu_bht     │         │pa_ifu_id_pred│────────►│   TO IDU     │
│(Gshare PHT)   │         │(预译码+BHT/   │         │ifu_idu_id_*  │
│VGHR推测恢复    │         │ RAS预测输出)  │         └──────────────┘
└──────┬────────┘         └──────────────┘
       │
┌──────▼────────┐
│pa_ifu_ras     │
│(返回地址栈)    │
└───────────────┘

5.2 指令缓存 (I-Cache)

文件: pa_ifu_icache.v

参数
相联度 2路组相联
行大小 32字节 (8×32bit)
可配置容量 2KB / 4KB / 8KB / 16KB / 32KB / 64KB
替换策略 FIFO (每路1位)
Tag索引位宽 可配置 I_TAG_INDEX_WIDTH (32KB时=10)
Tag条目 47位: {fifo, way1_vld, way1_tag[21:0], way0_vld, way0_tag[21:0]}

Tag Hit Buffer (低功耗优化):缓存最近一次Tag查找结果,同一Cache行连续访问时跳过Tag RAM读取,显著降低动态功耗。

Refill FSMIDLE → REQ → WFC → RFL → IDLE

Invalidation:支持批量无效化(遍历清零)和物理地址无效化(仅清零命中路)两种模式。

5.3 分支预测

BTB —  pa_ifu_btb.v
参数
条目数 16
相联度 全相联(寄存器实现,非RAM)
替换策略 FIFO
预测延迟 1周期

目标地址拼接:{当前PC[31:16], BTB_target[15:0]},仅预测低16位。

BHT —  pa_ifu_bht.v
参数
算法 Gshare (全局历史 XOR PC)
条目宽度 16位 (8位 taken + 8位 not-taken)
计数器 2位饱和计数器 (SN/WN/WT/ST)

推测执行支持:3套GHR

  • bht_ghr:架构GHR,分支在IU解析后更新
  • bht_vghr:推测VGHR,分支在IFU预测后推测更新
  • bht_ref_vghr:快照VGHR,误预测时恢复

5.4 PC生成 (PCGEN)

文件: pa_ifu_pcgen.v

2级优先级编码(注释: HAD > Vector > BJU > RAS > BHT > BTB > Inc):

  • Level 1:Vector中断 > RTU重定向 > IU分支目标
  • Level 2:缓冲chgflw > ID预测分支 > BTB预测 > 顺序递增

6. 译码单元 (IDU)

6.1 译码器架构

5路ISA子译码器 (pa_idu_decd_dsp.v):

指令[31:0]
    │
    ├── inst[1:0]≠11 → pa_idu_decd_rv32c  (16位压缩指令)
    │
    ├── opcode检测 → pa_idu_decd_rv32fd (浮点指令)
    │
    ├── opcode检测 → pa_idu_decd_rv32x  (T-Head自定义扩展)
    │
    ├── opcode检测 → pa_idu_decd_rv32p  (DSP/Packed, 当前禁用)
    │
    └── 默认       → pa_idu_decd_rv32im (整数基本指令)

6.2 寄存器文件

特性 规格
体系结构寄存器 32个 (x0-x31) + 2个hint寄存器 (索引32/33)
读端口 4个 (组合逻辑)
写端口 3个 (WB0 / WB1 / WB2)
x0处理 硬连线为0(通过多路器)
x2 (sp) 专用 pa_idu_reg_sp 支持自动交换
时钟门控 高半寄存器 (x17-x31) 使用独立门控时钟

6.3 Scoreboard (寄存器忙状态)

每个寄存器维护3位忙状态:

编码 状态 含义
000 IDLE 空闲
001 BUSY1 IU普通结果待写回 (1周期)
010 BUSY_LSU1 第1个LSU结果待写回 (load)
011 BUSY_DIV1 第1个DIV结果待写回
100 BUSY2 IU配对结果待写回 (rd/rd+1)
110 BUSY_LSU2 第2个LSU结果待写回 (配对load)
111 BUSY_DIV2 第2个DIV结果待写回

6.4 前递网络

4级优先级前递,每个源操作数独立:

EX1前递 > EX2 LSU前递 > EX2 IU前递 > EX3 LSU前递 > GPR读取

RS1前递多路选择器:

dp_rs1 = fwd_ex1      ? iu_idu_ex1_fwd_data     // EX1立即前递
       : fwd_ex2_rbus ? dp_rs1_aft_fwd_ex2     // EX2 IU结果总线
       : fwd_ex3      ? dp_rs1_aft_fwd_ex3      // EX3 LSU前递
       : gpr_dp_rs1                            // GPR读取 (最终回退)

6.5 硬件栈 (IPUSH/IPOP)

E906实现了硬件中断压栈/出栈机制:

  • IPUSHST_MEPC → ST_MCAUSE → ST_GPR(循环) → SUB_SP → SPEC_EXPT
  • IPOPLD_GPR(循环) → LD_MCAUSE → LD_MEPC → ADD_SP → IPOP_RTE(MRET)
  • 仅保存 x1(ra), x5-x7, x10-x17, x28-x31;x2(sp), x8-x9, x18-x27 不保存
  • 支持推测压栈:ipush_spec_flag 在确认前推测开始;失败时丢弃

7. 整数执行单元 (IU)

7.1 ALU

文件: pa_iu_alu.v

sel 单元 操作
sel[0] 加法器 ADD / SUB / SLT / SLTU / MIN / MAX
sel[1] 移位器 SLL / SRL / SRA(桶形右移,左移通过位反转实现)
sel[2] 逻辑 AND / OR / XOR
sel[3] 打包 PACKL / PACKH(当前设计中禁用)
sel[4] 位操作 BITOP(当前设计中禁用)

7.2 分支/跳转单元 (BJU)

2状态FSM:

  • BJU_EX1:正常单周期执行
  • BJU_EX2:分支操作数依赖LSU数据,等待前递后解析
beq_taken  = (src0 == src1)
blt_taken  = func[4] ? signed_lt : unsigned_lt
cond_br_taken = (beq_taken ^ func[3]) & func[2]  // BEQ/BNE
              | (blt_taken ^ func[3]) & func[1]  // BLT/BGE

bht_mispred = cond_sel & (taken_raw ^ bht_pred[1])

7.3 乘法器

特性 规格
算法 33×33部分积 (DesignWare风格)
流水线 2周期 (EX1→EX2)
有符号支持 func[1:0]控制 rs1/rs2 有符号性
门控时钟 高32位结果寄存器独立门控 (仅MULH型指令触发)

7.4 除法器

特性 规格
算法 Radix-2 移位减法
执行周期 多周期 (1-34周期)
特殊处理 除零检测、溢出检测

8. 浮点单元 (FPU)

8.1 FPU顶层

特性 规格
精度 单精度 IEEE 754(可选双精度)
执行单元 FALU(加/转换/特殊)+ FMAU(乘累加)+ FDSU(除/开方)
寄存器文件 32×32位 FPR
舍入模式 RNE / RTZ / RDN / RUP / RMM

8.2 各子单元参数

单元 操作 延迟 关键实现
FALU FADD.S / FSUB.S 3-4周期 前导1预测器(LOP)
FALU FCVT.S.W / FCVT.W.S 2-3周期
FALU FMIN.S / FMAX.S / FSGNJ.S 1周期
FMAU FMADD / FMSUB / FMUL.S 4-5周期 24×24部分积 (13×Booth 25-bit) + LZA
FDSU FDIV.S 14-18周期 SRT恢复除法
FDSU FSQRT.S 14-17周期 SRT算法

9. 访存单元 (LSU)

9.1 D-Cache组织

参数
相联度 2路组相联
行大小 32字节
写策略 写回 (Write-Back) / 写分配可选
Dirty位 每行1位
替换策略 FIFO

9.2 DC FSM (5状态)

IDLE → DCS (Data Cache Stage: Tag查找+数据访问)
       ├── cmplt → IDLE
       ├── reply & ~wakeup → FRZ (等待依赖解决)
       ├── reply → REPLY (驱动DCache访问)
       └── miss → WFC (等待Line Fill完成)

9.3 存储层次组件

组件 功能
STB (Store Buffer) 缓冲存储操作,支持向Load转发 (RAW bypass)
LFB (Line Fill Buffer) Cache行填充
VB (Victim Buffer) Dirty行驱逐缓冲
NCB (Non-Cacheable Buffer) 非缓存/强序访问
LM (LR/SC Monitor) 原子操作监视
ICC (Cache Maintenance) FENCE.I / CMO操作

9.4 Load数据来源优先级

1. Victim Buffer前递 (vb_dc_ld_fwd_vld)
2. Store Buffer前递  (stb_dc_ld_fwd_vld) ← RAW bypass
3. Line Fill Buffer   (lfb_dc_ld_data_vld)
4. DCache数据         (dc_ld_data_from_dcache)

10. CSR与特权架构 (CP0)

10.1 标准RISC-V CSRs

地址 名称 描述
0x300 MSTATUS 机器状态 (MIE/MPIE/MPP/FS)
0x301 MISA ISA扩展支持
0x304 MIE 中断使能
0x305 MTVEC 陷阱向量基址
0x307 MTVT CLIC向量表基址
0x341 MEPC 异常PC
0x342 MCAUSE 异常原因
0x343 MTVAL 异常值
0x344 MIP 中断挂起
0x345 MNXTI CLIC下一个中断
0x346 MINTSTATUS CLIC中断状态
0x001-0x003 FFLAGS / FRM / FCSR 浮点控制状态
0x3A0-0x3BF PMPCFG / PMPADDR PMP配置与地址 (8区域)

10.2 T-Head自定义CSRs

地址 名称 描述
0x7C0 MXSTATUS 扩展状态 (C-SKY EE使能)
0x7C1 MHCR 硬件配置 (BHT/BTB/RAS/I$/D$使能)
0xFC0 MCPUID CPU ID特性
0x7E0 MRADDR 复位地址
0x7E2 MNMICAUSE NMI原因
0x350 MCLICBASE CLIC基址
0x800 FXCR 浮点扩展控制
0x7B0-0x7B1 DCSR / DPC 调试控制状态 / 调试PC

10.3 异常处理流程

1. IDU检测异常 → idu_cp0_ex1_expt_vld/type/high
2. CP0.iui 解码异常类型 → 生成 trap_vec/tval
3. CP0.regs 写入 MEPC/MCAUSE/MTVAL
4. CP0→RTU: cp0_rtu_ex1_expt_vec/tval/flush
5. RTU 发起全局冲刷 → IFU重定向到 MTVEC
6. 硬件栈 IPUSH 自动压栈 (可选)

10.4 特权模式

  • M-mode:最高特权级,所有CSR可访问
  • U-mode:受限访问
  • 暂不支持 S-mode(Supervisor)
  • 通过 MSTATUS.MPP 保存/恢复特权级

11. 退休单元 (RTU)

11.1 提交总线 (CBUS)

汇聚所有执行单元的EX1完成信号:

IU EX1 cmplt ─┐
LSU EX1 cmplt ─┤
CP0 EX1 cmplt ─┼──► CBUS组合逻辑 ──► EX2提交包 (rtu_retire_ex2_*)
FPU EX1 cmplt ─┤
INT req ───────┘

11.2 结果总线 (RBUS) — 3级写回

写回端口 来源 时序 描述
WB0 IU EX2, FPU 最早 ALU / 乘除 / 浮点结果
WB1 LSU 次早 Load数据
WB2 (保留) 最晚 第三写回源

11.3 死锁检测

  • 双故障 (double fault) 检测:异常处理中再次异常
  • 输出:rtu_sysio_lockup_on(外部可见)、rtu_ifu_lockup_req
  • 恢复:ifu_rtu_lockup_ack(IFU空闲后确认)

12. 总线架构

12.1 总线矩阵 (BMU)

                  ┌─────────────┐
  IFU (取指) ────►│             ├────► IAHBL (I-side AHB) → 外部指令存储器
                  │   BMU       │
  LSU (访存) ────►│  总线矩阵    ├────► DAHBL (D-side AHB) → 外部数据存储器
                  │             │
                  │             ├────► SAHBL (System AHB) → 外设总线
                  │             │
                  │             ├────► TCIPIF → CLIC/CLINT/SysMap (内部外设)
                  └─────────────┘

12.2 AHB-Lite总线接口

接口 模块 宽度 用途
IAHBL pa_iahbl_top 32-bit 指令取指
DAHBL pa_dahbl_top 32-bit 数据访问
SAHBL pa_sahbl_top 32-bit 系统总线

13. 中断控制器

13.1 CLIC (核局部中断控制器)

特性 规格
中断源数 128 (pad_clic_int_vld[127:0])
优先级位宽 8位 (clic_cpu_int_il[7:0])
中断ID位宽 12位 (clic_cpu_int_id[11:0])
硬件向量化 支持 (clic_cpu_int_hv)
中断嵌套 支持(基于优先级 cp0_rtu_int_level
Tail-Chaining 支持(中断返回后直接进入下一个中断)

13.2 CLINT (核局部中断定时器)

  • 64位 mtime 计数器(外部时钟源 pad_cpu_sys_cnt[63:0]
  • 机器定时器中断 (MTI) + 软件中断生成

14. 调试与追踪

14.1 调试框架

14.2 硬件触发器

3个Match Control触发器:地址匹配 / 数据匹配 / 执行-加载-存储触发

14.3 调试功能

功能 描述
Halt / Resume 同步/异步Halt请求,Resume恢复
Step 单步执行模式
Abstract Command 通过Program Buffer执行抽象命令
DMI / APB 外部调试器通过APB访问Debug Module
PC Trace FIFO 分支PC追踪(可冻结 cp0_dtu_pcfifo_frz
Halt on Reset 复位后暂停

14.4 时钟域交叉 (CDC)

  • 电平同步器 (pa_dtu_cdc_lvl)
  • 脉冲同步器 (pa_dtu_cdc_pulse)
  • DMI脉冲同步 (tdt_dmi_pulse_sync)

15. 仿真验证环境

15.1 SoC Testbench架构

tb (Testbench Top)
├── clk/rst 生成 (CPU_CLK=100MHz, JTG_CLK=30MHz)
├── Memory 加载 ($readmemh from inst.pat/data.pat)
├── Pass/Fail 监测 (写地址 0x6000fff8: 0xFFF→PASS, 0xEEE→FAIL)
└── soc
    ├── cpu_sub_system_ahb (E906核心)
    ├── ahb_fifo (AHB延迟桥)
    └── ahb (AHB仲裁器, 3 Slave)
        ├── Slave 1: mem_ctrl (共享SRAM)
        ├── Slave 2: apb (APB子系统)
        │   ├── UART (16550兼容)
        │   ├── Timer × 4
        │   ├── PMU & GPIO & Clock Generator
        │   ├── SMPU (安全内存保护)
        │   └── WIC (唤醒中断控制器)
        └── Slave 3: err_gen (错误生成)

15.2 仿真工具链

仿真器 Make参数 波形 许可
Icarus Verilog SIM=iverilog(默认) VCD 开源
Synopsys VCS SIM=vcs FSDB (Verdi) 商业
Cadence NC-Verilog SIM=nc VCD 商业

15.3 测试用例

测试 类型 语言 描述
hello_world 功能 C printf + inline asm 自检
coremark 基准 C CoreMark 性能基准
ISA_RV32IMAC ISA兼容 汇编 RV32IMAC 指令全覆盖
ISA_RV32F ISA兼容 汇编 RV32F 浮点指令全覆盖
memcp / memset 功能 C 内存拷贝/设置
csr_rw_extend CSR 汇编 扩展CSR读写
debug JTAG调试 SV+ASM 4线JTAG调试验证
debug_2wire_jtag JTAG调试 SV+ASM 2线cJTAG调试验证

15.4 软件工具链

  • 编译器riscv64-unknown-elf-gcc(T-Head定制版)
  • 架构标志-mtune=e906 -march=rv32imafc -mabi=ilp32f
  • 内存布局:MEM1 0x00000000 (256KB指令) + MEM2 0x20000000 (768KB数据)
  • 启动代码crt0.s(初始化SP, 复制.data, 清零.bss, 配置mtvec/mtvt, 使能FPU)

15.5 SDC时序约束

约束
CPU时钟周期 1.0ns (1GHz)
JTAG时钟周期 40ns (25MHz)
Setup Uncertainty 0.2ns (UMC28: 0.3ns)
Hold Uncertainty 0.08ns
Max Fanout 32
Max Transition 0.5ns
False Path CPU_CLK ↔ JTG_CLK(异步CDC)

16. 设计亮点与学习要点

🔋 低功耗设计
  • 160+ gated_clk_cell 遍布全设计
  • 3级ICG层次:global → module → local
  • GPR高半寄存器 (x17-x31) 独立门控
  • I$ Tag Hit Buffer 减少Tag RAM访问
  • LPMD低功耗模式 (WFI/WFE)
🎯 推测执行
  • BHT 3套GHR(架构/推测/快照)
  • 硬件栈IPUSH推测压栈
  • BTB推测分配,误预测恢复
⚡ 性能优化
  • 流水线AHB:支持2个待处理事务
  • BTB单周期全相联(寄存器实现)
  • 4级前递网络,每操作数独立
  • 双结果总线:64位结果同时前递
  • Tail-Chaining中断减少开销
📐 代码风格
  • 命名:源_目标_信号(如 ifu_idu_id_inst
  • 控制/数据通路分离(ctrl / dp 模块)
  • 参数化设计:Cache容量/位宽可配
  • 模块化:每功能块独立子目录
🔧 可综合设计
  • 全同步设计,统一时钟树驱动
  • SRAM独立wrapper,方便工艺库替换
  • Debug域CDC电平/脉冲同步器
  • DFT扫描链接口
📋 RISC-V规范兼容
  • RV32I ✅ | RV32M ✅ | RV32A ✅
  • RV32C ✅ | RV32F ✅ | RV32D 🔧
  • Privileged 1.11 ✅ | Debug 0.13 ✅
  • CLIC ✅ | C-SKY EE ✅

附录

A. 参考资料

B. 源码文件索引

功能 路径 关键文件
顶层 cpu/rtl/ openE906.vpa_core_top.vpa_core.v
取指 ifu/rtl/ pa_ifu_top.vpa_ifu_pcgen.vpa_ifu_icache.v
译码 idu/rtl/ pa_idu_top.vpa_idu_ctrl.vpa_idu_gpr.v
执行 iu/rtl/ pa_iu_top.vpa_iu_alu.vpa_iu_bju.v
访存 lsu/rtl/ pa_lsu_top.vpa_lsu_dc.vpa_lsu_stb.v
CSR cp0/rtl/ pa_cp0_top.vpa_cp0_regs.v
退休 rtu/rtl/ pa_rtu_top.vpa_rtu_cbus.v
仿真 smart_run/ Makefilelogical/tb/tb.vlogical/system/soc.v

C. 缩写对照表

缩写 全称 缩写 全称
IFU Instruction Fetch Unit IDU Instruction Decode Unit
IU Integer Unit LSU Load/Store Unit
FPU Floating Point Unit CP0 Coprocessor 0 (CSR)
RTU Retire/Trap Unit BMU Bus Matrix Unit
DTU Debug/Trace Unit TDT T-Head Debug Transport
CLIC Core-Local Interrupt Controller CLINT Core-Local Interrupt Timer
PMP Physical Memory Protection HPM Hardware Performance Monitor
ICG Integrated Clock Gating BTB Branch Target Buffer
BHT Branch History Table RAS Return Address Stack
STB Store Buffer LFB Line Fill Buffer
VB Victim Buffer NCB Non-Cacheable Buffer

报告完成 | 基于 XUANTIE-RV/opene906 仓库源码的完整分析 | 199个Verilog文件 | 28个功能模块 | 16章系统分析
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐