RISC-V MCU中文社区

【分享】 RVB 位操作扩展实现(二)

发表于 全国大学生集成电路创新创业大赛 2023-05-31 08:32:34
0
623
1

团队名称:到底叫啥队

团队编号:CICC1699


在上一篇中,我们简要了解了B扩展及其子集。在本篇中,我们将以具体一个指令(sh1add)为例,对实现B扩展指令的思路进行梳理。

一、指令格式

根据官方手册,sh1add将操作数2左移一位后与操作数1相加。

助记符:sh1add rdrs1rs2

编码: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扩展的实现较为简单,同时可以为其他扩展提供参考。

喜欢1
用户评论
鸹

实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板