跳转至

G233 SoC 硬件手册(教学版)

免责声明

本手册描述的是用于 QEMU 训练营的 教学用虚拟 SoC/板卡(G233) 的规格与编程模型,并不对应任何实体芯片。 训练营可能在不另行通知的情况下调整实现细节;若手册与实际实现不一致,以测题/参考实现为准。

主要贡献者

项目
目标读者 训练营学员、平台建模/驱动开发人员
适用范围 docs/exercise/2026/stage1/soc/(SoC 方向)
文档状态 Draft
最后更新 2026-03-11

1. 概述

G233 是为 QEMU 训练营定制的虚拟 SoC/板卡。其设计目标是提供一个足够小但覆盖关键子系统的硬件抽象,用于:

  • 板级/SoC 设备建模(MMIO、IRQ、总线、设备实例化与连接)
  • 通用外设建模(GPIO、PWM、WDT)
  • SPI 外设建模与存储器件互联(SSI、Flash、片选、中断)

本手册重点描述 内存映射、外设寄存器定义、中断互联以及编程模型

2. 文档约定

2.1 数值与端序

  • 除非特别说明,所有数值均为十六进制,形如 0x1001_8000(下划线仅用于分组)。
  • 地址均为 字节地址(byte addressable)
  • 所有多字节寄存器访问均按 小端序(little-endian) 解释。

2.2 术语:未定义 / 实现定义

  • 未定义(undefined):实现可以产生任意结果(包括但不限于异常/死循环/数据破坏);软件不得依赖其行为。
  • 实现定义(implementation-defined):实现必须在某处(手册或实现文档)给出选择;若未给出,软件仍不得依赖。

本手册对一些非关键细节会采用"实现定义/未定义"以避免与训练营实现细节冲突。

3. 系统架构

3.1 顶层框图(示意)

+------------------------------------------------------------------------------+
|                       G233 Board Architecture Diagram                        |
|                                                                              |
|  +-----------------+       +--------------------+       +-----------------+  |
|  |       DRAM      | <---> |   riscv.g233.cpu   | <---> |       MROM      |  |
|  |   0x8000_0000   |       | - RVA23            |       |   0x0000_1000   |  |
|  |   0xBFFF_FFFF   |       | - Xg233ai          |       |   0x0000_2FFF   |  |
|  +-----------------+       +----------+---------+       +-----------------+  |
|                                       |                                      |
|               +-----------+-----------+-----------+-----------+              |
|               |           |           |           |           |              |
|       +-------v---+  +----v----+  +---v-----+  +-v-------+  +v----------+   |
|       |   PLIC    |  |  ACLINT |  |  PL011  |  |   WDT   |  |   GPIO    |   |
|       | 0x0C00_.. |  | 0x0200_ |  | 0x1000_ |  | 0x1001_ |  | 0x1001_   |   |
|       | 0x0FFF_.. |  | 0x0200_ |  | 0x1000_ |  | 0x1001_ |  | 0x1001_   |   |
|       +-----+-----+  +---------+  +---------+  +---------+  +-----------+   |
|             |                                                                |
|       +-----+-----+-----+-----+                                             |
|       |           |           |                                              |
|   +---v---+   +---v---+   +--v----+   +---v----+   +---v----+               |
|   |  PWM  |   |  SPI  |   | Flash |   | Flash  |   | Flash  |               |
|   | 0x..5 |   | 0x..8 |   | CS0   |   | CS1    |   | (opt)  |               |
|   +-------+   +---+---+   +-------+   +--------+   +--------+               |
|                   |            |            |                                 |
|                   +------SSI Bus-----------+                                 |
|                                                                              |
|                              Bus Fabric / AXI                                |
+------------------------------------------------------------------------------+

3.2 外设互联概要

外设 连接关系 PLIC IRQ
PL011 UART CPU ↔ MMIO 1
GPIO CPU ↔ MMIO,32 路引脚 2
PWM CPU ↔ MMIO,4 通道输出 3
WDT CPU ↔ MMIO,超时产生中断/复位 4
SPI CPU ↔ MMIO ↔ SSI 总线 ↔ Flash 5

