CPU 速通系列 1-2:IF-ID 模块

代码

Path src/cpu/if_id.sv

 1`include "defines.svh"
 2
 3module if_id (
 4
 5    input logic clk,
 6    input logic rst,
 7
 8    //来自控制模块的信息
 9    input logic [5:0] stall,
10
11    input  logic [`InstAddrBus] if_pc,
12    input  logic [    `InstBus] if_inst,
13    output logic [`InstAddrBus] id_pc,
14    output logic [    `InstBus] id_inst
15
16);
17
18    always_ff @(posedge clk) begin
19        if (rst == `RstEnable) begin
20            id_pc   <= `ZeroWord;
21            id_inst <= `ZeroWord;
22        end else if (stall[1] == `Stop && stall[2] == `NoStop) begin
23            id_pc   <= `ZeroWord;
24            id_inst <= `ZeroWord;
25        end else if (stall[1] == `NoStop) begin
26            id_pc   <= if_pc;
27            id_inst <= if_inst;
28        end
29    end
30
31endmodule

解读

实现了IF/ID级的寄存器模块,用于存储指令存取阶段(IF)的输出,并将其传递给指令译码阶段(ID)。

设计意图

简要而言,该模块的设计目的是在时钟上升沿触发时,根据输入的控制信号和条件,将来自指令存取阶段的指令和程序计数器的值传递给指令译码阶段。


具体而言,该模块需要根据以下条件进行处理:

  • 如果复位信号被使能(rst为有效值),则将指令存取阶段(IF)的输出(指令和程序计数器)设置为零。

  • 如果控制模块的stall信号为Stop,则将指令存取阶段的输出设置为零。

  • 如果控制模块的stall信号为NoStop,则将指令存取阶段的输出设置为指令存取阶段的输入值。

端口

  • clk:输入时钟信号

  • rst:复位信号

  • stall:来自控制模块的信息

  • if_pc:指令存取阶段的程序计数器

  • if_inst:指令存取阶段的指令

  • id_pc:指令译码阶段的程序计数器

  • id_inst:指令译码阶段的指令

实现思路

在时钟的上升沿触发时,根据条件使用always_ff块对ID阶段的寄存器进行更新。首先检查是否使能了复位信号(rst),如果是,则将指令存取阶段的输出(id_pc和id_inst)设置为零。否则,检查stall信号的值。如果stall[1]等于Stop并且stall[2]等于NoStop,则也将指令存取阶段的输出设置为零。如果stall[1]等于NoStop,则将指令存取阶段的输入(if_pc和if_inst)传递给指令译码阶段的输出(id_pc和id_inst)。

参考资料

本文与 AI 合作完成。