RISC-V MCU中文社区

【分享】 蜂鸟E203执行阶段的ALU单元中的muldiv模块以及b2b情况解析

发表于 开源蜂鸟E203 2023-05-10 15:21:55
0
1863
5

队伍编号:CICC1449

队伍名称:礼堂盯帧电子研究所

摘要:

本文对muldiv模块进行解析,以及解释一些细节问题,对于要进行乘除法器优化的队伍,本文能起到抛砖引玉的作用。

1.数据预处理

muldiv模块首先将infobus中输入的信息分别解析出来,这其中包括的信息有:当前操作是乘除操作的哪一种以及当前操作与上一操作是否存在back to back情况(back to back后续会讲)。
图片alt
随后,将该次计算中所需要用到的信号进行预处理,包括操作数符号位的确定,符号位扩展以及操作码的确定。
图片alt

2.muldiv模块所使用的状态机

muldiv模块使用的状态机所具有的状态如下图所示
图片alt
该五个状态分别为:第一周期状态,执行状态,余数检查状态,商纠正状态,余数纠正状态。
其中,乘法操作只会经历第一周期状态和执行状态,只有除法和取余相关操作才会经历后续状态。

3.乘法和除法所使用的算法

蜂鸟E203的乘法默认使用booth-4算法,对于32位数运算,只算运算过程需要16个周期,因此在状态机的exec状态会停留16周期。蜂鸟E203的除法默认使用不恢复余数法,不恢复余数法的基数只能是2,因此对于32位数运算,只算运算过程需要32个周期,状态机的exec状态会停留32个周期。并且不恢复余数法的部分商值的商集有{1,-1}。因此还需要对商和余数进行修正,所以状态机才会有余数检查状态,商纠正状态,余数纠正状态。
图片alt
由于对乘除法的优化基本不会对原算法进行优化,而是对原算法进行替换,在这里就对booth-4算法和不恢复余数法进行过多赘述,若想要了解可以参考以下网址:
Booth-4算法:
https://blog.csdn.net/weixin_42454243/article/details/123203676?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168369061416800226545160%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168369061416800226545160&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-123203676-null-null.142%5ev86%5einsert_down1,239%5ev2%5einsert_chatgpt&utm_term=booth-4%20%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187
不恢复余数法:
https://blog.csdn.net/zhouxuanyuye/article/details/108309277?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168369917016782427440014%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168369917016782427440014&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-108309277-null-null.142^v86^insert_down1,239^v2^insert_chatgpt&utm_term=%E4%B8%8D%E6%81%A2%E5%A4%8D%E4%BD%99%E6%95%B0%E6%B3%95&spm=1018.2226.3001.4187

4.与dpath模块复用

蜂鸟E203处理器主打的是低功耗和低面积,因此能够复用的资源都尽量进行了复用,这也是在第二点中乘除法复用同一个状态机和第三点中多个信号复用的原因之一。在乘法操作和除法操作中,都是将乘除法分解为多次加法迭代实现的,并且乘法和除法不会同时出现,因此它们可以复用同一个加法器,而该加法器就是在dpath中进行普通整数加减和地址加减所使用的加法器。
图片alt
上图为muldiv模块中的信号赋值语句
图片alt
上图为dpath模块中muldiv复用加法器的数据输入输出通道
此外,在muldiv进行exec的状态时,还需要用到buffer,用于寄存一拍数据,该buffer也是同样复用了dpath里面的buffer
图片alt
上图为muldiv模块中为传输到dpath的buffer的信号赋值的语句
图片alt
上图为dpath与muldiv的buffer数据通道

5.back2back解析

本小节着重讲一下back2back情况。所谓back2back,就是上一条指令的两个操作数与下一条指令的操作数完全一致,并且操作不同但当前指令的结果已经得到了的情况。比如,上一条指令是divu操作,操作数为32和5,则商为6,同时不恢复余数法还会顺带计算得到余数为2.因此,若下一条指令为remu,且操作数同样为32和5,则可以直接单周期返回余数2的结果。
而在muldiv源代码中451行注释所说的//Only the MUL will be treated as back2back
并不是指只有乘法会有back2back,而是指乘法部分只有mul指令可以发生back2back,而mulh,mulhsu,mulhu因为操作数肯定不同或者过程值不同,不能发生back2back情况。
图片alt
Back2back情况和specialcase情况(如除以0、乘以0、溢出等情况)都是能够单周期写回的情况,其他则是正常的情况,进行正常运算。

6.最后的一些问题

从537行后的数据都是用于纠错检查的,但是加上后续代码在vivado上综合会报错,在config中define FPGA_SOURCE,不使用后续来纠错检查,则不会出现该问题,目前还没搞明白,但纠错用的数据不影响整体运行。

最后,值得一提的是,乘除运算虽然都是长指令,但不能像load,store之类的长指令一样乱序写回,因为其运算过程中要一直占用dpath中的加法器,因此无法进行乱序。

喜欢5
用户评论
nicolynN

nicolynN 实名认证

懒的都不写签名

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