基于开源代码仓库 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 FSM:IDLE → 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实现了硬件中断压栈/出栈机制:
- IPUSH:
ST_MEPC → ST_MCAUSE → ST_GPR(循环) → SUB_SP → SPEC_EXPT
- IPOP:
LD_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.v, pa_core_top.v, pa_core.v |
| 取指 |
ifu/rtl/ |
pa_ifu_top.v, pa_ifu_pcgen.v, pa_ifu_icache.v |
| 译码 |
idu/rtl/ |
pa_idu_top.v, pa_idu_ctrl.v, pa_idu_gpr.v |
| 执行 |
iu/rtl/ |
pa_iu_top.v, pa_iu_alu.v, pa_iu_bju.v |
| 访存 |
lsu/rtl/ |
pa_lsu_top.v, pa_lsu_dc.v, pa_lsu_stb.v |
| CSR |
cp0/rtl/ |
pa_cp0_top.v, pa_cp0_regs.v |
| 退休 |
rtu/rtl/ |
pa_rtu_top.v, pa_rtu_cbus.v |
| 仿真 |
smart_run/ |
Makefile, logical/tb/tb.v, logical/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章系统分析
所有评论(0)