module register(
input wire Clk,
//定向技术
input wire [4:0] Execute_reg,
input wire [4:0] Memory_reg,
input wire[31:0] Execute_data,
input wire[31:0] Memory_data,
input wire Execute_sucess,//判断各个阶段是否成功
input wire Memory_sucess,
input wire Write_sucess,
//定向技术
input wire [4:0] RegARdAddr,
input wire [4:0] RegBRdAddr,
input wire [4:0] RegWrAddr,
input wire[31:0] RegWrData,
input wire RegWrite,
output reg[31:0] RegARdData,
output reg[31:0] RegBRdData
);
reg[31:0] regFile[0:31]; //寄存器组
initial begin
$readmemh("register",regFile);
end
always @(posedge Clk) begin
if (RegWrite==1'b1) begin
regFile[RegWrAddr] <= RegWrData;
end
end
always @(*) begin //**********
//赋值顺序,第一部分是为了防止mov指令错误,后面是为了防止将数据写入$0
//因为我们将sw指令的目标寄存器设为$0
if ((RegARdAddr==Execute_reg && Execute_sucess==1'b1)&&(Execute_reg!=5'h0)) begin
RegARdData <= Execute_data;
end else begin
if ((RegARdAddr==Memory_reg && Memory_sucess==1'b1)&&(Memory_reg!=5'h0)) begin
RegARdData <= Memory_data;
end else begin
if ((RegARdAddr==RegWrAddr && Write_sucess==1'b1)&&(RegWrAddr!=5'h0)) begin
RegARdData <= RegWrData;
end else begin
RegARdData<=regFile[RegARdAddr];
end
end
end
if ((RegBRdAddr==Execute_reg && Execute_sucess==1'b1)&&(Execute_reg!=5'h0)) begin
RegBRdData <= Execute_data;
end else begin
if ((RegBRdAddr==Memory_reg && Memory_sucess==1'b1)&&(Memory_reg!=5'h0)) begin
RegBRdData <= Memory_data;
end else begin
if ((RegBRdAddr==RegWrAddr && Write_sucess==1'b1)&&(RegWrAddr!=5'h0)) begin
RegBRdData <= RegWrData;
end else begin
RegBRdData<=regFile[RegBRdAddr];
end
end
end
end
endmodule
cpu之register
最新推荐文章于 2024-07-08 14:25:59 发布