将陆续上传本人写的新书《自己动手写CPU》,今天是第30篇,我尽量每周四篇
亚马逊的销售地址如下,欢迎大家围观呵!
http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4
China-pub的销售地址如下:
http://product.china-pub.com/3804025
北发的销售地址如下:
http://book.beifabook.com/Product/BookDetail.aspx?Plucode=712123950&extra=0_s25960657
7.8 修改OpenMIPS以实现乘累加、乘累减指令
7.8.1 修改译码阶段的ID模块
译码阶段的ID模块要添加对乘累加、乘累减指令的分析,根据图7-11给出的指令格式可知,这4条指令都是SPECIAL2类指令,可以依据功能码确定是哪一种指令,确定指令的过程如图7-13所示。
其中涉及的宏定义如下,正是图7-13中各个指令的功能码。在本书附带光盘Code\Chapter7_2目录下的defines.v文件中可以找到这些定义。
`define EXE_MADD 6'b000000
`define EXE_MADDU 6'b000001
`define EXE_MSUB 6'b000100
`define EXE_MSUBU 6'b000101
译码阶段的ID模块主要修改内容如下。完整代码请参考本书光盘Code\Chapter7_2目录下的id.v文件。
module id(
......
);
......
assign stallreq = `NoStop;
always @ (*) begin
if (rst == `RstEnable) begin
......
end else begin
aluop_o <= `EXE_NOP_OP;
alusel_o <= `EXE_RES_NOP;
wd_o <= inst_i[15:11]; // 默认目的寄存器地址wd_o
wreg_o <= `WriteDisable;
instvalid <= `InstInvalid;
reg1_read_o <= 1'b0;
reg2_read_o <= 1'b0;
reg1_addr_o <= inst_i[25:21]; // 默认的reg1_addr_o
reg2_addr_o <= inst_i[20:16]; // 默认的reg2_addr_o
imm <= `ZeroWord;
case (op)
......
`EXE_SPECIAL2_INST: begin // SPECIAL2类指令
case ( op3 )
......
`EXE_MADD: begin // madd指令
wreg_o <= `WriteDisable;
aluop_o <= `EXE_MADD_OP;
alusel_o <= `EXE_RES_MUL;
reg1_read_o <= 1'b1;