4. 地址空间与存储器映射

4.1 地址映射总览

下表给出 G233 低地址空间(低 32 位)内的主要映射。未列出的地址范围为 实现定义(可能返回 0、产生总线错误或触发访存异常)。

区域 Base End Size 访问属性 说明
MROM 0x0000_1000 0x0000_2FFF 8 KiB R-X 启动只读存储区(Boot ROM)
ACLINT (MSWI) 0x0200_0000 0x0200_3FFF 16 KiB R/W 软件中断(Machine SW Interrupt)
ACLINT (MTIME/MTIMECMP) 0x0200_4000 0x0200_BFFF 32 KiB R/W 机器定时器(Machine Timer)
PLIC 0x0C00_0000 0x0FFF_FFFF 64 MiB R/W 外部中断控制器(PLIC)
PL011 UART 0x1000_0000 0x1000_0FFF 4 KiB R/W 串口控制器(PL011 兼容)
WDT 0x1001_0000 0x1001_0FFF 4 KiB R/W 看门狗定时器(见第 6 章)
GPIO 0x1001_2000 0x1001_20FF 256 B R/W 通用 GPIO(见第 7 章)
PWM 0x1001_5000 0x1001_5FFF 4 KiB R/W PWM 控制器(见第 8 章)
SPI 0x1001_8000 0x1001_8FFF 4 KiB R/W SPI 控制器(见第 9 章)
DRAM 0x8000_0000 0xBFFF_FFFF 1 GiB R/W/X 主内存

4.2 MMIO 访问规则(通用)

  • 除非章节另行说明,MMIO 寄存器按 32-bit 对齐访问;非对齐访问的行为为 实现定义
  • 对寄存器中标记为 保留(Reserved) 的位:软件 必须写 0,读出值为 实现定义
  • 同一寄存器的并发访问、以及设备内部状态机的精确定序为 实现定义(建议驱动使用轮询/中断配合,并做好超时保护)。

5. 处理器与中断子系统

5.1 CPU 概览

项目
处理器核名称 riscv.g233.cpu
ISA RV64GC (RVA23) + Xg233ai

Note

RVA23 的完整扩展集合与 CSR 行为,以训练营给出的 QEMU 配置与实现为准。自定义指令扩展 Xg233ai 见 G233 CPU 指令扩展手册

5.2 启动与复位

  • 复位后 CPU 从 MROM 区域取指执行(具体入口地址由平台配置/固件决定)。
  • MROM 内容通常用于最小初始化并跳转到 DRAM 中的后续代码。

5.3 中断控制器

ACLINT:提供软件中断(MSWI)与机器定时器(MTIME/MTIMECMP),用于 M-mode 的 MSIP/MTIP 等本地中断源。

PLIC:聚合板级外设的外部中断源,并向 CPU 递交外部中断(MEIP)。

5.4 PLIC 中断源编号

IRQ 来源 触发方式 说明
1 PL011 UART 电平 串口收发中断
2 GPIO 电平 引脚中断(由 GPIO_IS 汇聚)
3 PWM 电平 周期完成中断
4 WDT 电平 看门狗超时中断
5 SPI 电平 SPI TXE/RXNE/错误中断

Note

IRQ 0 保留不使用。各中断的优先级与使能配置通过 PLIC 寄存器完成(PLIC 编程模型遵循 RISC-V PLIC 规范,本手册不再重复)。

6. 看门狗定时器(WDT)

WDT (Watchdog Timer) 提供系统级超时保护,软件需在倒计时归零前周期性"喂狗"以防止系统复位或触发中断。

6.1 功能特性

  • 32 位递减计数器
  • 可配置超时时间(通过装载值)
  • 超时可产生中断或系统复位(由控制位选择)
  • 喂狗操作需写入特定密钥值
  • 锁定机制:写入锁定密钥后,控制寄存器变为只读

6.2 寄存器映射

WDT 基地址:0x1001_0000

