RISC-V MCU中文社区

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

发表于 开源蜂鸟E203 2023-05-15 21:19:20
0
678
1

队伍编号:CICC1413

浮点数指令添加——长指令写回仲裁

在增加浮点数指令时,我们会遇到一些需要写回寄存器的指令,此时就需要对原先的写回功能模块做更改。

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

图片alt

e203_exu_longpwbck.v 长指令写回仲裁

e203_exu_wbck.v 最终写回仲裁

长指令写回仲裁

该模块实现了长流水线指令的写回操作,包括 LSU 写回接口和最终仲裁的写回接口。其中,LSU 写回接口需要和 OITF(Out-of-Order Instruction Tracking FIFO)模块进行比较,只有当当前指令的 itag 和 OITF 中最顶部指令的 itag 相同时才进行写回操作。

在实现中,先通过逻辑运算得到写回操作是否可以进行,然后根据需要写回的寄存器和是否有错误信息,选择是否需要与提交模块进行握手,最后输出写回操作的结果。

同时,该模块还实现了对异常信息的处理,当指令有错误信息时,需要将错误信息传递给提交模块进行处理。

具体实现

首先,通过逻辑运算得到写回操作是否可以进行:

wire wbck_ready4lsu = (lsu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
wire wbck_sel_lsu = lsu_wbck_i_valid & wbck_ready4lsu;

其中,wbck_ready4lsu 表示当前指令是否可以进行写回,wbck_sel_lsu 表示是否有需要进行写回的指令。

然后,根据需要写回的寄存器和是否有错误信息,选择是否需要与提交模块进行握手:

assign {
         longp_excp_o_insterr
        ,longp_excp_o_ld   
        ,longp_excp_o_st  
        ,longp_excp_o_buserr
        ,longp_excp_o_badaddr } = 
             ({`E203_ADDR_SIZE+4{wbck_sel_lsu}} & 
              {
                1'b0,
                lsu_cmt_i_ld,
                lsu_cmt_i_st,
                lsu_cmt_i_buserr,
                lsu_cmt_i_badaddr
              }) 
              ;

这里使用了 Verilog 中的拼接操作符 {},将 wbck_sel_lsu 拼接成一个长度为 E203_ADDR_SIZE+4 的向量,然后和相应的信号进行逻辑与运算,得到需要传递给提交模块的异常信息。

接着,根据是否需要写回和是否有错误信息,选择是否需要与提交模块进行握手:

wire need_wbck = wbck_i_rdwen & (~wbck_i_err);
wire need_excp = wbck_i_err;

assign wbck_i_ready = 
       (need_wbck ? longp_wbck_o_ready : 1'b1)
     & (need_excp ? longp_excp_o_ready : 1'b1);

最后,根据需要写回和是否有错误信息,输出写回操作的结果:

assign longp_wbck_o_valid = need_wbck & wbck_i_valid & (need_excp ? longp_excp_o_ready : 1'b1);
assign longp_excp_o_valid = need_excp & wbck_i_valid & (need_wbck ? longp_wbck_o_ready : 1'b1);

assign longp_wbck_o_wdat  = wbck_i_wdat ;
assign longp_wbck_o_flags = wbck_i_flags ;
assign longp_wbck_o_rdfpu = wbck_i_rdfpu ;
assign longp_wbck_o_rdidx = wbck_i_rdidx;

assign longp_excp_o_pc    = wbck_i_pc;

assign oitf_ret_ena = wbck_i_valid & wbck_i_ready;

其中,need_wbck 表示是否需要进行写回操作,need_excp 表示是否需要将错误信息传递给提交模块。如果需要进行写回操作,则输出写回操作的结果,包括写回的数据、标志位、寄存器索引和是否为 FPU 寄存器等信息;如果需要将错误信息传递给提交模块,则输出错误信息和当前指令的 PC 值;最后,如果当前指令有效并且已经完成写回操作,则将 oitf_ret_ena 设为 1,表示可以将 OITF 中的指令弹出。

修改方法

在修改前,保证浮点数指令中长指令已经在iotf中实现

在输入输出段定义一下字段

  // The fpu Write-Back Interface
  input  fpu_wbck_i_valid, // Handshake valid
  output fpu_wbck_i_ready, // Handshake ready
  input  [`E203_FLEN-1:0] fpu_wbck_i_wdat,
  input  [`E203_ITAG_WIDTH -1:0] fpu_wbck_i_itag,

模仿代码做更改,例如:

  // The Long-pipe instruction can write-back only when it's itag 
  //   is same as the itag of toppest entry of OITF
  wire wbck_ready4lsu = (lsu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
  wire wbck_sel_lsu = lsu_wbck_i_valid & wbck_ready4lsu;

  wire wbck_ready4fpu = (fpu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
  wire wbck_sel_fpu = fpu_wbck_i_valid & wbck_ready4fpu;

其他地方修改类似,即可完成对长指令写回仲裁的更改。

喜欢1
用户评论
ved.

ved. 实名认证

懒的都不写签名

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