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 合作完成。