RISC-V MCU中文社区

【分享】 (三):蜂鸟E203扩展浮点指令设计(1)

发表于 全国大学生集成电路创新创业大赛 2023-05-14 17:43:43
0
1537
1

一、团队介绍

报名编号:CICC1327
团队名称:301小队

二、浮点指令介绍

单精度浮点指令一共30个:其中包括26个32位指令;4个16位的压缩指令。
如果按照分类来算一共有以下几种指令:

2.1浮点数读写指令

32位指令格式:

flw rd, offset[11:0] (rs1)
fsw rs2, offset[11:0] (rs1)

该组指令进行存储器读或者写操作,访问存储器的地址均由操作数寄存器 rs1中的值与
12 位的立即数(进行符号位扩展)相加所得。
• flw 指令从存储器中读回一个单精度浮点数,写回寄存器 rd 中。
• fsw 指令将操作数寄存器 rs2 中的单精度浮点数,写回存储器中。

浮点16位压缩指令只有数据读写指令,包括:

•c.flw 与32位的指令类似
•c.fsw 与32位的指令类似
•c.flwsp是一条 RV32FC 仅有指令,它将一个单精度浮点数值从存储器读入浮点寄存器
rd 中。其有效地址的计算是通过将零扩展的偏移量×4,然后加上栈指针 x2 形成的。
•c.fswsp是一条 RV32FC 仅有指令,它将浮点寄存器 rs2 中的单精度浮点数值保存到存
储器中。其有效地址的计算是通过将零扩展的偏移量×4,然后加上栈指针 x2 形成的。

以上的6条指令可以使用整数的读写访问接口实现,对于fsw类型指令,需要注意的是读取的rs2的值来自于浮点寄存器,因此需要根据不同的指令判断是读取整数寄存器还是浮点寄存器

2.2浮点数运算指令

指令格式:

该组指令进行加、减、乘、除、求平方根操作。
fadd.s rd, rs1, rs2
fsub.s rd, rs1, rs2
fmul.s rd, rs1, rs2
fdiv.s rd, rs1, rs2
fsqrt.s rd, rs1

• fadd.s指令将操作数寄存器rs1和rs2中的单精度浮点数进行加法操作,结果写回寄存器rd中。
• fsub.s指令将操作数寄存器rs1和rs2中的单精度浮点数进行减法操作,结果写回寄存器rd中。
• fmul.s指令将操作数寄存器rs1和rs2中的单精度浮点数进行乘法操作,结果写回寄存器rd中
• fdiv.s指令将操作数寄存器rs1和rs2中的单精度浮点数进行除法操作,结果写回寄存器rd中。
• fsqrt.s指令将操作数寄存器rs1中的单精度浮点数进行求平方根操作,结果写回寄存rd中。

(1)由于浮点运算工作量较大,不可能一个周期完成。对于加、减、乘法操作可以采用流水线的方式进行。而加减操作可以采用一个模块实现,乘法采用一个模块实现。由于采用流水线运行,可以将这三种指令放入oitf中,对于乘法指令,采用单独的乘法器。
(2)对于除法和开放运算,可以采用迭代法,采用状态机进行运算。乘法器可以复用整数乘法器节约资源。

2.3浮点数比较指令

指令格式:

fmin.s rd, rs1, rs2
fmax.s rd, rs1, rs2

•fmin.s 令将操作数寄存器rs1和rs2中的单精度浮点数进行比较操作,将数值小的一方作为结果写回寄存器rd中。
•fmax.s 令将操作数寄存器rs1和rs2中的单精度浮点数进行比较操作,将数值大的一方作为结果写回寄存器rd中。

两个指令可以用一个模块实现,由于运算不算复杂,首先比较符号位,接着是阶码,最后是尾数,具有优先级,单周期即可输出结果

2.4乘加指令

指令格式

fmadd.s rd, rs1, rs2 , rs3
fmsub.s rd , rs1, rs2, rs3
fnmadd.s rd, rs1, rs2, rs3
fnmsub.s rd, rs1, rs2, rs3

• fmadd.s 指令将操数寄存器rsl、rs2、rs3中的单精度浮点数进行 rs1rs2+rs3 操作,将结果写回寄存器 rd中。
• fmsub.s 指令将操数寄存器rsl、rs2、rs3中的单精度浮点数进行 rs1
rs2-rs3 操作,将结果写回寄存器 rd中。
• fnmadd.s 指令将操数寄存器rsl、rs2、rs3中的单精度浮点数进行 -rs1rs2-rs3 操作,将结果写回寄存器 rd中。
• fnmsub.s 指令将操数寄存器rsl、rs2、rs3中的单精度浮点数进行 -rs1
rs2+rs3 操作,将结果写回寄存器 rd中。

此模块可以复用浮点加减和乘法模块,节省资源,也是流水线运行,可以写入oitf模块中,但要注意后资源冲突

2.5浮点数格式转换指令

指令格式

fcvt.w.s rd, rs1
fcvt.s.w rd, rs1
fcvt.uw.s rd, rs1
fcvt.s.uw rd, rs1

• fcvt.w.s 指令将通用浮点寄存器rs1中的单精度浮点数转换成有符号整数,将结果写回通用整数寄存器rd中。
• fcvt.s.w 指令将通用整数寄存器rs1中的有符号数转换成为单精度浮点数,将结写回通用浮点寄存器rd中。
• fcvt.uw.s指令将通用浮点寄存器rs1中的单精度浮点数转换成无符号整数,将结果写回通用整数寄存器rd中。
• fcvt.s.uw 指令将通用整数寄存器rs1中的无符号数转换成为单精度浮点数,将结写回通用浮点寄存器rd中。

此模块可以将有符号数和无符号统一起来,一共使用两个模块实现:整数转浮点,浮点转整数。需要注意写回的寄存器类型不一样。由于转换过程和舍入会导致时序瓶颈,可以根据情况采用2周期执行结果

喜欢1
用户评论
星河

星河 实名认证

懒的都不写签名

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