implementation-log

AI 样例

RISC-V 流水线 CPU:取指阶段实现记录

记录 PC 更新、指令存储器接口、基础仿真波形和第一轮实现约束。

RISC-V 五级流水线 CPU commit draft-if0
RISC-VVerilogIF StageRTL

本次目标

先实现一个最小取指阶段。它只负责三件事:

  1. 保存当前 pc
  2. 默认让 pc + 4 成为下一条指令地址。
  3. 向指令存储器输出取指地址。

这个阶段暂时不处理分支跳转,也不处理流水线暂停。先把最小闭环跑通,后续再加控制信号。

取指阶段波形草图

模块接口

第一版接口保持克制:

module if_stage (
  input  wire        clk,
  input  wire        rst,
  output reg  [31:0] pc,
  output wire [31:0] instr_addr
);

assign instr_addr = pc;

always @(posedge clk) begin
  if (rst) begin
    pc <= 32'h0000_0000;
  end else begin
    pc <= pc + 32'd4;
  end
end

endmodule

这个写法的好处是容易观察:每个时钟上升沿之后,pc 都应该递增 4。如果第一条指令从地址 0 开始,那么波形中可以直接看到 0x0 -> 0x4 -> 0x8

第一轮验证点

仿真时先不急着接完整 CPU,只检查取指阶段本身:

cycle 0: rst = 1, pc = 0x00000000
cycle 1: rst = 0, pc = 0x00000004
cycle 2: rst = 0, pc = 0x00000008
cycle 3: rst = 0, pc = 0x0000000c

如果这个序列不稳定,后面译码和执行阶段的错误会被放大,很难定位。

当前限制

这版实现还没有:

  • 分支跳转入口。
  • stall/flush 控制。
  • 取指地址对齐异常。
  • 指令存储器延迟建模。

这些限制是有意保留的。当前目标是让项目先有一个可以讨论和标注的最小技术记录页面。

参考资料

  1. RISC-V Technical Specifications

Notes & Discussion

文章标注与讨论

技术文章同样支持本地划线标注和页末讨论。当前记录只保存在本浏览器,后续可迁移到公开讨论服务。

我的标注

选中正文中的一句话,点击浮层里的“标注这段”。

讨论