CPU 速通系列 4-2:MEM-WB 模块

代码

Path src/cpu/mem_wb.sv

 1`include "defines.svh"
 2
 3module mem_wb (
 4
 5    input logic clk,
 6    input logic rst,
 7
 8    //来自控制模块的信息
 9    input logic [5:0] stall,
10
11    //来自访存阶段的信息
12    input logic [`RegAddrBus] mem_wd,
13    input logic               mem_wreg,
14    input logic [    `RegBus] mem_wdata,
15    input logic [    `RegBus] mem_hi,
16    input logic [    `RegBus] mem_lo,
17    input logic               mem_whilo,
18
19    //送到回写阶段的信息
20    output logic [`RegAddrBus] wb_wd,
21    output logic               wb_wreg,
22    output logic [    `RegBus] wb_wdata,
23    output logic [    `RegBus] wb_hi,
24    output logic [    `RegBus] wb_lo,
25    output logic               wb_whilo
26
27);
28
29
30    always_ff @(posedge clk) begin
31        if (rst == `RstEnable) begin
32            wb_wd    <= `NOPRegAddr;
33            wb_wreg  <= `WriteDisable;
34            wb_wdata <= `ZeroWord;
35            wb_hi    <= `ZeroWord;
36            wb_lo    <= `ZeroWord;
37            wb_whilo <= `WriteDisable;
38        end else if (stall[4] == `Stop && stall[5] == `NoStop) begin
39            wb_wd    <= `NOPRegAddr;
40            wb_wreg  <= `WriteDisable;
41            wb_wdata <= `ZeroWord;
42            wb_hi    <= `ZeroWord;
43            wb_lo    <= `ZeroWord;
44            wb_whilo <= `WriteDisable;
45        end else if (stall[4] == `NoStop) begin
46            wb_wd    <= mem_wd;
47            wb_wreg  <= mem_wreg;
48            wb_wdata <= mem_wdata;
49            wb_hi    <= mem_hi;
50            wb_lo    <= mem_lo;
51            wb_whilo <= mem_whilo;
52        end  //if
53    end  //always
54
55
56endmodule

解读

实现了内存回写(Memory Write Back)模块。

设计意图

简要而言,该模块旨在根据来自控制模块和访存阶段的信息,将需要回写到寄存器的数据和控制信号传递给回写阶段。


具体而言,根据控制模块的stall信号,如果stall[4]Stopstall[5]NoStop,则表示需要停止回写,将回写相关的信号置为默认值。否则,将来自访存阶段的信息传递到回写阶段。

端口

  • clk:输入时钟信号

  • rst:复位信号

  • stall:来自控制模块的信息,用于控制回写是否停止

  • mem_wd:来自访存阶段的目标寄存器地址

  • mem_wreg:来自访存阶段的写使能信号

  • mem_wdata:来自访存阶段的写数据

  • mem_hi:来自访存阶段的高位数据

  • mem_lo:来自访存阶段的低位数据

  • mem_whilo:来自访存阶段的写使能信号

  • wb_wd:送到回写阶段的目标寄存器地址

  • wb_wreg:送到回写阶段的写使能信号

  • wb_wdata:送到回写阶段的写数据

  • wb_hi:送到回写阶段的高位数据

  • wb_lo:送到回写阶段的低位数据

  • wb_whilo:送到回写阶段的写使能信号

伪代码

如果复位信号被使能:
    将回写相关信号置为默认值
否则如果stall[4]为Stop且stall[5]为NoStop:
    将回写相关信号置为默认值
否则如果stall[4]为NoStop:
    将来自访存阶段的信息传递到回写阶段

实现思路

在时钟上升沿触发的always_ff块中,根据不同的情况对回写相关信号进行赋值。

  • 如果复位信号被使能,将回写相关信号置为默认值。

  • 如果stall[4]Stopstall[5]NoStop,表示需要停止回写,将回写相关的信号置为默认值。

  • 如果stall[4]NoStop,将来自访存阶段的信息传递到回写阶段,即将相应的输入信号赋值给输出信号。

参考资料

本文与 AI 合作完成。