CPU 速通系列 3-3:EX-MEM 模块
代码
Path src/cpu/ex_mem.sv
1`include "defines.svh"
2
3module ex_mem (
4
5 input logic clk,
6 input logic rst,
7
8 //来自控制模块的信息
9 input logic [5:0] stall,
10
11 //来自执行阶段的信息
12 input logic [`RegAddrBus] ex_wd,
13 input logic ex_wreg,
14 input logic [ `RegBus] ex_wdata,
15 input logic [ `RegBus] ex_hi,
16 input logic [ `RegBus] ex_lo,
17 input logic ex_whilo,
18
19 input logic [`DoubleRegBus] hilo_i,
20 input logic [ 1:0] cnt_i,
21
22 //送到访存阶段的信息
23 output logic [`RegAddrBus] mem_wd,
24 output logic mem_wreg,
25 output logic [ `RegBus] mem_wdata,
26 output logic [ `RegBus] mem_hi,
27 output logic [ `RegBus] mem_lo,
28 output logic mem_whilo,
29
30 output logic [`DoubleRegBus] hilo_o,
31 output logic [ 1:0] cnt_o
32
33);
34
35 always_ff @(posedge clk) begin
36 if (rst == `RstEnable) begin
37 mem_wd <= `NOPRegAddr;
38 mem_wreg <= `WriteDisable;
39 mem_wdata <= `ZeroWord;
40 mem_hi <= `ZeroWord;
41 mem_lo <= `ZeroWord;
42 mem_whilo <= `WriteDisable;
43 hilo_o <= {`ZeroWord, `ZeroWord};
44 cnt_o <= 2'b00;
45 end else if (stall[3] == `Stop && stall[4] == `NoStop) begin
46 mem_wd <= `NOPRegAddr;
47 mem_wreg <= `WriteDisable;
48 mem_wdata <= `ZeroWord;
49 mem_hi <= `ZeroWord;
50 mem_lo <= `ZeroWord;
51 mem_whilo <= `WriteDisable;
52 hilo_o <= hilo_i;
53 cnt_o <= cnt_i;
54 end else if (stall[3] == `NoStop) begin
55 mem_wd <= ex_wd;
56 mem_wreg <= ex_wreg;
57 mem_wdata <= ex_wdata;
58 mem_hi <= ex_hi;
59 mem_lo <= ex_lo;
60 mem_whilo <= ex_whilo;
61 hilo_o <= {`ZeroWord, `ZeroWord};
62 cnt_o <= 2'b00;
63 end else begin
64 hilo_o <= hilo_i;
65 cnt_o <= cnt_i;
66 end //if
67 end //always
68
69
70endmodule
解读
实现了执行-访存阶段(EX-MEM)的数据传递和控制信号传递。
设计意图
简要而言,该模块的设计目的是在时钟上升沿触发时,根据不同的控制信号和状态,将来自执行阶段的信息传递到访存阶段,并控制访存阶段的相关信号。
具体而言,该模块需要根据以下条件执行相应的操作:
-
当复位信号(rst)为使能状态时,将访存阶段的输出信号设置为初始值。
-
当控制模块传来的停顿信号(stall)满足特定条件时,将访存阶段的输出信号设置为特定值,并将来自执行阶段的相关信息传递到访存阶段。
-
当停顿信号不满足停顿条件时,将来自执行阶段的信息传递到访存阶段,并将访存阶段的输出信号设置为默认值。
-
在其他情况下,保持访存阶段的输出信号不变。
端口
-
clk
:输入时钟信号 -
rst
:复位信号 -
stall
:来自控制模块的停顿信号 -
ex_wd
:来自执行阶段的写入目标寄存器地址 -
ex_wreg
:来自执行阶段的写使能信号 -
ex_wdata
:来自执行阶段的写入数据 -
ex_hi
:来自执行阶段的高位寄存器数据 -
ex_lo
:来自执行阶段的低位寄存器数据 -
ex_whilo
:来自执行阶段的高位/低位寄存器写使能信号 -
hilo_i
:来自执行阶段的HI/LO寄存器数据 -
cnt_i
:来自执行阶段的计数器数据 -
mem_wd
:输出给访存阶段的写入目标寄存器地址 -
mem_wreg
:输出给访存阶段的写使能信号 -
mem_wdata
:输出给访存阶段的写入数据 -
mem_hi
:输出给访存阶段的高位寄存器数据 -
mem_lo
:输出给访存阶段的低位寄存器数据 -
mem_whilo
:输出给访存阶段的高位/低位寄存器写使能信号 -
hilo_o
:输出给执行阶段的HI/LO寄存器数据 -
cnt_o
:输出给执行阶段的计数器数据
伪代码
总结代码功能和逻辑的伪代码表示。
实现思路
该模块使用时钟上升
沿触发的always_ff块来处理数据和控制信号的传递逻辑。根据复位信号(rst)和停顿信号(stall)的不同状态,选择性地将来自执行阶段的信息传递到访存阶段,并设置访存阶段的输出信号。具体实现如下:
-
在复位使能状态下,将访存阶段的输出信号设置为初始值。
-
当停顿信号满足特定条件时,将访存阶段的输出信号设置为特定值,并将来自执行阶段的相关信息传递到访存阶段。
-
当停顿信号不满足停顿条件时,将来自执行阶段的信息传递到访存阶段,并将访存阶段的输出信号设置为默认值。
-
在其他情况下,保持访存阶段的输出信号不变。
参考资料
本文与 AI 合作完成。