将陆续上传新书《自己动手写CPU》,今天是第41篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈。
开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30
9.3 修改OpenMIPS以实现加载存储指令
9.3.1 修改译码阶段
1、修改ID模块
参考图9-19可知,ID模块要增加接口inst_o,如表9-1所示。
在ID模块还要增加对加载存储指令的分析,根据图9-1、9-2、9-6、9-12给出的加载存储指令的格式可知,这些指令的指令码都是不同的,所以可以直接依据指令码确定是哪一种指令,确定指令的过程如图9-20所示。
其中涉及的宏定义如下,正是各个加载存储指令的指令码,在本书附带光盘Code\Chapter9_1目录下的defines.v文件可以找到这些定义。
`define EXE_LB 6'b100000
`define EXE_LBU 6'b100100
`define EXE_LH 6'b100001
`define EXE_LHU 6'b100101
`define EXE_LW 6'b100011
`define EXE_LWL 6'b100010
`define EXE_LWR 6'b100110
`define EXE_SB 6'b101000
`define EXE_SH 6'b101001
`define EXE_SW 6'b101011
`define EXE_SWL 6'b101010
`define EXE_SWR 6'b101110
修改译码阶段的ID模块如下。完整代码请参考本书附带光盘Code\Chapter9_1目录下的id.v文件。
module id(
......
output wire[`RegBus] inst_o, // 新增加的输出接口
......
);
......
assign inst_o = inst_i; // inst_o的值就是译码阶段的指令
always @ (*) begin
if (rst == `RstEnable) begin
......
en