Offset 寄存器 访问 复位值 描述
0x00 WDT_CTRL R/W 0x0000_0000 控制寄存器
0x04 WDT_LOAD R/W 0x0000_FFFF 装载值寄存器
0x08 WDT_VAL R 0x0000_FFFF 当前计数值(只读)
0x0C WDT_SR R/W 0x0000_0000 状态寄存器
0x10 WDT_KEY W 密钥寄存器(只写)

6.3 寄存器定义

6.3.1 WDT_CTRL(Offset 0x00)— Control Register

Bit 名称 访问 复位 描述
31:4 Reserved - 0 保留位,必须保持为 0
3 LOCK R 0 锁定状态:1 表示已锁定(只读)
2 RSTEN R/W 0 超时复位使能:0 禁用;1 超时时产生系统复位
1 INTEN R/W 0 超时中断使能:0 禁用;1 超时时向 PLIC 发起中断
0 EN R/W 0 WDT 使能:0 停止计数;1 开始倒计时

6.3.2 WDT_LOAD(Offset 0x04)— Load Value Register

Bit 名称 访问 复位 描述
31:0 LOAD R/W 0x0000_FFFF 装载值:喂狗时计数器重置为此值

6.3.3 WDT_VAL(Offset 0x08)— Current Value Register

Bit 名称 访问 复位 描述
31:0 VAL R 0x0000_FFFF 当前倒计时值(只读)

6.3.4 WDT_SR(Offset 0x0C)— Status Register

Bit 名称 访问 复位 描述
31:1 Reserved R 0 保留位
0 TIMEOUT R/W 0 超时标志:1 表示计数器已归零;写 1 清除

6.3.5 WDT_KEY(Offset 0x10)— Key Register

Bit 名称 访问 复位 描述
31:0 KEY W 密钥值(只写,读返回 0)

密钥值定义

密钥值 操作
0x5A5A_5A5A 喂狗:将 WDT_LOAD 的值重新装载到计数器,同时清除 TIMEOUT 标志
0x1ACC_E551 锁定:将 WDT_CTRL 锁定为只读(LOCK 位置 1),直到下次复位

Note

写入其他值到 WDT_KEY 的行为为 未定义

6.4 编程模型

  1. 配置 WDT_LOAD 设定超时装载值。
  2. 配置 WDT_CTRL:设置 INTEN(中断)或 RSTEN(复位),置位 EN 启动计数。
  3. 软件周期性向 WDT_KEY 写入 0x5A5A_5A5A 喂狗。
  4. 若需锁定配置(防止误改),向 WDT_KEY 写入 0x1ACC_E551
  5. 超时检测:轮询 WDT_SR.TIMEOUT 或通过 PLIC 中断响应。

7. GPIO 控制器

GPIO (General-Purpose Input/Output) 提供 32 路通用数字引脚,每路可独立配置方向、输出电平、以及中断触发条件。

7.1 功能特性

  • 32 路独立引脚(GPIO[31:0])
  • 每路可配置为输入或输出
  • 输出电平可独立控制
  • 每路引脚可独立使能中断
  • 中断触发方式可配置:电平触发或边沿触发
  • 中断极性可配置:高电平/上升沿 或 低电平/下降沿

7.2 寄存器映射

GPIO 基地址:0x1001_2000

Offset 寄存器 访问 复位值 描述
0x00 GPIO_DIR R/W 0x0000_0000 方向寄存器
0x04 GPIO_OUT R/W 0x0000_0000 输出数据寄存器
0x08 GPIO_IN R 0x0000_0000 输入数据寄存器
0x0C GPIO_IE R/W 0x0000_0000 中断使能寄存器
0x10 GPIO_IS R/W 0x0000_0000 中断状态寄存器
0x14 GPIO_ITP R/W 0x0000_0000 中断类型寄存器
0x18 GPIO_IPL R/W 0x0000_0000 中断极性寄存器

7.3 寄存器定义

以下寄存器均为 32 位宽,每一位对应一路 GPIO 引脚(bit N 对应 GPIO[N])。

7.3.1 GPIO_DIR(Offset 0x00)— Direction Register

Bit 描述
N GPIO[N] 方向:0 输入;1 输出

7.3.2 GPIO_OUT(Offset 0x04)— Output Data Register

