玄铁C910简介
概述
C910MP 是基于RISC-V 指令架构的 64 位超高性能多核心处理器,主要面向对性能要求严格的高端嵌入式应用,如人工智能、机器视觉、视频监控、自动驾驶、移动智能终端、高性能通信、信息安全等。
C910MP 采用同构多核架构,支持1~4 个C910 核心可配置。每个C910 核心采用自主设计的微体系结构,并重点针对性能进行优化,引入 3 发射 8 执行的超标量架构 1 和多通道的数据预取等高性能技术,配有单/双精度浮点单元,可进一步选配面向矢量运算引擎(Vector)。系统管理方面,C910MP 集成片上功耗管理单元,支持多电压和多时钟管理的低功耗技术。此外,C910 核心支持实时检测并关断内部空闲功能模块,进一步降低处理器动态功耗。
在性能方面,玄铁910支持16核,单核性能的CoreMark跑分达到 7.1 Coremark/MHz(O3),Dhrystone跑分在 5.8 DMIPS/MHZ(O2),主频达到 2.5GHz,比目前业界最好的RISC-V处理器性能高40%以上(平头哥宣称),其性能相当于ARM Cortex-A72、Intel i7-4700HQ。
特点
- 同构多核架构,支持 1~4 个C910 核心可配置;
- 支持AXI4.0 Master 接口,128 比特的总线宽度;
- 支持1 个AXI 4.0 的 Slave 接口可配置,128 比特的总线宽度;
- 两级高缓结构,哈佛结构一级高缓和共享的二级高缓;
- 一级缓存支持 MESI 2 的一致性协议,二级缓存支持 MOESI 3 的一致性协议;
- 二级高缓支持16 路组相联,可配置的 ECC 或奇偶校验机制;
- 二级高缓大小可配置,支持 128KB、256KB、512KB 和 1MB、2MB、4MB、8MB,缓存行 SIZE 为 64B;
- 支持私有中断控制器 CLINT 和公有中断控制器 PLIC;
- 支持计时器功能;
- 支持自定义且接口兼容RISC-V 的多核调试框架;
特色技术
-
混合分支处理
包含分支方向、分支地址、函数返回地址以及间接跳转地址预测的混合处理技术,提升取指效率。 -
数据预取
多通道、多模式数据预取技术,大幅提升数据访问带宽 -
快速内存加载
提前获取内存访问数据,降低加载到应用(load-to-use)延迟 -
存储投机访问预测
预测内存乱序投机访问,提升执行效率
C910MP系统结构
核内子系统
C910 核内子系统主要包含:指令提取单元(IFU)、指令译码单元(IDU)、整型执行单元(IU)、浮点单元(FPU)、可配的矢量执行单元(VU)、存储载入单元(LSU)、指令退休单元(RTU)、虚拟内存管理单元(MMU)和物理内存保护单元(PMP)。
指令提取单元(IFU)
指令提取单元(IFU),一次可最多提取八条指令并对其并行处理。实现了多项技术以提高访问效率,比如指令高缓路预测,指令暂存器,循环加速缓存器,直接/间接分支预测等。整个指令提取单元具有低功耗,高分支预测准确率,高指令预取效率的特点。
指令译码单元(IDU)
指令译码单元(IDU)可以同时对三条指令进行译码并检测数据相关性。利用物理寄存器重命名技术解决指令间的数据相关性,并将指令乱序发送至下级流水线执行。指令译码单元支持指令的乱序调度分发,并通过投机性的发射缓解因数据相关性造成的性能损失。
执行单元
执行单元包含整型单元(IU)、浮点单元(FPU)以及矢量执行单元(VU)。
整型单元包含算术逻辑单元(ALU)、乘法单元(MULT)、除法单元(DIV)和跳转单元(BJU)。ALU 执行64 位整数操作。MULT 支持16 * 16、32 * 32、64 * 64 整数乘法。除法器的设计采用了基 16 的 SRT 算法 4,执行周期视操作数而变化。BJU 可以在单周期内完成分支预测错误处理。
浮点单元包含浮点算术逻辑单元(FALU)、浮点融合乘累加单元(FMAU)和浮点除法开方单元(FDSU),支持半精度、单精度和双精度运算。浮点算术逻辑单元(FALU)负责加减、比较、转换、寄存器传输、符号注入、分类等操作。浮点融合乘累加单元(FMAU) 负责普通乘法、融合乘累加等操作。浮点除法开方单元(FDSU)负责浮点除法、浮点开方等操作。
矢量执行单元在浮点单元的基础上扩展而成。浮点单元在支持原有标量浮点计算的基础上,扩展成为矢量浮点单元。矢量浮点单元包括矢量浮点算数逻辑单元(VFALU)、矢量浮点乘累加单元(VFMAU)和矢量浮点除法开方单元(VFDSU),支持不同位宽的矢量浮点运算。
另外,新增了矢量整型单元。矢量整型单元包含矢量加法单元(VALU)、矢量移位单元(VSHIFT)、矢量乘法单元(VMUL)、矢量除法单元(VDIVU)、矢量置换单元(VPERM)、矢量缩减单元(VREDU)以及矢量逻辑操作单元(VMISC)。
存储载入单元(LSU)
存储载入单元(LSU)支持标量存储/加载指令的双发射、矢量存储/加载指令的单发射以及所有存储/加载指令的全乱序执行,支持高速缓存非阻塞访问。支持字节、半字、字、双字和四字的存储/载入指令,并支持字节和半字的载入指令的符号位和零扩展。存储/加载指令可以流水执行,使得数据吞吐量达到一个周期存取一个数据。支持 8 路数据流硬件预取技术,将数据提前放入 L1 数据高缓中。当数据高缓缺失后,支持总线的并行访问。
指令退休单元(RTU)
指令退休单元(RTU)包括一个重排序缓冲器与一个物理寄存器堆。其中,重排序缓冲器负责指令的乱序回收与按序退休,物理寄存器堆负责结果的乱序回收和传递。通过支持指令并行回收与快速退休提高指令退休效率。指令退休单元每个时钟周期并行退休三条指令,支持精确异常。
虚拟内存管理单元(MMU)
虚拟内存管理单元(MMU)遵从RISC-V SV39 标准,39 位虚拟地址转换为 40 位物理地址。C910 MMU 在 SV39定义的硬件回填标准基础上,扩展了软件回填方式和地址属性。
物理内存保护单元(PMP)
C910 物理内存保护单元(PMP)遵从RISC-V 标准,支持配置 8 或16 个表项,最小粒度为 4KB,不支持NA4模式 5。
PMP 物理内存保护单元负责对存储器系统(包括外围设备)的访问合法性进行检查,其主要是判定当前工作模式下 CPU 是否具备对内存地址的读/写/执行访问权限。
多核子系统
C910 多核子系统包含:数据一致性接口单元(CIU)、二级高速缓存,可配置的 AXI 4.0 从设备接口、主设备接口单元、平台级中断控制器(PLIC)、计时器和自定义多核单端口调试框架。
数据一致性接口单元
数据一致性接口单元(CIU),采用 MESI 2 的写无效协议维护各个 L1 数据高缓的一致性;CIU 单元通过一组处理器接口单元(PIU)连接各个C910 核心,完成请求的接收和转换,实现 CIU 与 C910 核心的完全解耦合,从而可灵活配置 C910 的核心数量;设置两路监听缓冲器,可并行处理多个监听请求,最大化利用监听带宽;采用高效的数据旁路机制,当监听请求命中被监听的 L1 数据高缓时,直接将数据旁路给请求发起核心;另外,CIU 单元支持 TLB 和 I-CACHE无效操作请求的广播,简化了TLB/I-Cache 与D-Cache 数据一致性的软件维护成本。
二级高速缓存
二级高速缓存,紧耦合于CIU 单元,实现和 L1 数据高缓的同步访问;采用分块的流水线架构,每条流水线拥有独立的控制逻辑和 RAM 资源,单周期可并行处理两个访问请求,最大访问带宽可达到 1024 比特。二级高速缓存采用和 C910 相同的工作频率,因此,TAG RAM 和 DATA RAM 的访问延时提供软件可配置;另外,设置了 16 个回填/牺牲缓冲器,可支持 16 条缓存行的回填或者 16 条牺牲缓存行的内存回写。
主设备接口
主设备接口单元,支持AXI4.0 协议,支持关键字优先的地址访问,可以在不同的系统时钟与CPU 时钟比例(1:1,1:2,1:3,1:4,1:5,1:6,1:7,1:8)下工作。
从设备接口
从设备接口单元(可配置),支持AXI4.0 协议,可用于外设对片上高速数据缓存的访问,硬件实现数据一致性,可以用来连接外部 DMA。
平台级中断控制器
平台级中断控制器(PLIC)支持最多1023 个外部中断源采样和分发,支持电平和脉冲中断,可以设置32 个级别的中断优先级。
计时器
多核系统中共用一个64 位系统计时器,各个核心拥有私有的计时器比较值寄存器,通过采集系统计时器的数值与软件设置的私有计时器比较值寄存器进行比较,产生计时器信号。
编程模型
寄存器与工作模式
C910 支持 RV 三种特权模式:机器模式、超级用户模式和用户模式。处理器复位后在机器模式下执行程序,三种运行模式对应不同的操作权限,区别主要体现在以下几个方面:
- 对寄存器的访问;
- 特权指令的使用;
- 对内存空间的访问。
- 用户模式权限最低。
普通用户程序只允许访问指定给普通用户模式的寄存器。避免了普通用户程序接触特权信息,而操作系统通过协调普通用户程序的行为来为普通用户程序提供管理和服务。
- 超级用户模式权限比用户模式高,但比机器模式低。
超级用户模式下运行的程序不可以使用机器模式的控制寄存器,并且受到PMP 的限制。使用基于页面的虚拟内存,这个功能构成了超级用户模式的核心。
- 机器模式拥有最高的权限。
在机器模式下运行的程序对内存、I/O 和一些对于启动和配置系统来说必要的底层功能有着完全的使用权。默认情况下(异常中断没有被降级处理),任何模式下发生的异常和中断都会切换到机器模式进行响应。
大多数指令在三种模式下都能执行,但是一些对系统产生重大影响的特权指令只能工作在超级用户模式或机器模式下执行,例如多核同步指令 SYNC。
通用寄存器
C910 拥有32 个64 位的通用寄存器,功能定义与 RISC-V 一致,如下表所示。
寄存器 | ABI名称 | 描述 |
---|---|---|
x0 | zero | 硬件绑0 |
x1 | ra | 返回地址 |
x2 | sp | 堆栈指针 |
x3 | gp | 全局指针 |
x4 | tp | 线程指针 |
x5 | t0 | 临时/备用链接寄存器 |
x6-7 | t1-2 | 临时寄存器 |
x8 | s0/fp | 保留寄存器/帧指针 |
x9 | s1 | 保留寄存器 |
x10-11 | a0-1 | 函数参数/返回值 |
x12-17 | tp | 函数参数 |
x18-27 | t0 | 保留寄存器 |
x28-31 | t0 | 临时寄存器 |
通用寄存器用于保存指令操作数、指令执行结果以及地址信息。
浮点寄存器
C910 浮点单元除支持标准RV64FD 指令集外,扩展支持了浮点半精度计算,拥有32 个独立的64 位浮点寄存器,可在普通用户模式、超级用户模式和机器模式下被访问。
寄存器 | ABI名称 | 描述 |
---|---|---|
f0-7 | ft0-7 | 浮点临时寄存器 |
f8-7 | fs0-1 | 浮点保留寄存器 |
f10-11 | fa0-1 | 浮点参数/返回值 |
f12-17 | fa2-7 | 浮点参数 |
f18-27 | fs2-11 | 浮点保留寄存器 |
f28-31 | ft8-11 | 浮点临时寄存器 |
矢量寄存器
当配置矢量执行单元时,C910 拥有 32 个独立的128 位矢量寄存器,可在普通用户模式、超级用户模式和机器模式
下被访问。矢量寄存器通过矢量传送指令实现与通用寄存器/浮点寄存器的数据交换。
✈
😶
😢
参考资料
超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 其实质是以空间换取时间。 ↩︎
MESI 协议是一个基于失效的缓存一致性协议,是支持写回(write-back)缓存的最常用协议。也称作伊利诺伊协议 (Illinois protocol,因为是在伊利诺伊大学厄巴纳-香槟分校被发明的[1])。与写穿(write through)缓存相比,回写缓冲能节约大量带宽。总是有“脏”(dirty)状态表示缓存中的数据与主存中不同。MESI协议要求在缓存不命中(miss)且数据块在另一个缓存时,允许缓存到缓存的数据复制。与MSI协议相比,MESI协议减少了主存的事务数量。这极大改善了性能。 ↩︎ ↩︎
MOESI 协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。同时操作相对于MESI多了几种(MESI操作有4种,本地读写、远程读写),MOESI操作有8种(数据拷贝读写、本地副本读写、本地副本读写无数据、从远程CPU获取副本读写)。 ↩︎
SRT算法是以三个发明者Sweeney、Robertson和Tocher名字首字母命名的。SRT算法通常被称为数字循环(Digit Recurrence)算法。 ↩︎
NA4(Naturally aligned four-byte region)模式指内存区间大小为 4 字节的匹配模式 ↩︎