最近用 Xilinx Vivado 2025 把蜂鸟 E203 的 RISC-V 核跑了一遍,顺带理清了从 Verilog RTL 到 FPGA 原型验证的完整流程。虽然参考了芯来科技的开源核,但自己从头搭一遍,踩的坑才是自己的。这篇文章就当过程记录,也给有同样想法的朋友提供一点参考。
需求很清楚:用 RISC-V 的 RV32I 指令集,实现一个五级流水线的 32 位处理器,至少支持算术、逻辑、访存和分支指令,目标频率 50MHz,要在 Artix-7 XC7A35T 上跑通。这块芯片的资源有限,LUT 不超过 5200,触发器 10400,BRAM 640KB,设计时必须精打细算。
数字系统设计流程从需求到架构的梳理大致如下:

五级流水线与模块划分
流水线分取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)五级,经典的数据通路与控制单元分离架构。

关键模块的功能和接口标准化后大致是这样:
| 模块名称 | 功能描述 | 接口标准化 |
|---|---|---|
pc_reg | 程序计数器,生成指令地址 | 输入:复位/时钟信号,输出:32 位 PC 值 |
instr_rom | 指令存储器,存储机器码 | 输入:PC 地址,输出:32 位指令 |
reg_file | 通用寄存器堆,32×32 位 | 输入:读地址/写数据/使能,输出:读数据 |
alu | 算术逻辑单元,支持加减/与或非/移位 | 输入:操作数 A/B、ALU 控制码,输出:结果/标志位 |
control_unit | 控制逻辑,生成流水线控制信号 | 输入:指令 opcode,输出:各阶段控制信号 |
imm_gen | 立即数生成器,解析不同指令格式 | 输入:32 位指令,输出:32 位立即数 |
data_ram | 数据存储器,支持字节/半字/字访问 | 输入:地址/数据/读写使能,输出:读数据 |
hazard_unit | 冒险处理单元,解决数据/控制冒险 | 输入:寄存器地址,输出:stall/flush 信号 |



