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

1. E906 概述

1.1 定位

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

1.2 核心特性

特性规格
ISARV32IMA[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
FPUIEEE 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级流水线:

阶段名称执行单元描述
IFInstruction FetchIFUPC生成、I$访问、BTB/BHT预测
IDInstruction DecodeIDU指令译码、寄存器读、操作数前递
EX1Execute 1IU/LSU/CP0/FPUALU运算、地址生成、分支解析
EX2Execute 2IU/LSU乘法完成、LSU数据返回
EX3Execute 3LSU多周期LSU前递
WB0Writeback 0RTU→IDUIU/FPU结果写回(早期)
WB1Writeback 1RTU→IDULSU load结果写回
WB2Writeback 2RTU→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→IFUidu_ifu_id_stallIFU暂停取指
IU→IDUiu_idu_ex1_stallIDU暂停发射
IU→IDUiu_idu_bju_stallBJU EX2等待LSU数据
LSU→IDUlsu_idu_ex1_stallLSU忙
CP0→IDUcp0_idu_ex1_stallCSR操作进行中
FPU→IDUfpu_idu_ex1_stallFPU忙
IDU内部ctrl_dep_ld_stallRAW: rs依赖进行中的load
IDU内部ctrl_dep_norm_stallRAW: rs依赖EX1结果
IDU内部ctrl_dep_div_stallRAW: rs依赖除法结果
IDU内部ctrl_fence_cp0_stallFENCE等待所有单元空闲
RTU→IDUrtu_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位忙状态:

编码状态含义
000IDLE空闲
001BUSY1IU普通结果待写回 (1周期)
010BUSY_LSU1第1个LSU结果待写回 (load)
011BUSY_DIV1第1个DIV结果待写回
100BUSY2IU配对结果待写回 (rd/rd+1)
110BUSY_LSU2第2个LSU结果待写回 (配对load)
111BUSY_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 各子单元参数

单元操作延迟关键实现
FALUFADD.S / FSUB.S3-4周期前导1预测器(LOP)
FALUFCVT.S.W / FCVT.W.S2-3周期—
FALUFMIN.S / FMAX.S / FSGNJ.S1周期—
FMAUFMADD / FMSUB / FMUL.S4-5周期24×24部分积 (13×Booth 25-bit) + LZA
FDSUFDIV.S14-18周期SRT恢复除法
FDSUFSQRT.S14-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

地址名称描述
0x300MSTATUS机器状态 (MIE/MPIE/MPP/FS)
0x301MISAISA扩展支持
0x304MIE中断使能
0x305MTVEC陷阱向量基址
0x307MTVTCLIC向量表基址
0x341MEPC异常PC
0x342MCAUSE异常原因
0x343MTVAL异常值
0x344MIP中断挂起
0x345MNXTICLIC下一个中断
0x346MINTSTATUSCLIC中断状态
0x001-0x003FFLAGS / FRM / FCSR浮点控制状态
0x3A0-0x3BFPMPCFG / PMPADDRPMP配置与地址 (8区域)

10.2 T-Head自定义CSRs

地址名称描述
0x7C0MXSTATUS扩展状态 (C-SKY EE使能)
0x7C1MHCR硬件配置 (BHT/BTB/RAS/I$/D$使能)
0xFC0MCPUIDCPU ID特性
0x7E0MRADDR复位地址
0x7E2MNMICAUSENMI原因
0x350MCLICBASECLIC基址
0x800FXCR浮点扩展控制
0x7B0-0x7B1DCSR / 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级写回

写回端口来源时序描述
WB0IU EX2, FPU最早ALU / 乘除 / 浮点结果
WB1LSU次早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总线接口

接口模块宽度用途
IAHBLpa_iahbl_top32-bit指令取指
DAHBLpa_dahbl_top32-bit数据访问
SAHBLpa_sahbl_top32-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 VerilogSIM=iverilog(默认)VCD开源
Synopsys VCSSIM=vcsFSDB (Verdi)商业
Cadence NC-VerilogSIM=ncVCD商业

15.3 测试用例

测试类型语言描述
hello_world功能Cprintf + inline asm 自检
coremark基准CCoreMark 性能基准
ISA_RV32IMACISA兼容汇编RV32IMAC 指令全覆盖
ISA_RV32FISA兼容汇编RV32F 浮点指令全覆盖
memcp / memset功能C内存拷贝/设置
csr_rw_extendCSR汇编扩展CSR读写
debugJTAG调试SV+ASM4线JTAG调试验证
debug_2wire_jtagJTAG调试SV+ASM2线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 Uncertainty0.2ns (UMC28: 0.3ns)
Hold Uncertainty0.08ns
Max Fanout32
Max Transition0.5ns
False PathCPU_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
CSRcp0/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. 缩写对照表

缩写全称缩写全称
IFUInstruction Fetch UnitIDUInstruction Decode Unit
IUInteger UnitLSULoad/Store Unit
FPUFloating Point UnitCP0Coprocessor 0 (CSR)
RTURetire/Trap UnitBMUBus Matrix Unit
DTUDebug/Trace UnitTDTT-Head Debug Transport
CLICCore-Local Interrupt ControllerCLINTCore-Local Interrupt Timer
PMPPhysical Memory ProtectionHPMHardware Performance Monitor
ICGIntegrated Clock GatingBTBBranch Target Buffer
BHTBranch History TableRASReturn Address Stack
STBStore BufferLFBLine Fill Buffer
VBVictim BufferNCBNon-Cacheable Buffer

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

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