本仓库目标:把 AGENTS.md 里的 Godson-2 风格 OoO 规范落成一套“能跑、能测、能逐步扩展”的 RTL + testbench。优先级是 可实现 + 可验证,复杂子系统(如 ICache/DTLB/CP0/TLB)允许先用 stub 简化,以便先把乱序机制跑通。
verilator(推荐 5.x)+ C++ 编译器(macOS 上通常是clang++)make- 可选:
gtkwave(看波形) - 可选:
iverilog(目前对 SystemVerilog 支持有限,可能编不过)
make clean
make sim # 默认:Verilatormake wave生成的波形文件默认是 godson2_tb.vcd。
- 4-wide 前端:每拍最多 4 条取指/译码/重命名/派发(受队列 backpressure 影响会停顿)。
- CAM 重命名表 + 128 物理寄存器:消除 WAR/WAW,建立 RAW。
- 分组保留站 / 发射队列:整数 IQ +(接口预留的)浮点 IQ。
- ROQ(Reorder Queue):乱序执行、有序提交(每拍最多提交 4 条)。
- BRQ(Branch Queue):跟踪分支并在猜错时触发 flush/redirect 骨架。
- 旁路/Forwarding:写回总线被 IQ snoop,用于更新源操作数就绪位。
说明:当前实现聚焦机制骨架;部分“规范级”功能仍在逐步补齐(见“已知限制”)。
- Fetch:取指(stub 的 imem 接口)
- Pre-decode:分支识别与预测(简化)
- Decode:译码为内部 uop
- Rename:CAM 重命名 + freelist 分配物理寄存器
- Dispatch:入 IQ + 入 ROQ(全组
dispatch_fire握手) - Issue:每个 FU oldest-first 选择 ready 指令
- RegRead:从物理寄存器堆读操作数(含 bypass)
- Execute:ALU 单周期;AGU 简化为带流水的访存单元
- Writeback:写回 PRF + 广播
- Commit:按 ROQ 顺序提交
├── include/
│ └── godson2_defines.sv - 公共定义与参数
├── rtl/
│ ├── cam_map_table.sv - CAM 重命名表 + freelist
│ ├── roq.sv - ROQ(提交/异常/分支 brbus)
│ ├── brq.sv - BRQ(分支跟踪/flush 掩码)
│ ├── issue_queue.sv - IQ(分组保留站,age=oldest-first)
│ ├── physical_regfile.sv - 物理寄存器堆(多读多写 + bypass)
│ ├── alu.sv - ALU(ADD/SUB/AND/OR/XOR/ADDI 等)
│ ├── agu.sv - AGU(load/store 地址与访存)
│ ├── fetch_decode.sv - 取指 + 译码
│ └── godson2_core.sv - 顶层 core
├── tb/
│ └── godson2_tb.sv - 简单 testbench
├── Makefile
└── README.md
| 参数 | 默认值 | 说明 |
|---|---|---|
XLEN |
64 | 数据位宽 |
FETCH_W |
4 | 前端宽度 |
COMMIT_W |
4 | 提交宽度 |
INT_PRF_SIZE |
128 | 整数物理寄存器数量 |
ROQ_SIZE |
64 | ROQ 深度 |
BRQ_SIZE |
16 | BRQ 深度 |
IQ_INT_SIZE |
32 | 整数 IQ 深度 |
IQ_FP_SIZE |
32 | 浮点 IQ 深度(目前未接入完整 FPU) |
本工程不以完整 ISA 为目标。当前 rtl/fetch_decode.sv 实际能译码的最小集合是:
- 算术/逻辑:
ADD, SUB, AND, OR, XOR, ADDI - 访存:
LW, LD, SW, SD - 分支:
BEQ, BNE, JAL - 其它:未识别的编码会变成
ILLEGAL(触发异常路径骨架)
译码编码当前参考 RISC-V 风格(32-bit 指令),用于方便写 testbench;“Godson-2 风格”指的是微结构与乱序机制,而不是要求 MIPS/Loongson 指令集完整实现。
tb/godson2_tb.sv目前是 烟雾测试:指令存储器默认返回0x00000013(常见的 NOP 编码),跑若干拍并打印提交现象,生成godson2_tb.vcd。- 提交 trace 接口已在顶层暴露(
trace_valid/trace_op/...),便于后续接入更严谨的参考模型对拍。
- 程序加载/测试覆盖不足:目前 testbench 只返回固定指令流,尚未提供可配置的程序 ROM/汇编测试。
- 访存与 store-commit 语义:尚未实现完整的 MemQ/LSQ;store “commit 后写内存”的语义需要后续补齐。
- trace 信息不完整:
trace_pc/trace_ldest等字段尚未从 ROQ/commit 路径完整贯通。 - 浮点执行单元:FPU 仍为 stub。
- 分支预测:为简化可测,目前预测逻辑非常保守/简化。
AGENTS.md:工程级 SPEC(实现与验证的主依据)