SoC集成 — CPU+UART+RAM

CPU+UART+RAM系统集成

📖 片上系统集成

单个CPU核心不能独立工作——它需要内存、外设、总线、时钟复位。SoC(System-on-Chip)集成将这些组件连接在一起,形成一个完整的计算系统。本课实现一个最小的SoC:RV32I核心 + 4KB RAM + UART发送器。

最小RISC-V SoC结构: ┌─────────────────────────────────────────┐ │ SoC Top │ │ │ │ ┌──────────┐ Bus ┌──────────┐ │ │ │ RV32I │◄─────►│ 4KB RAM │ │ │ │ CPU Core │ │ (0x0000) │ │ │ │ │ └──────────┘ │ │ │ PC=0x0 │ │ │ │ Reg[32] │ Bus ┌──────────┐ │ │ │ ALU │◄─────►│ UART │──TX──► │ │ │ Decode │ │ (0x1000) │ │ │ └──────────┘ └──────────┘ │ │ │ │ │ clk/rst_n │ └─────────────────────────────────────────┘ 地址映射: 0x0000 - 0x0FFF: RAM (4KB) 0x1000 - 0x1FFF: UART寄存器 启动流程: 1. reset → PC=0x0000 (从RAM开始执行) 2. 执行RAM中的程序 3. 通过ECALL触发UART发送
组件功能接口
CPU Core取指/译码/执行指令/数据总线
RAM存储指令和数据读写端口
UART TX串口发送数据+忙标志
Bus地址解码和路由主从接口

UART串口协议

UART是最简单的串行通信协议:1位起始位(0) + 8位数据 + 1位停止位(1),共10位。115200波特率下,每位持续约8.68μs。

真实SoC使用TileLink或AXI总线替代简单的地址解码。TileLink是RISC-V生态的首选总线协议,Rocket Chip和BOOM都使用TileLink。

🖥️ Verilog实现

// Lesson 29: Simple SoC — CPU + UART + RAM
module simple_soc #(parameter XLEN=32)(input wire clk, rst_n, output reg uart_tx, uart_busy);
    reg [7:0] mem [0:4095]; reg [XLEN-1:0] pc; reg [31:0] reg_file [0:31]; reg [31:0] instr;
    reg [7:0] tx_data; reg [3:0] tx_count; reg [15:0] tx_baud; reg tx_active;
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin pc<=0; uart_tx<=1; uart_busy<=0; tx_active<=0; tx_count<=0; tx_baud<=0; end
        else begin instr={mem[pc+3],mem[pc+2],mem[pc+1],mem[pc]}; pc<=pc+4;
            case(instr[6:0]) 7'b0010011:reg_file[instr[11:7]]<=reg_file[instr[19:15]]+{{20{instr[31]}},instr[31:20]};
                7'b0110011:reg_file[instr[11:7]]<=reg_file[instr[19:15]]+reg_file[instr[24:20]];
                7'b1110011:if(!tx_active) begin tx_data<=reg_file[10][7:0]; tx_active<=1; tx_count<=0;
                    tx_baud<=0; uart_busy<=1; uart_tx<=0; end default:; endcase
            if(tx_active) begin tx_baud<=tx_baud+1;
                if(tx_baud==434) begin tx_baud<=0;
                    if(tx_count<8) begin uart_tx<=tx_data[tx_count]; tx_count<=tx_count+1; end
                    else if(tx_count==8) begin uart_tx<=1; tx_count<=tx_count+1; end
                    else begin tx_active<=0; uart_busy<=0; end end end end end
endmodule
Verilator仿真验证通过 — SoC执行ADDI指令,PC正确推进

代码解析

📊 真实RISC-V SoC对比

SoCCPU外设总线用途
SiFive E310E31 (RV32I)UART,SPI,PWMTileLinkMCU
PULPissimoRI5CY (RV32IMC)UART,I2S,DMAAPB/AXIIoT
OpenTitanIbex (RV32IMC)UART,SPI,HMACTileLink安全
本课SoC简化RV32IUART直接映射教学

真实SoC的关键区别:总线协议(TileLink/AXI)、中断控制器(PLIC)、定时器(CLINT)、调试接口(JTAG/Debug Module)。本课省略了这些以聚焦核心概念。

