将陆续上传本人写的新书《自己动手写CPU》,今天是第35篇,我尽量每周四篇
开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20
转移指令的实现过程比较长,分两次介绍,今天是第一次
8.4 修改OpenMIPS以实现转移指令
8.4.1 修改取指阶段的PC模块
参考图8-6可知,PC模块需要增加接口,增加的接口如表8-1所示。
修改取指阶段的PC模块如下,主要修改一点:如果branch_flag_i为Branch,那么设置新的PC值为branch_target_address_i。完整代码位于本书附带光盘Code\Chapter8目录下的pc_reg.v文件。
module pc_reg(
input wire clk,
input wire rst,
// 来自控制模块的信息
input wire[5:0] stall,
// 来自译码阶段ID模块的信息
input wire branch_flag_i,
input wire[`RegBus] branch_target_address_i,
output reg[`InstAddrBus] pc ,
output reg ce
);
......
always @ (posedge clk) begin
if (ce == `ChipDisable) begin
pc <= 32'h00000000;
end else if(stall[0] == `NoStop) begin
if(branch_flag_i == `Branch) begin
pc <= branch_target_address_i;
end else begin
pc <= pc + 4'h4;
end
end
end
endmodule
其中Branch是defines.v中给出的宏定义:
`define Branch 1'b1 // 转移
`define NotBranch 1'b0 // 不转移
8.4.2 修改译码阶段
1、修改ID模块
参考图8-6可知,ID模块需要增加一些接口,增加的接口描述如表8-2所示。
在ID模块要增加对转移指令的分析,根据图8-3、8-4给出的转移指令格式可得,确定转移指令的过程如图8-7所示。
其中涉及的宏定义如下,在本书附带光盘Code\Chapter8目录下的defines.v文件中可以找到这些定义。
`define EXE_J 6'b000010
`define EXE_JAL 6'b000011
`define EXE_JALR 6'b001001
`define EXE_JR 6'b001000
`define EXE_BEQ 6'b000100
`define EXE_BGEZ 5'b00001
`define EXE_BGEZAL 5'b10001
`define EXE_BGTZ 6'b000111
`define EXE_BLEZ 6'b000110
`define EXE_BLTZ 5'b00000
`define EXE_BLTZAL 5'b10000
`define EXE_BNE 6'b000101
此外,还新增如下宏定义,在实现转移指令时会使用到:
`