RISC-V MCU中文社区

【分享】 浮点数的指令添加——最终写回仲裁

发表于 全国大学生集成电路创新创业大赛 2023-05-23 20:00:08
0
1706
1

团队编号:CICC1413
团队名称:“芯”之所向
在增加浮点数指令时,我们会遇到一些需要写回寄存器的指令,此时就需要对原先的写回功能模块做更改。

写回功能主要集中在这两个模块中

图片alt

e203_exu_longpwbck.v 长指令写回仲裁

e203_exu_wbck.v 最终写回仲裁

最终写回仲裁

该模块实现了E203处理器的写回逻辑。它接收来自ALU和长流水线指令的写回数据,并根据优先级选择要写回的数据。然后,它将所选的数据发送到寄存器文件,以便将其写入正确的寄存器。模块还包括用于握手协议的信号,以确保正确传输数据。

具体实现

  1. 首先,代码中定义了三个接口,分别是ALU指令的写回接口、长流水线指令的写回接口和最终写回到寄存器文件的接口。其中,ALU指令的写回接口和长流水线指令的写回接口都包括数据、寄存器编号和有效性等信号。

    1. // The ALU Write-Back Interface
    2. input alu_wbck_i_valid, // Handshake valid
    3. output alu_wbck_i_ready, // Handshake ready
    4. input [`E203_XLEN-1:0] alu_wbck_i_wdat,
    5. input [`E203_RFIDX_WIDTH-1:0] alu_wbck_i_rdidx,
    6. // If ALU have error, it will not generate the wback_valid to wback module
    7. // so we dont need the alu_wbck_i_err here
    8. //////////////////////////////////////////////////////////////
    9. // The Longp Write-Back Interface
    10. input longp_wbck_i_valid, // Handshake valid
    11. output longp_wbck_i_ready, // Handshake ready
    12. input [`E203_FLEN-1:0] longp_wbck_i_wdat,
    13. input [5-1:0] longp_wbck_i_flags,
    14. input [`E203_RFIDX_WIDTH-1:0] longp_wbck_i_rdidx,
    15. input longp_wbck_i_rdfpu,
    16. //////////////////////////////////////////////////////////////
    17. // The Final arbitrated Write-Back Interface to Regfile
    18. output rf_wbck_o_ena,
    19. output [`E203_XLEN-1:0] rf_wbck_o_wdat,
    20. output [`E203_RFIDX_WIDTH-1:0] rf_wbck_o_rdidx,
  2. 接下来,代码中定义了两个信号:wbck_ready4alu和wbck_ready4longp,分别表示ALU指令和长流水线指令是否可以进行写回。具体来说,wbck_ready4alu是一个非长流水线指令写回的信号,当它为1时表示ALU指令可以进行写回;wbck_ready4longp则始终为1,表示长流水线指令可以始终进行写回。通过与这两个信号进行与运算,就可以确定哪个指令有优先权进行写回。

    1. // The ALU instruction can write-back only when there is no any
    2. // long pipeline instruction writing-back
    3. // * Since ALU is the 1 cycle instructions, it have lowest
    4. // priority in arbitration
    5. wire wbck_ready4alu = (~longp_wbck_i_valid);
    6. wire wbck_sel_alu = alu_wbck_i_valid & wbck_ready4alu;
    7. // The Long-pipe instruction can always write-back since it have high priority
    8. wire wbck_ready4longp = 1'b1;
    9. wire wbck_sel_longp = longp_wbck_i_valid & wbck_ready4longp;
  3. 在确定了哪个指令有优先权进行写回后,代码中将相应的写回数据、寄存器编号和有效性等信号发送到最终写回到寄存器文件的接口。同时,它还处理错误和不可写回的情况。具体来说,如果指令存在错误或不可写回,它将被在执行单元级别杀死,而不会发送到该模块。如果存在错误或不可写回,则不会将写回数据发送到寄存器文件。

    1. assign wbck_i_valid = wbck_sel_alu ? alu_wbck_i_valid : longp_wbck_i_valid;
    2. `ifdef E203_FLEN_IS_32//{
    3. assign wbck_i_wdat = wbck_sel_alu ? alu_wbck_i_wdat : longp_wbck_i_wdat;
    4. `else//}{
    5. assign wbck_i_wdat = wbck_sel_alu ? {{`E203_FLEN-`E203_XLEN{1'b0}},alu_wbck_i_wdat} : longp_wbck_i_wdat;
    6. `endif//}
    7. assign wbck_i_flags = wbck_sel_alu ? 5'b0 : longp_wbck_i_flags;
    8. assign wbck_i_rdidx = wbck_sel_alu ? alu_wbck_i_rdidx : longp_wbck_i_rdidx;
    9. assign wbck_i_rdfpu = wbck_sel_alu ? 1'b0 : longp_wbck_i_rdfpu;
  4. 最后,代码中将写回数据发送到寄存器文件,并处理了错误和不可写回的情况,实现了E203处理器中的写回模块。

    1. assign rf_wbck_o_ena = wbck_o_ena & (~wbck_i_rdfpu);
    2. assign rf_wbck_o_wdat = wbck_i_wdat[`E203_XLEN-1:0];
    3. assign rf_wbck_o_rdidx = wbck_i_rdidx;

    修改方法

    在接口中加入以下代码:

    1. input longp_wbck_i_rdfpu,
    2. input longp_wbck_i_fpuop,

    仿照原本代码进行添加:

    1. wire wbck_i_rdfpu;
    2. assign wbck_i_rdfpu = wbck_sel_alu ? 1'b0 : longp_wbck_i_rdfpu;
    3. wire wbck_o_ena = rf_wbck_o_valid & rf_wbck_o_ready & (~wbck_i_rdfpu);

    这样便完成了对该模块的更改,使其具有处理浮点数指令的功能。

喜欢1
用户评论
studying_drh

studying_drh 实名认证

能拿个好名次将是收获的附带品

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