玄铁 E902 是平头哥半导体有限公司自主研发的极低功耗、极低成本嵌入式 CPU 核,以 8 位 CPU 的成本获得 32 位嵌入式 CPU 的运行效率与性能。 E902 兼容 RISC-V 指令架构,采用 16/32 位混合编码系统,指令系统与流水线硬件结构精简高效,具备极低成本、极低功耗和高代码密度等优点。 E902 主要针对智能卡、智能电网、低成本微控制器、无线传感网络等嵌入式应用。
E902 核的 RTL 代码是开源的,开源版本仓库:https://github.com/T-head-Semi/opene902。
1、E902架构概述
E902 处理器体系结构的主要特点如下:
- 支持 RISC-V RV32E[M]C 指令集;
- 16 个 32 位通用寄存器;
- 两级顺序执行流水线;
- 支持 RISC-V 机器模式和用户模式;
- 支持 RISCV debug 架构,支持标准五线 jtag 调试接口,支持 cjtag 两线调试接口;
- 可配置的单周期硬件乘法器,多周期硬件除法器;
- 兼容 RISC-V CLIC 中断标准,支持中断嵌套,外部中断源数量最高可配置 240 个;
- 兼容 RISC-V PMP 内存保护标准, 0/4/8/12/16 区域可配置;
- 支持 AHB-Lite 总线协议,支持指令总线,系统总线;
- 支持可配置的指令高速缓存,缓存行 16 字节,容量 2KiB/4KiB/8KiB 可配;
- 支持平头哥扩展编程模型;
- 支持复位启动地址硬件集成时可配置;
- 支持软复位操作
流水线
E902 处理器采用 2 级流水线结构:取指和执行。
- 指令取指阶段主要负责从内存中获取指令。
- 指令执行阶段主要负责指令译码、执行和回写。
PMP
可配置的物理内存保护单元(Physical Memory Protection,PMP)负责物理地址的权限检查实现内存的保护功能,权限可划分为:不可读写/只读/可读写,可执行/不可执行。
调试
TDT 调试单元(T-Head Debug Trace)支持各种调试方式,包括软件断点、内存断点、单步和多步的指令跟踪等多种方式,可在线调试 CPU、通用寄存器(GPR)、控制寄存器(CSR)和内存。
紧耦合 IP 架构
为了提高 E902 的系统集成度,方便用户集成与开发,E902 设置内部总线用于集成紧耦合 IP(Tightly Coupled IP,TCIP)。这些紧耦合 IP 包括兼容 RISC-V 标准的 CLINT 和矢量中断控制器 CLIC。
中断控制器
矢量中断控制器的主要特征包括:
- 支持 1-240 个外部中断源;
- 支持中断嵌套;
- 支持电平中断和脉冲中断;
- 中断优先级 4/8/16/32 任意可配。
总线
E902 的系统总线接口支持 AMBA3.0 AHB-Lite 协议
性能
Dhryston:1.55 DMIPS/MHZ(O2)
CoreMark:2.69 CoreMark/MHZ(O3)
E902 对标的是 ARM Cortex-M0+。Cortex-M0+ 的 CoreMark 值为 2.46 CoreMark®/MHz,M0 内核的2.33 CoreMark/MHz。
2、通用寄存器
寄存器 | ABI 名称 | 描述 |
---|---|---|
x0 | zero | 零值 |
x1 | ra | 返回地址 |
x2 | sp | 堆栈指针 |
x3 | gp | 全局指针 |
x4 | tp | 线程指针 |
x5 | t0 | 临时/备用链接寄存器 |
x6-7 | t1-2 | 临时寄存器 |
x8 | s0/fp | 保留寄存器/帧指针 |
x9 | s1 | 保留寄存器 |
x10-11 | a0-a1 | 函数参数/返回值 |
x12-15 | a2-a5 | 函数参数 |
3、SDK
平头哥提供了 E902 和 E902M 的 SDK,应该分别对应 RV32E 和 RV32EM,下载链接:https://www.xrvm.cn/community/download?id=658699855023046656。
SDK 编译的 elf 可以在平头哥提供的 QEMU 上直接运行。
qemu 在运行中可能会出现依赖未安装的情况,可执行以下命令:
$ sudo apt-get install -y libsnappy-dev libpixman-1-dev libpixman-1-dev libjpeg-dev libdaxctl-dev libvdeplug-dev libpmem-dev libgbm-dev libepoxy-dev libgtk-3-0 libaio1 libslirp-dev
ubuntu 22.04 下可能还需要安装以下依赖:
$ sudo apt-get install -y libcapstone-dev libspice-server-dev libsdl2-2.0-0 libsdl2-image-2.0-0 libvirglrenderer-dev libcacard-dev libusbredirparser1 libfuse3-3 libiscsi7 librbd1
- 编译
$ cd SmartL_E902-R2S2-V1.7.11/projects/examples/hello_world
$ make
- 运行
- E902
$ qemu-system-riscv32 -M smartl -cpu e902 -kernel out/smartl_e902_evb.elf -nographic -m 128M
Hello World!
Hello_World runs successfully!
- E902M
$ qemu-system-riscv32 -M smartl -cpu e902m -kernel out/smartl_e902_evb.elf -nographic -m 128M