队伍介绍:
报名编号:CICC1829
团队名称: 你说的对对队
这是我们队伍的第6篇帖子
“F”即单精度浮点(single-precision floating-point),增加了32个位宽为32bit的浮点寄存器(f0~f31)和一个浮点控制状态寄存器fcsr(用来控制浮点的操作模式和异常状态的记录)。 浮点寄存器的宽度用FLEN术语来描述,对于单精度浮点扩展来讲FLEN=32。大多数的浮点指令都只依赖浮点寄存器来完成操作,除此外,浮点的load和store指令用于在储存器和浮点寄存器之间传输数据。同时也有一些指令用于整数寄存器和浮点寄存器之间的直接数据交互。
上图为浮点寄存器,浮点寄存器与通用整数寄存器基本一致,唯一的区别在于其f0寄存器不需要硬件接0.
具体实现如下:
always @(posedge CLK, posedge RES_CPU)
begin
for (i = 0; i < 32; i = i + 1)
begin
if (RES_CPU)begin
regFR[i] <= 32’h00000000;
end
else
begin
if (DBGABS_FPR_REQ & DBGABS_FPR_WRITE & (DBGABS_FPR_ADDR[4:0] == i))
regFR[i] <= DBGABS_FPR_WDATA;
else if (wbck_flw & ((WB_LOAD_DST & `ALU_MSK) == `ALU_FPR) & (WB_LOAD_DST[4:0] == i))
regFR[i] <= WB_FPU_LD_DATA; // Writing Conflict Priority FPU < WB 写回优先级WB>FPU
else if (pipe_i_fr_dst & (pipe_i_token[16:12] == i))
regFR[i] <= pipe_i_fr_dst_data;
else if (pipe_f_token[17] & (pipe_f_token[16:12] == i))
regFR[i] <= fdata_float_out_final; // 结果写回浮点寄存器
else if ((pipe_c_token[7:1] == 7'b1101000) & (pipe_c_token[16:12] == i))
regFR[i] <= fcvt_i2f_float_out;
end
end
end