写回级 WBU
提交准备
后端母模块会监听 EXU 的发送端口的信号,当某个端 口发出提交请求时,后端会根据该端口的指令的编号查询对应 WBU 的接收端口 是否准许接收。为了确保指令顺序提交,提交逻辑做了如下的设计:
- 对于任意编号的指令,只能发送到指定的一个提交端口上去,该端口的 编号等于指令的编号减去 TailPtr 的值,例如: 当前 TailPtr 为 3(下一条提交的 指令应该是 3 号指令),发送端口的指令的编号为 5,则该指令只能发送到 WBU 的 2 号接收端口(发送端口的编号从 0 开始计数)。若编号数小于 TailPtr,则需 要将编号先加上队列长度,例如:当前 TailPtr 为 31,发送端口的指令的编号为 2,队列总长度为 32,则该指令只能发送到 WBU 的 3 号接收端口(2+32-31=3)。
- 任意一条指令必须在其之前的指令全部提交或者可以与其一起提交时, 才可以提交。例如:当前 TailPtr 为 3,EXU 某提交端口的指令编号为 6,那么当 拍若 3、4、5 号指令均可以提交则该指令才可以提交,否则该指令须继续等待。
当后端发生指令提交时,TailPtr 将根据提交的指令总数增长,与 HeadPtr 类 似,当 TailPtr 增长超过队列总长度时,TailPtr 会归零重新开始递增。例如:当 前TailPtr为30(编号从0算起),队列总长度为32,当拍有4条指令提交,则 TailPtr 将重设为 2(30+4-32=2),即下一拍提交的指令的编号应该是 2(编号为 30,31,0,1 的四条指令在当拍成功提交)
此外,后端母模块还需要维护流水线重置请求。流水线重置在当前实现下仅 可能由两个模块发出:BRU(在不实现独立 BPU 时为 ALU)和 CSRU,在两者 都发出重置流水线的请求时,后端母模块会比较两者的指令先后顺序(使用 1 种 提及的逻辑),采用先发射的指令的跳转地址发送给前端并发出重置流水线的信 号,令后端各部件冲刷流水级。
后端母模块也会将 EXU 的提交信息和 WBU 的待写入数据作为前递数据接入ISU级。
指令提交
在进入 WBU 级后,指令会根据发射顺序,依次对物理寄存器进行写回。对于 P 扩展的指令,如果当前指令提交批次里有指令需要拉高 VXSAT 寄存器,则接入 CSRU 的 VXSAT 飞线控制信号将被拉高。
由于对寄存器的写入将在下一拍才生效,故为了 ISU 的指令可以尽快发射, 当前待写入寄存器的数据也会连接至前递端口,供 ISU 获取数据。同时 WBU 也会将写回的指令的编号等数据传回 ISU,当一条指令提交时,若它的编号与它要写入的寄存器对应的表项所记录的编号一致,则将该表项 的占用标记清零(与寄存器的数据一样,将在下一拍更新)。