|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 zhwei199 于 2025-9-30 20:58 编辑
Piccolo 是使用Bluespec 进行描述,相对verilog更简洁,参考:【新提醒】HCL语言 bluespec资料: Bluespec systemverilog,介绍的PPT资料 - 数字IC设计讨论(IC前端|FPGA|ASIC) - EETOP 创芯网论坛 (原名:电子顶级开发网) -
==========================================================================================
分割线::部分图片无法正常显示,参考附件PDF即可
==========================================================================================
RISCV:: Bluespec Piccolo MCU 结构解析Table of Contents
1. CPU 往事计算从几千年前就融入人类的生活,可以说有了计算才有了商业。但是自动并快速高效的计算仍然是人类追求的目标。
- 1642 年世纪法国数学家布莱士·帕斯卡于1642年发明通过齿轮转动实现的加法机。
- 1946 年美国的莫奇利与爱克特发明了第一代电子计算机—ENIAC,其通过真空管实现,电力消耗和体积都十分庞大。
- 1958 年基尔比发明了地球上第一颗集成电路,其工作频率约 1.2Mhz。从而开启了集成电路和 CPU 的波澜壮阔的征程。
- 1960s–2020s, 在 CPU 领域群豪并起 :
- Intel 从 8086 出发到现在的 Nova Lake 大小核众核架构。
- AMD 也不遑多让,提出了 X64 架构,在经历过低谷后,带着 Zen 架构卷土重来,通过 chiplet、3D 堆叠的 Vcache 技术等夺得桌面处理器的王冠。
- 昔日王者 IBM Power 处理器,SUN 公司的 SPARC 处理器,DEC 的 Alpha 处理器,MIPS 处理器等都在各自的领域创造过辉煌,但是后来都慢慢消失或者市场份额越来越小。其中 Alpha 处理器中使用的技术大大的影响了后续的处理器设计。
- 移动领域处理器王者 ARM,也是 RISC 指令集的代表,在低功耗领域大杀四方,尤其是其独创的授权模式将 ARM 生态推向极致。
- 开源指令集 RISC-V the next king? 私以为 RISC-V 要崛起首先要解决生态问题,尤其是当前各种软件的适配。另一个领域则是定制化,得益于其开源指令集,在定制化领域的天然优势,但是又会造成生态碎片。所以,拭目以待吧。
CPU(中央处理器) 在 21 世纪既普通,又神秘。普通是因为这个小小的硅基物件已经完完全全融入大家的生活,无处不在。从普通生活中的的洗衣机、冰箱、手机,到昂贵超级计算机。但是神秘的是在其底层实现方式、微架构又十分神秘。
2. 为什么写个系列的总结- 本文是一篇学习的总结,希望能窥得神秘的 CPU 微架构的冰山一角。本文不涉及 CPU 之上的 SOC 部分的详细总结,也不涉及 CPU 具体的 ISA 介绍。本总结以 RISCV Piccolo 为例, 因为 Poccolo 足够简单,但是又有 CPU 设计的基本结构,是了解微架构这座大冰山很好的起点。
- 为什么选择 Piccolo: 因为 BSV 语言逻辑更加明确(注:目前已经开源,但是工业界使用仍然较少 , chisel 也是现在 HDL 的一个尝试,但是 code 代码虽然简洁,但是不太容易理解,需要有 scala 基础),较 Verilog 更加简洁,更容易理解。
3. 第一回: 初窥门径 , Piccolo 的手脚为什么说 Piccolo 有手脚呢,因为 CPU 要发挥预期的功能,总是要和现实世界交互的。按照经典的冯·诺依曼架构,CPU 由输入、输出、存储、控制器和计算器组成,输入、输出就是现实世界交互的通道。 下面就看看 Piccolo 的 SOC 结构,看看 Piccolo 的 SOC 示例:
3.1. Piccolo 的 RTL 结构层次- RTL BSV code 参考路径:https://github.com/bluespec/Piccolo
- 文件功能说明:
- `src_Core/`, for the CPU core, with sub-directories:
- `ISA/`: generic types/constants/functions for the RISC-V ISA (not CPU-implementation-specific)
- `RegFiles/`: generic register files for the GPRs (General-Purpose Registers) and CSRs (Control and Status Registers)
- `Core/`: the CPU Core
- `Near_Mem_VM/`: for the MMU and first-level cache. In the CPU, this is instantiated twice to provide completely separate channels (MMU and Cache) for instructions and data.
- `BSV_Additional_Libs/`: generic utilities (not CPU-specific)
- `Debug_Module/`: RISC-V Debug Module to debug the CPU from GDB or other debuggers
- `src_Testbench/`, for the surrounding testbench, with sub-directories:
- `Top/`: The system top-level (`Top_HW_Side.bsv`), a memory model that loads from a memory hex file, and some imported C functions for polled reads from the console tty (not currently available for Icarus Verilog).
- `SoC/`: An interconnect, a boot ROM, a memory controller, a timer and software-interrupt device, and a UART for console tty I/O.
- `Fabrics/`: Generic AXI4 code for the SoC fabric.
3.2. Piccolo 的 SOC 微架构file:///D:/_images_20250830---RTL-RISCV-BSV_Piccolo.org/20250906225609.png
- 从 SOC 微架构看,CPU 作为 SOC 的控制核心,通过 AXI4 Fabric 与外部 MEM 和系统 IO 进行交互。
- 同时也注意,架构中没有大家常见的电脑中的 GPU、显示器、USB ,甚至 DDR 存储器等,因为这一类都是需要大量的数据搬移,而图上的 SOC 只是一个示例,更多的是显示作为控制核心。而如果需要大量的数据搬移在现在处理器中一般通过专门的数据搬运模块 DMA 进行。
3.2.1. Piccolo 更详细的模块功能说明file:///D:/_images_20250830---RTL-RISCV-BSV_Piccolo.org/20250906230706.png
- Fabric: 基于 AXI4 协议的 crossbar 结构,通过 SOC_MAP 为各个 slave 分配地址,并完成数据传输,并且支持错误地址检测。
- 注意:在现代大型 SOC 中,一般不会直接使用 AXI crossbar 结构进行数据交换,而是通过 NOC 完成多个 master、slave 之间的互联。
- AXI4_Deburster: 完成对 AXI burst 的解析,并将 AXI burst 转换为单 beats 的读 / 写,方便后级 MEM、ROM 的数据读写。
- 其他模块大家可以自行查看,对 Core CPU 功能无明确影响。
3.2.2. 总结:- Piccolo 的 SOC 使用示例十分简单,通过 AXI4 协议完成各个模块的互联 , 架起了 CPU 使用的整个通路,排除了其他功能模块的干扰。SOC 系统本身是一个解决方案,选用什么 CPU,什么外部硬化功能,都是根据需求而定的。本总结重点不是 SOC 系统,所以也不再赘述,以免误导。
4. 第二回:渐入佳境, Core 层功能模块file:///D:/_images_20250830---RTL-RISCV-BSV_Piccolo.org/20250914095827.png
5. 第三回:略有小成 :: 外功 , CPU Wrapper 模块 : 芯片控制中心 ,
5.1. CPU Core 内整体结构file:///D:/_images_20250830---RTL-RISCV-BSV_Piccolo.org/20250914103023.png
- 如上图,Piccolo 整体实现结构较为简单,
- 控制部分主要由 Stage1 完成,完成指令取值、译码 和指令数据 prepare;
- 指令状态判断,决定什么时候可以将指令送到后一级用于指令执行;
1. [Q] Poccolo 通过检测后级指令执行的状态,用于顺序发射指令,是否会造成 性能损失?PipeLine 气泡能否消除? + [A] 指令依赖检测,以及乱序执行;
- 其他控制部分则主要在 CPU 顶层完成,只要是 CPU 中断状态处理等;
5.2. 关键交互接口- imem/dmem 通过 Fabric 读写外部 MEM 的 master 接口;
- dmem 作为 slave,被外部 master 通过 Fabric 读写的接口;
- 中断接口:
- mip(machine mode interrupt) 外部中断 req, 设置 mstatus mip 位;
- sip(SuperVisor Interrupt, 内核中断) 外部中断 req, 设置 mstatus sip 位 ;
- timer 中断;
1. 为什么需要 timer 中断 ? + 一般程序的是多线程程序,进入 timer 中断后,内核进行线程调度; + 其他? - 软件中断:一般用于核见通信;
- nmi(Non Maskable Interrupt) 中断:一般用于异常处理;
- GDB debug 接口:
- GDB stop 程序执行接口;
- 其他 debug 状态回读接口;
5.3. CPU 顶层状态控制
5.3.1. 流水执行
- 指令 PIPE 状态 rule: rl_pipe 正常功能
- 条件: a) 当所有 stage 不都为空闲,b) 当所有 stage 不存在异常,c) stage1 未被halt 时,则处于质量流水 pipe 状态。
1. question: stage1 halt 的条件是? ---> 中断 /Debug 断点。1. Debug 断点如何设置? --> 通过 CSR 寄存器进行设置,用于单步执行。 - 对执行指令进行计数,并更新 csr_minstret;
- 检查当前是否有 debug 中断。
5.3.2. 中断处理
5.3.3. 特殊指令处理
5.3.4. debug_mode 中断处理
- 进入 debug mode:rl_trap_BREAK_to_Debug_Mode
- 当前 CSR 寄存去中的 dcsr(Debug Control and Status Register) 寄存器中,根据当前 priv_mode,是否有 debug Break Enable 状态使能。如果有,则进入 debug mode.
- 状态保存:
- 记录当前状态到 dcsr 寄存器中,用于后续 Break 恢复。
- 记录当前指令的下一条指令到 dpc 寄存器中,用于恢复。
- fence 指令 req: 等待 Break 之前的指令全部执行完成,发起 fence 操作,等到包括 load/store 指令执行完成。
- 进入 CPU_GDB_PAUSING 状态。
- debug_mode::rl_stage1_stop 状态,进入 debug/ 单步调试
- 记录 break 时的 PC 和 instr;
- 状态保存:
- 将 Stop debug 原因写入到 dscr 寄存器中以及当前指令的 next_pc 写入 csr.dpc 寄存器中;
- 清除 CPU stop/ 和单独调试 rg_step_count 状态。
- fence 指令 req: 等待 Break 之前的指令全部执行完成,发起 fence 操作,等到包括 load/store 指令执行完成。
- 进入 CPU_GDB_PAUSING 状态 ;
- debug_mode::CPU_GDB_PAUSING 状态
- 获取 fence.i 结果,
- 回复 halt_rsps,
- 进入 CPU_DEBUG_MODE
- debug_mode::CPU_DEBUG_MODE 状态
- GDB 控制台发起 REQ,并控制 CPU 恢复程序执行状态;
- 从 CSR.dpc 获取 debug.dpc 地址,并从 dpc 开始取值,并设置 State1\2\3 的状态;
- resp GDB 控制台的 REQ,CPU 已经恢复程序执行;
- 注意 : rl_debug_run_redundant : 如果此时 CPU 经恢复程序执行,则忽略 GDB 回复程序执行 REQ;
- debug_mode::GDB 发起 halt 操作
- rl_debug_halt: 当 CPU 正在执行指令时, GDB 发起 halt 程序 debug 操作,记录 stop_req,
- 如果此时没有其他中断,则进入 rl_stage1_stop;
- rl_debug_halt_redundant: 当 CPU 已经处于 debug_pause/debug_mode 状态时,则忽略 GDB halt 操作 req。
5.4. 总结:- Piccolo 的 CPU 核心 Wrapper 的基本功能和交互接口如上描述,从功能结构上看,CPU Wrapper 的功能基本都是与 CSR 交互相关的功能,通过 CSR 模块与外部进行同步交互。
- 中断的实现通过 CSR 和 CPU 核的配合,通过 CSR 寄存器中的 mstatus、mvect 等 CSR 控制寄存器找到中断程序入口,并进行中断处理。
- 从接口上看,中断分为了三大类:a) 外部中断,一般从 PLIC 输入,b) software intr, 一般用于核间通信,c) timer intr, d) nmi(non-maskable-intr) 中断;
Q: timer intr 的作用一般是什么?A: 提示 : 操作系统多线程之前切换,每个线程执行的时间有 OS 进行设置, 当达到设置时间后,通知 CPU 和 OS 进行线程切换,从而实现分时复用。Q: nmi 的作用呢?A: 提示:如果 CPU hang 住了,或者程序跑飞了如何处理?
6. 第四回:略有小成 :: 内功 (1) , CPU 计算模块 : 芯片计算中心
6.1. CPU_Stage1::file:///D:/_images_20250830---RTL-RISCV-BSV_Piccolo.org/20250930161048.png
- CPU Stage 包含取指令、译码、部分单周期指令的执行功能;
- 从指令 MEM 中取值,并完成指令译码;
- 根据指令中的 rs1/rs2 判断指令中的源数据是否已经准备好,如果未准备好(busy), 则等待。
- 核心功能:fv_ALU: 指令执行,根据不同的 op_code 完成指令的执行。
- CATION:: 指令执行之前会判断指令类型,通过 mstatus 判断是否支持 FP 浮点类型指令。
- CATION:: 指令执行过程中,如果指令编码为非法指令时,认为是异常指令,则进入异常中断处理状态。
- 状态控制
- OSTATUS_BUSY: 执行等待
- IMEM 指令取值 stall 时,
- 等待 rs1/rs2/rs3 数据时
Tips:: 因为 Piccolo 按照顺序执行指令的方式实现, 此时可能会阻塞后续数据已经准备好的指令。
- OSTATUS_NONPIPE: 中断执行
- 当取值异常时,
- 当遇到 SYSTEM 指令时,eg. FENCE 指令
- 当遇到非法指令时,此时进入异常中断执行
- 输入 / 输出接口:
- Action enq: 用于 CPU 状态以及异常处理中,对 imem 恢复 PC/ 重定向 PC 进行取值。
Q: imem 重定向时,有一个参数是 satp, 这个参数的作用是?ANS: 可以参考 TLB 实现,(操作系统中的地址管理方式 page table), OS 会为每一个进程分配一个虚拟地址,每个线程通过 SATP 地址作为入口, 进行 page table walk , 查询虚拟地址对应的物理地址。从而完成地址空间访问;More: 为什么需要虚拟地址管理?TIPS: 系统安全、虚拟化、更方便的每个进程进行地址空间管理、…… - set_full: 用于控制 CPU_STAGE1 的状态 , 非 full 时为 OSTATUS_EMPTY。
6.2. CPU_Stage2::- CPU Stage2 包含浮点运算、乘除法、Load/Store 等多周期执行的复杂指令。这个 stage 里面几乎不涉及复杂的控制,(直接参考 CPU_Stage2.bsv)即可。
- 注意原子指令:AMO 原子指令在 Piccolo 实现中,大部分操作在 D-Cache 中实现。
6.3. CPU_Stage3::- 写回Stage: 将数据写回到 GRP/FPG regfile 中。
7. 第 END 回: 返璞归真 (Just Start)- CPU 作为人们目前能设计和广泛使用的“电子产业心脏”,其复杂度、广度都极难在短时间内学习并掌握。Piccolo 的学习(如上其实也是把基本数据流记录了一下,更多细节仍然需要学习和将多个知识点串联起来),
- 实际上,按照武侠小说中的武学划分, 目前应该刚扎完马步,学上了太祖长拳。
- 对于其后的学习每个细分领域就像少林寺的七 十二绝技,需要稳打稳扎的下笨功夫去学习、实践。
- CPU 作为现代计算机信息产业的基石,实现和应用场景上已经是多种多样,几乎只要有电的地方就会有 CPU 的存在,但是如何衡量 CPU 的性能或者说是是否适合对应的场景可能是一个无穷无尽的话题。
- 标准的工具有 benchmark,但是 benchmark 也未必适合所有 CPU 的 应用场景作为衡量基准。比如,a) 极端低功耗场景对性能要求不高,但是对功耗要求严苛。b) 实时处理场景对 CPU 绝对处理性能要求不高,但是要求有可预测的处理延时,等等
- 尽管应用场景丰富,衡量标准无非基于应用场景的需求对 PPA 进行衡量。
Created: 2025-09-30 周二 18:00
|
|