0 实验要求
实验整体框架已给出,任务主要包括:
- 数据窗口的添加(可选,我添加了)
- 立即数生成错误修改(老师主动设置错误,修改见代码)
- 三端口寄存器模块的添加(这与此前的三端口略有不同,注意重点查看RegisterFile模块的实现)
1 源代码
`default_nettype none
// --------------------------------------------------------------------
// 单周期 RISC-V CPU 模块
// --------------------------------------------------------------------
module CPU
#(
parameter DATAWIDTH = 32,
parameter ADDRWIDTH = 32
)
(
input wire iCPU_Reset,
input wire iCPU_Clk,
// 指令存储器接口
output wire [ADDRWIDTH-1:0] oIM_Addr, //指令存储器地址
input wire [DATAWIDTH-1:0] iIM_Data, //指令存储器数据
// 数据存储器接口
input wire [DATAWIDTH-1:0] iReadData, //数据存储器读数据
output wire [DATAWIDTH-1:0] oWriteData, //数据存储器写数据
output wire [ADDRWIDTH-1:0] oAB, //数据存储器地址
output wire oWR, //数据存储器写使能
// 连接调试器的信号
output wire [ADDRWIDTH-1:0] oCurrent_PC,
output wire oFetch,
input wire iScanClk,
input wire iScanIn,
output wire oScanOut,
input wire [1:0] iScanCtrl
);
/** The input port is replaced with an internal signal **/
wire clk = iCPU_Clk;
wire reset = iCPU_Reset;
// Instruction parts
logic [31:0] pc, nextPC;
logic [31:0] instruction; // instruction code
assign nextPC = pc + 4; /*-TODO 目前仅支持PC+4,增加分支指令时需修改 -*/
// PC
DataReg #(32) pcreg(.iD(nextPC), .oQ(pc), .Clk(clk), .Reset(reset), .Load(1'b1));
assign oIM_Addr = pc; // 连接指令存储器的地址端口
assign instruction = iIM_Data;// 连接指令存储器的数据端口
// Instruction decode
logic [6:0] opcode;
logic [2:0] funct3;
logic [6:0] funct7;
logic