# yaxin_soc_2025 **Repository Path**: RV4Kids/yaxin_soc_2025 ## Basic Information - **Project Name**: yaxin_soc_2025 - **Description**: YAXIN_20251111 作业仓 - **Primary Language**: Verilog - **License**: CC-BY-SA-4.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-09-16 - **Last Updated**: 2025-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 我来为您详细梳理这个 RISC-V core 的运行原理,并提供相关文档。 ## 🎯 RISC-V Core 运行原理梳理 ### 📋 核心架构概述 这是一个基于 RISC-V ISA 的 5 级流水线处理器: - **IF** (Instruction Fetch) - 取指阶段 - **ID** (Instruction Decode) - 译码阶段 - **EX** (Execute) - 执行阶段 - **MEM** (Memory Access) - 访存阶段 - **WB** (Write Back) - 写回阶段 ### 🔄 流水线运行流程 #### 1. **取指阶段 (IF)** **主要模块:** - `pc_reg.v` (实例: `u_pc_reg`) - `cpu_ahb_if.v` (实例: `u_cpu_ahb_if`) - `if_id.v` (实例: `u_if_id`) **运行流程:** 1. **PC 更新** (`pc_reg.v`): - 复位时 PC = `StartAdd` (0x00000000) - 正常情况:PC = PC + 4 - 分支跳转时:PC = `ex_branch_addr_i` - 中断时:PC = `int_addr_i` 2. **指令读取** (`cpu_ahb_if.v`): - 通过 AHB 总线从指令存储器读取指令 - 状态机控制:IDLE → WAIT → CONTROL → ENDS - 输出:`rom_data` (指令数据) 3. **流水线寄存** (`if_id.v`): - 将 PC 和指令传递到译码阶段 #### 2. **译码阶段 (ID)** **主要模块:** - `id.v` (实例: `u_id`) - `regsfile.v` (实例: `u_regsfile`) - `id_ex.v` (实例: `u_id_ex`) **运行流程:** 1. **指令译码** (`id.v`): - 解析指令的 opcode、funct3、funct7 等字段 - 识别指令类型(R/I/S/B/U/J 等) - 生成控制信号:`aluop_o`, `alusel_o`, `wreg_o` 等 2. **寄存器读取** (`regsfile.v`): - 32 个通用寄存器 (x0-x31) - 2 个读端口,1 个写端口 - 支持数据前递 (bypassing) 解决数据冒险 3. **数据冒险处理**: - 检测 RAW 冒险 - 通过前递或流水线停顿解决 4. **流水线寄存** (`id_ex.v`): - 将译码结果传递到执行阶段 #### 3. **执行阶段 (EX)** **主要模块:** - `ex.v` (实例: `u_ex`) - `mul_div_32.v` (实例: `u_mul_div_32`) - `ex_mem.v` (实例: `u_ex_mem`) **运行流程:** 1. **算术逻辑运算** (`ex.v`): - ALU 操作:加减、逻辑、移位、比较等 - 分支判断和地址计算 - CSR 寄存器操作 2. **乘除法运算** (`mul_div_32.v`): - 多周期乘除法器 - 支持有符号/无符号运算 - 通过 `muldiv_start_o` 启动运算 3. **分支处理**: - 计算分支条件和目标地址 - 输出 `branch_flag_o` 和 `branch_addr_o` 4. **流水线寄存** (`ex_mem.v`): - 将执行结果传递到访存阶段 #### 4. **访存阶段 (MEM)** **主要模块:** - `mem.v` (实例: `u_mem`) - `cpu_ahb_mem.v` (实例: `u_cpu_ahb_mem`) - `mem_wb.v` (实例: `u_mem_wb`) **运行流程:** 1. **存储器访问** (`mem.v`): - 处理 load/store 指令 - 字节/半字/字访问 - 符号扩展和零扩展 2. **数据总线接口** (`cpu_ahb_mem.v`): - 通过 AHB 总线访问数据存储器 - 状态机控制数据传输 3. **流水线寄存** (`mem_wb.v`): - 将访存结果传递到写回阶段 #### 5. **写回阶段 (WB)** **主要模块:** - `regsfile.v` (写回端口) **运行流程:** - 将运算结果或加载数据写回寄存器文件 - 写使能:`wb_wreg_o` - 写地址:`wb_wreg_addr_o` - 写数据:`wb_wreg_data_o` ### 🎮 控制单元 **模块:** `ctrl.v` (实例: `u_ctrl`) **功能:** - 流水线冒险检测和控制 - 生成停顿信号 `stalled_o[4:0]` - 生成刷新信号 `flush_o[4:0]` - 处理分支和中断引起的流水线刷新 ### 🚨 中断和异常处理 **主要模块:** - `interrupt_ctrl.v` (实例: `u_interrupt_ctrl`) - `csr_reg.v` (实例: `u_csr_reg`) **支持的中断/异常:** - 同步异常:ecall, ebreak - 异步中断:定时器中断、外部中断 - CSR 操作:CSRRW, CSRRS, CSRRC 等 ### 🏗️ 顶层集成 **模块:** `yaxin_riscv.v` **总线接口:** - **M0**:数据存储器访问 - **M1**:指令存储器访问 ## 📊 核心原理图 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 取指阶段 │ │ 译码阶段 │ │ 执行阶段 │ │ │ │ │ │ │ │ pc_reg │───▶│ if_id │───▶│ id_ex │ │ cpu_ahb_if │ │ id │ │ ex │ │ │ │ regsfile(读) │ │ mul_div_32 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 访存阶段 │ │ 写回阶段 │ │ 控制单元 │ │ │ │ │ │ │ │ ex_mem │───▶│ mem_wb │───▶│ ctrl │ │ mem │ │ regsfile(写) │ │ │ │ cpu_ahb_mem │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 中断控制 │ │ CSR寄存器 │ │ 流水线控制信号 │ │ │ │ │ │ │ │ interrupt_ctrl │◄──▶│ csr_reg │ │ stall/flush │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ## 📋 工程说明文档 ### 🎯 项目简介 **yaxin_riscv** 是一个基于 RISC-V ISA 的 32 位开源处理器核,采用经典的 5 级流水线架构,支持 RV32IM 指令集。 ### ✨ 特性列表 - ✅ RISC-V RV32IM 指令集支持 - ✅ 5 级流水线架构 - ✅ AHB 总线接口 - ✅ 中断和异常处理 - ✅ CSR 寄存器 - ✅ 硬件乘除法器 - ✅ 分支预测(静态) - ✅ 数据前递技术 ### 🔧 集成指南 #### 1. 文件结构 ``` RTL/core/ ├── yaxin_riscv.v # 顶层模块 ├── pc_reg.v # 程序计数器 ├── cpu_ahb_if.v # 指令总线接口 ├── cpu_ahb_mem.v # 数据总线接口 ├── if_id.v # IF/ID 流水线寄存器 ├── id.v # 译码阶段 ├── regsfile.v # 寄存器文件 ├── id_ex.v # ID/EX 流水线寄存器 ├── ex.v # 执行阶段 ├── mul_div_32.v # 乘除法器 ├── ex_mem.v # EX/MEM 流水线寄存器 ├── mem.v # 访存阶段 ├── mem_wb.v # MEM/WB 流水线寄存器 ├── ctrl.v # 流水线控制 ├── interrupt_ctrl.v # 中断控制器 ├── csr_reg.v # CSR 寄存器 ├── yaxin_defs.v # 全局定义 └── muldiv/ # 乘除法模块 ├── absolute_value.v ├── long_slow_div_denom_reg.v └── mul_div_32.v ``` #### 2. 接口说明 **顶层接口 (`yaxin_riscv.v`):** ```verilog module yaxin_riscv( input wire clk, // 时钟 input wire rst_n, // 异步复位(低有效) input wire [`INT_BUS] int_flag_i, // 中断标志 // AHB 主接口 0 (数据存储器) output wire M0_HBUSREQ, input wire M0_HGRANT, output wire [31:0] M0_HADDR, // ... 其他 AHB 信号 // AHB 主接口 1 (指令存储器) output wire M1_HBUSREQ, input wire M1_HGRANT, output wire [31:0] M1_HADDR, // ... 其他 AHB 信号 // AHB 共享信号 input wire [31:0] M_HRDATA, input wire [ 1:0] M_HRESP, input wire M_HREADY ); ``` #### 3. 集成步骤 1. **实例化核心**: ```verilog yaxin_riscv u_yaxin_core ( .clk (sys_clk), .rst_n (sys_rst_n), .int_flag_i (interrupts), // 连接到 AHB 互联 .M0_HBUSREQ (m0_hbusreq), .M0_HGRANT (m0_hgrant), .M0_HADDR (m0_haddr), // ... 其他连接 .M1_HBUSREQ (m1_hbusreq), .M1_HGRANT (m1_hgrant), .M1_HADDR (m1_haddr), // ... 其他连接 .M_HRDATA (hrdata), .M_HRESP (hresp), .M_HREADY (hready) ); ``` 2. **存储器映射**: - 指令存储器:`0x00000000 - 0x00017FFF` - 数据存储器:通过 AHB 总线访问 3. **中断连接**: ```verilog assign interrupts = { timer_interrupt, // 位 7 ext_interrupts // 位 6:0 }; ``` #### 4. 配置选项 在 `yaxin_defs.v` 中修改: - `StartAdd`:程序起始地址 - `INSTADD_END`:指令地址范围 - 中断向量地址 - CSR 寄存器配置 ### 🚀 使用示例 #### 简单的 SOC 集成: ```verilog module simple_soc ( input clk, input rst_n, input [7:0] ext_interrupts ); // AHB 互联 wire [31:0] haddr; wire [31:0] hrdata; wire [31:0] hwdata; wire hwrite; wire [2:0] hsize; wire [1:0] htrans; wire hready; // 实例化 RISC-V 核心 yaxin_riscv u_core ( .clk(clk), .rst_n(rst_n), .int_flag_i(ext_interrupts), // ... AHB 连接 ); // 实例化存储器 ahb_sram u_instruction_mem ( // ... 连接 ); ahb_sram u_data_mem ( // ... 连接 ); // 外设 ahb_timer u_timer ( // ... 连接 ); endmodule ``` ### 🔍 调试和验证 #### 关键信号监测: - `pc_o`:程序计数器值 - `inst_o`:当前指令 - `wb_wreg_data_o`:写回数据 - `ex_branch_flag_o`:分支标志 #### 性能指标: - 典型工作频率:100+ MHz(取决于工艺) - CPI:≈1.2(考虑流水线停顿) - 面积:~20K gates(估算) ### 📝 注意事项 1. **复位序列**:确保复位期间保持足够时钟周期 2. **中断处理**:正确配置 CSR 寄存器使能中断 3. **存储器对齐**:确保存储器接口支持所需的访问大小 4. **时序约束**:为关键路径添加适当的时序约束 ### 🛠️ 开发工具 - **仿真**:iverilog, Verilator, VCS - **综合**:Yosys, Design Compiler - **实现**:Vivado, Quartus 这个核心设计简洁而完整,非常适合作为学习 RISC-V 架构和 SOC 设计的起点,也可以作为更大系统的基础处理器核。