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