Bit 描述
N GPIO[N] 输出电平:0 低电平;1 高电平。仅当 GPIO_DIR[N] = 1 时有效

7.3.3 GPIO_IN(Offset 0x08)— Input Data Register

Bit 描述
N GPIO[N] 当前引脚电平(只读)。输出模式下读回输出锁存值

7.3.4 GPIO_IE(Offset 0x0C)— Interrupt Enable Register

Bit 描述
N GPIO[N] 中断使能:0 禁用;1 使能

7.3.5 GPIO_IS(Offset 0x10)— Interrupt Status Register

Bit 描述
N GPIO[N] 中断挂起:1 表示触发条件成立;写 1 清除

Note

所有引脚的中断状态通过按位 OR 汇聚为一个 PLIC 中断源(IRQ 2)。软件需读 GPIO_IS 判断具体是哪些引脚触发。

7.3.6 GPIO_ITP(Offset 0x14)— Interrupt Type Register

Bit 描述
N GPIO[N] 中断类型:0 电平触发;1 边沿触发

7.3.7 GPIO_IPL(Offset 0x18)— Interrupt Polarity Register

Bit 描述
N GPIO[N] 中断极性:0 低电平/下降沿;1 高电平/上升沿

7.4 编程模型

输出控制

  1. 设置 GPIO_DIR[N] = 1(输出模式)。
  2. GPIO_OUT[N] 控制引脚电平。

输入读取

  1. 设置 GPIO_DIR[N] = 0(输入模式)。
  2. GPIO_IN[N] 获取当前引脚电平。

中断配置

  1. 配置 GPIO_ITP[N] 选择电平/边沿触发。
  2. 配置 GPIO_IPL[N] 选择触发极性。
  3. 置位 GPIO_IE[N] 使能中断。
  4. 中断发生后,读 GPIO_IS 确认触发引脚,向对应位写 1 清除。

8. PWM 控制器

PWM (Pulse Width Modulation) 控制器提供 4 路独立 PWM 输出通道,每路可独立配置周期、占空比和极性。

8.1 功能特性

  • 4 路独立通道(CH0~CH3)
  • 32 位周期计数器
  • 32 位占空比计数器
  • 每通道可独立使能/禁用
  • 输出极性可配置
  • 周期完成中断

8.2 寄存器映射

PWM 基地址:0x1001_5000。每通道占用 0x10 字节(4 个寄存器),通道 N 基偏移为 N * 0x10。全局寄存器位于 0x40 起始。

通道寄存器(通道 N,偏移基址 = N * 0x10):

Offset 寄存器 访问 复位值 描述
N*0x10 + 0x00 PWM_CHn_CTRL R/W 0x0000_0000 通道控制寄存器
N*0x10 + 0x04 PWM_CHn_PERIOD R/W 0x0000_0000 周期值寄存器
N*0x10 + 0x08 PWM_CHn_DUTY R/W 0x0000_0000 占空比值寄存器
N*0x10 + 0x0C PWM_CHn_CNT R 0x0000_0000 当前计数值(只读)

全局寄存器

Offset 寄存器 访问 复位值 描述
0x40 PWM_GLB R/W 0x0000_0000 全局控制/状态寄存器

8.3 寄存器定义

8.3.1 PWM_CHn_CTRL(Offset N*0x10 + 0x00)— Channel Control

Bit 名称 访问 复位 描述
31:3 Reserved - 0 保留位,必须保持为 0
2 INTIE R/W 0 周期完成中断使能:0 禁用;1 使能
1 POL R/W 0 输出极性:0 默认高电平有效;1 反相
0 EN R/W 0 通道使能:0 停止;1 启动

8.3.2 PWM_CHn_PERIOD(Offset N*0x10 + 0x04)— Period Value

Bit 名称 访问 复位 描述
31:0 PERIOD R/W 0 周期值:计数器从 0 计数到 PERIOD 后归零重载

8.3.3 PWM_CHn_DUTY(Offset N*0x10 + 0x08)— Duty Cycle Value

