团队名称:到底叫啥队
团队编号:CICC1699
在上一篇中,我们简要了解了B扩展及其子集。在本篇中,我们将以具体一个指令(sh1add)为例,对实现B扩展指令的思路进行梳理。
一、指令格式
根据官方手册,sh1add将操作数2左移一位后与操作数1相加。
助记符:sh1add rd, rs1, rs2
编码:opcode为0x33即00110011,func3为0x2,而func7为0x10
具体运算:X(rd) = X(rs2) + (X(rs1) << 1)
接下来,我们根据在手册中获得的信息(如上),对添加B扩展的sh1add指令。
二、defines模块
首先,对sh1add的MSB、LSB进行定义,并定义sh1add的位宽
WIDTH=sh1add_LSB : sh1add_MSB
(注:本文中使用的代码等均为演示,并非实际实现中可直接使用的代码)
同时因为我们增加了sh1add指令,需要对ALU模块的位宽ALU_WIDTH进行修改
三、译码模块
译码模块参照其他指令格式进行编写添加。通过opcode、func3、func7对指令进行唯一确定。在sh1add中,当opcode为相应opcode(0x33)且func3为3'b010及func7为7'b0010000时,相关信号置1,表明此时的指令为sh1add。
wire rv32_sh1add = opcode & 32_func3_010 & 32_func7_0010000;
此处32代表位宽
同时,通过将alu_info_bus的相应位写为rv32_sh1add,实现该模块(decode)与其他模块的连接。因存在不需要寄存器2的指令(如针对立即数的指令),代码中设有是否需要rs2的判断信号,在sh1add中需要使用,将rv32_sh1add加入该信号的或条件中。
四、ALU模块
alu中主要涉及alu_rglr、alu_dpath和alu模块。
其中运算主要集中在alu_dpath中完成,其中包括取值、计算、输出等。alu_rglr接受传入的数据alu_i_rglr,处理后将数据输入alu内部。而alu模块为总模块,对rglr、dpath进行例化、调用。
根据手册内容,sh1add的具体运算实现为
sh1adder_res = sh1adder_in2 + (sh1adder_in1 << 1 );
五、总结
综上,我们简单叙述了B扩展实现的基本步骤。B扩展的实现较为简单,同时可以为其他扩展提供参考。