🧪 实验练习

  1. 在当前实现基础上添加异常处理支持
  2. 实现流水线仿真,观察波形中的关键信号变化
  3. 添加性能计数器:统计吞吐量、延迟、利用率
  4. 前几课的模块集成,构建更完整的系统
CPU+UART+RAM系统集成 — 从核心到系统的跨越
思考题:为什么真实SoC使用TileLink而不是直接地址映射?总线协议解决了什么问题?
参考资料:SiFive E310 Manual | TileLink Spec | PULP Platform | OpenTitan

📚 深入理解与实践建议

掌握本课内容需要结合理论学习和动手实践:

  1. 阅读源码:BOOM(Chisel)和Rocket(Chisel)是RISC-V处理器设计的最佳参考实现
  2. 修改实验:修改本课的Verilog代码,观察行为变化
  3. 波形仿真:使用GTKWave查看关键信号的时序关系
  4. 对比分析:将本课模块与前几课模块集成,测试端到端功能

开发环境

工具用途安装
Verilator 5.020Verilog编译仿真sudo apt install verilator
iverilog轻量仿真sudo apt install iverilog
GTKWave波形查看sudo apt install gtkwave
RISC-V GCC交叉编译apt install gcc-riscv64-unknown-elf
QEMU系统仿真apt install qemu-system-misc

📖 推荐阅读

在线资源

🔧 开发工具链与实践环境

本课程推荐以下开发工具链:

工具用途安装命令
VerilatorVerilog编译/仿真sudo apt install verilator
iverilog轻量Verilog仿真sudo apt install iverilog
GTKWave波形查看sudo apt install gtkwave
RISC-V GCC交叉编译apt install gcc-riscv64-unknown-elf
QEMU系统仿真apt install qemu-system-misc
SpikeISA模拟器从源码编译

快速验证

# 编译本课Verilog代码
cd verilog/
iverilog -o tb_test *.v
vvp tb_test

# Verilator lint检查
verilator --lint-only -Wno-BLKLOOPINIT *.v

# 应无Error输出

🎯 课程知识体系

RISC-V高级设计课程 (30课): 基础(L01-06): 特权架构→CSR→异常→中断→PLIC→CLINT 内存(L07-12): SV39 MMU→TLB→Cache系列 算术(L13-14): 乘法器→除法器 乱序(L15-19): OoO核心→ROB→寄存器重命名→记分牌→Tomasulo 预测(L20-21): 2位预测→BTB 扩展(L22-26): RVC→RVM→RVA→RVF→RVD 系统(L27-30): PMP→解码器→SoC→启动流程 每一课都是下一课的基础: 没有特权架构 → 无法理解CSR 没有CSR → 无法实现异常处理 没有异常处理 → 无法实现中断 没有中断 → 无法实现PLIC/CLINT 没有虚拟内存 → 无法运行Linux 没有Cache → 性能灾难 没有乱序执行 → ILP受限 没有分支预测 → 流水线气泡严重

🔬 实验扩展:进阶挑战

完成基础实验后,尝试以下进阶挑战:

  1. 性能优化:使用流水线技术减少关键路径延迟
  2. 面积优化:资源共享、操作数合并、时钟门控
  3. 功耗优化:添加时钟门控、操作数隔离
  4. 形式验证:使用Yosys formal验证功能正确性
  5. FPGA综合:在Xilinx/Intel FPGA上实现并测量时序

调试技巧

🎯 课程知识体系

RISC-V高级设计课程 (30课): 基础(L01-06): 特权架构→CSR→异常→中断→PLIC→CLINT 内存(L07-12): SV39 MMU→TLB→直接映射Cache→组相联→写回→分离Cache 算术(L13-14): Booth乘法器→恢复余数除法器 乱序(L15-19): OoO核心→ROB→寄存器重命名→记分牌→Tomasulo 预测(L20-21): 2位饱和计数器→BTB分支目标缓冲 扩展(L22-26): RVC压缩→RVM乘除→RVA原子→RVF单精度→RVD双精度 系统(L27-30): PMP保护→全解码器→SoC集成→启动流程

本课是第29课,在整体课程中承上启下。每一课都构建在前一课的基础上,建议按顺序学习。

📚 推荐阅读

在线资源