Bit 名称 访问 复位 描述
31:0 DUTY R/W 0 占空比值:计数器 < DUTY 时输出高电平,>= DUTY 时输出低电平

Note

DUTY 必须 <= PERIOD。当 DUTY > PERIOD 时,输出行为为 实现定义

8.3.4 PWM_CHn_CNT(Offset N*0x10 + 0x0C)— Current Counter

Bit 名称 访问 复位 描述
31:0 CNT R 0 当前计数值(只读)

8.3.5 PWM_GLB(Offset 0x40)— Global Control/Status

Bit 名称 访问 复位 描述
31:8 Reserved - 0 保留位
7 CH3_DONE R/W 0 CH3 周期完成标志;写 1 清除
6 CH2_DONE R/W 0 CH2 周期完成标志;写 1 清除
5 CH1_DONE R/W 0 CH1 周期完成标志;写 1 清除
4 CH0_DONE R/W 0 CH0 周期完成标志;写 1 清除
3 CH3_EN R 0 CH3 运行状态(只读镜像)
2 CH2_EN R 0 CH2 运行状态(只读镜像)
1 CH1_EN R 0 CH1 运行状态(只读镜像)
0 CH0_EN R 0 CH0 运行状态(只读镜像)

Note

各通道的 DONE 标志通过按位 OR 汇聚为一个 PLIC 中断源(IRQ 3)。软件需读 PWM_GLB 判断具体是哪些通道完成。

8.4 编程模型

  1. 配置通道周期:写 PWM_CHn_PERIOD
  2. 配置占空比:写 PWM_CHn_DUTY(值须 <= PERIOD)。
  3. 按需配置极性与中断:写 PWM_CHn_CTRLPOLINTIE)。
  4. 启动通道:置位 PWM_CHn_CTRL.EN
  5. 周期完成中断处理:读 PWM_GLB 确认哪些通道完成,向对应 DONE 位写 1 清除。

9. SPI 控制器

SPI (Serial Peripheral Interface) 控制器提供全双工同步串行通信能力,可用于连接外部传感器、存储器件(Flash)等。

9.1 功能特性

  • 主/从模式(通过寄存器选择,具体互联由平台决定)
  • 全双工同步传输
  • 8-bit 数据位宽
  • 4 路片选信号(CS0~CS3)
  • 中断:TXE、RXNE、错误(溢出/下溢)

9.2 寄存器映射

SPI 基地址:0x1001_8000

Offset 寄存器 访问 复位值 描述
0x00 SPI_CR1 R/W 0x0000_0000 控制寄存器 1
0x04 SPI_CR2 R/W 0x0000_0000 控制寄存器 2
0x08 SPI_SR R/W 0x0000_0002 状态寄存器
0x0C SPI_DR R/W 0x0000_000C 数据寄存器
0x10 SPI_CSCTRL R/W 0x0000_0000 CS 控制寄存器

9.3 寄存器定义

9.3.1 SPI_CR1(Offset 0x00)— Control Register 1

Bit 名称 访问 复位 描述
31:7 Reserved - 0 保留位,必须保持为 0
6 SPE R/W 0 SPI 使能:0 禁用;1 使能
5:3 Reserved - 0 保留位,必须保持为 0
2 MSTR R/W 0 主从选择:0 从模式;1 主模式
1:0 Reserved - 0 保留位,必须保持为 0

9.3.2 SPI_CR2(Offset 0x04)— Control Register 2

Bit 名称 访问 复位 描述
31:8 Reserved - 0 保留位,必须保持为 0
7 TXEIE R/W 0 TXE 中断使能:0 禁用;1 使能
6 RXNEIE R/W 0 RXNE 中断使能:0 禁用;1 使能
5 ERRIE R/W 0 错误中断使能(溢出/下溢):0 禁用;1 使能
4 SSOE R/W 0 软件片选输出使能:0 禁用;1 使能
3:0 Reserved - 0 保留位,必须保持为 0

9.3.3 SPI_SR(Offset 0x08)— Status Register

Bit 名称 访问 复位 描述
31:8 Reserved R 0 保留位
7 BSY R 0 忙标志:0 空闲;1
6:4 Reserved R 0 保留位
3 OVERRUN R/W 0 溢出错误:1 表示发生;写 1 清除
2 UNDERRUN R/W 0 下溢错误:1 表示发生;写 1 清除
1 TXE R 1 发送缓冲区空:1 空;0
0 RXNE R 0 接收缓冲区非空:1 非空;0 为空

9.3.4 SPI_DR(Offset 0x0C)— Data Register

Bit 名称 访问 复位 描述
31:8 Reserved - 0 保留位,必须保持为 0
7:0 DATA R/W 0x0C 写入:发送数据;读取:接收数据

9.3.5 SPI_CSCTRL(Offset 0x10)— Chip Select Control

Bit 名称 访问 复位 描述
31:8 Reserved - 0 保留位,必须保持为 0
7 CS3_ACT R/W 0 CS3 激活:0 未激活;1 激活
6 CS2_ACT R/W 0 CS2 激活:0 未激活;1 激活
5 CS1_ACT R/W 0 CS1 激活:0 未激活;1 激活
4 CS0_ACT R/W 0 CS0 激活:0 未激活;1 激活
3 CS3_EN R/W 0 CS3 使能:0 禁用;1 使能
2 CS2_EN R/W 0 CS2 使能:0 禁用;1 使能
1 CS1_EN R/W 0 CS1 使能:0 禁用;1 使能
0 CS0_EN R/W 0 CS0 使能:0 禁用;1 使能

9.4 编程模型

  1. 初始化:配置 SPI_CR1.MSTR(主/从)与 SPI_CR1.SPE(使能),按需配置 SPI_CR2 中断位。
  2. 片选:通过 SPI_CSCTRL 使能并激活目标 CS(CS 具体有效电平与互联时序为实现定义)。
  3. 传输:
    • 轮询 SPI_SR.TXE == 1 后写 SPI_DR.DATA 发起发送;
    • 轮询 SPI_SR.RXNE == 1 后读 SPI_DR.DATA 获取接收数据。
  4. 错误处理:若 SPI_SR.OVERRUN/UNDERRUN == 1,向 SPI_SR 对应位写 1 清除,并重新初始化传输状态。
  5. 结束:取消激活 CS,必要时关闭 SPI_CR1.SPE

10. SPI Flash 互联

G233 开发板的 SPI 总线(SSI)上挂载了两片 Winbond SPI NOR Flash,通过片选信号区分。

10.1 Flash 配置

片选 型号 容量 JEDEC ID 说明
CS0 W25X16 2 MB 0xEF 0x30 0x15 默认 Flash
CS1 W25X32 4 MB 0xEF 0x30 0x16 扩展 Flash

10.2 支持的 Flash 命令

以下列出 G233 平台要求支持的 Flash 命令子集:

命令码 助记符 描述 地址字节 数据字节
0x9F JEDEC ID 读取制造商/设备 ID 0 3 (读)
0x05 RDSR 读状态寄存器 0 1 (读)
0x06 WREN 写使能 0 0
0x04 WRDI 写禁止 0 0
0x20 SE 扇区擦除 (4 KB) 3 0
0x02 PP 页编程 (最多 256 B) 3 1-256 (写)
0x03 READ 读数据 3 N (读)

10.3 Flash 状态寄存器

Bit 名称 描述
0 BUSY 1 表示擦除/编程操作正在进行
1 WEL 1 表示写使能已激活
7:2 Reserved 保留

10.4 典型操作流程

读取 JEDEC ID:激活 CS → 发送 0x9F → 读取 3 字节 → 取消 CS。

扇区擦除:激活 CS → 发送 0x06 (WREN) → 取消 CS → 激活 CS → 发送 0x20 + 3 字节地址 → 取消 CS → 轮询 BUSY 直到完成。

页编程:激活 CS → 发送 0x06 (WREN) → 取消 CS → 激活 CS → 发送 0x02 + 3 字节地址 + 数据(最多 256 字节)→ 取消 CS → 轮询 BUSY 直到完成。

数据读取:激活 CS → 发送 0x03 + 3 字节地址 → 连续读取 N 字节 → 取消 CS。