跳转至

WbDataPath

  • 版本:V2R2
  • 状态:OK
  • 日期:2025/01/20
  • commit:xxx

术语说明

术语说明
缩写 全称 描述
v0 vector mask register 向量掩码寄存器
vl Vector length register 向量长度寄存器
ROB Reorder Buffer 重排序缓存

子模块列表

子模块列表
子模块 描述
VldMergeUnit 向量加载数据合并单元
RealWBCollideChecker 写回仲裁器

功能

wbDataPath 模块包含向量加载合并单元(VldMergeUnit)、写回仲裁器(RealWBCollideChecker),主要功能是接收来自各个执行单元的输出信号,对具有向量加载功能的执行单元输出信号进行合并处理,最终输出处理后的信号。

数据处理

wbDataPath 接收来自不同执行单元(整数执行单元、浮点执行单元、向量执行单元、访存单元)的输出信号,将这些信号做为输入信号fromExuPre使用。从输入信号fromExuPre中过滤出向量加载操作VLoad相关的信号,并将这些元素组成一个新的元素序列。

根据元素序列的索引例化多个向量加载合并单元模块,并将重定向信号、向量加载操作相关的信号、来自vstart寄存器的值赋值给向量加载合并单元模块处理。

注:由于XiangShan会刷新流水线,当vstart不为0且执行向量访存指令时,CSR中的vstart值将做为该向量指令的第一个元素。当发生异常时,写回数据的vstart是新的值,所以这个vstart不能用作向量访存操作的起始值。

从输入信号fromExuPre中过滤出和向量加载合并单元模块拥有相同参数的索引。 根据索引使用向量加载合并单元模块处理的结果更新输入信号fromExuPre中旧的向量加载操作的数据,得到处理后的来自执行单元的数据fromExu。

仲裁器

由于我们为向量的v0,vl寄存器设置了寄存器堆,因此也要对v0,vl进行写仲裁。

如果输入信号的valid有效,并且整数寄存器堆写使能有效,则整数写仲裁器的输入有效;如果输入信号的valid有效,并且浮点寄存器堆写使能有效,则浮点写仲裁器的输入有效;如果输入信号的valid有效,并且向量寄存器堆写使能有效,则向量写仲裁器的输入有效;如果输入信号的valid有效,并且v0寄存器堆写使能有效,则v0写仲裁器的输入有效;如果输入信号的valid有效,并且vl寄存器堆写使能有效,则vl写仲裁器的输入有效。

如果是向量执行单元写回整数寄存器堆,则整数写仲裁器的输入延迟一拍。只有不确定延迟的执行单元才需要仲裁器的结果,结果数据可以保留直到仲裁器成功。对于具有确定延迟的执行单元,如果请求在仲裁器中失败,则结果数据将永久丢失。未写回物理寄存器堆的端口始终是就绪的,设置最高优先级的端口始终是就绪的。

输出

如果整数写仲裁器的输入有效,并且整数写仲裁器就绪,数据通过整数写仲裁器后输出。如果浮点写仲裁器的输入有效,并且浮点写仲裁器就绪,数据通过浮点写仲裁器后输出。如果向量写仲裁器的输入有效,并且向量写仲裁器就绪,数据通过向量写仲裁器后输出。如果v0写仲裁器的输入有效,并且v0写仲裁器就绪,数据通过v0写仲裁器后输出。如果vl写仲裁器的输入有效,并且vl写仲裁器就绪,数据通过vl写仲裁器后输出。

输出数据发送到DataPath,在下一拍写入寄存器堆;输出数据发送到派遣模块,设置物理寄存器堆的状态为就绪,用于指令派遣;输出数据发送到调度器中用于写回唤醒。

写回ROB

只有输出成功握手的功能单元,其输出数据能写回ROB,在CtrlBlock中打一拍,并判断写回数据是否刷新流水线、触发异常、trigger fire、重播,之后发送给ROB,用于ROB写回。

整体框图

WbDataPath整体框图

接口列表

见接口文档

二级模块 VldMergeUnit

功能

VldMergeUnit 模块主要用于处理向量加载操作的合并逻辑,它接收来自执行单元的写回数据,通过VldMgu 模块进行合并处理,最终输出合并后的写回数据。该模块使用寄存器wbReg存储中间数据,并根据vlWen信号选择是否直接使用写回数据或使用合并后的数据。

对于vl被first-only-fault指令修改的uop,写回的数据能被直接使用。

整体框图

向量加载功能单元合并模块

二级模块 RealWBCollideChecker

功能

RealWBCollideChecker 模块主要功能是对写回操作的写口进行冲突检查和仲裁,通过将输入端口分组,为每个输出端口实例化一个仲裁器,并将输入和输出端口与仲裁器连接起来,实现写端口的仲裁。

输入输出映射

首先对输入的元素按照端口(port)进行分组,然后对每个分组内的元素按照优先级(priority)进行排序,最终返回分组排序后的映射inGroup。

仲裁器实例化

每个仲裁器负责处理一个输出端口的仲裁,如果映射中包含当前输出端口号x,则实例化一个RealWBArbiter 模块;否则,该输出端口没有对应的仲裁器。

仲裁器输入

遍历每个仲裁器,如果仲裁器不为空,则将仲裁器的输入端口与映射的对应输入分组连接起来。

仲裁器

优先级仲裁器,从多个输入请求中选择一个最高优先级的请求进行响应。

  1. 默认选择最低优先级请求,当所有请求均无效时,选择最后一个输入(索引为n-1)作为默认输出。
  2. 从次低优先级(n-2)到最高优先级(0)遍历输入端口,当某个请求i的valid有效时,更新chosen为i,并将输出数据设置为该请求的数据。优先级规则:索引越小(0为最高优先级),优先级越高。第一个有效的请求会覆盖后续请求的赋值。
  3. 根据所有请求的valid信号序列生成控制信号grant,表示每个请求是否被授权。如果请求的valid信号序列长度为0,则无请求;如果请求的valid信号序列长度为1,则只有唯一的请求,直接授权;如果请求的valid信号序列长度大于1,首元素使用原始值,表示最高优先级请求无需判断前置条件,后续元素每个位置的控制信号为!(前置所有请求的或),表示仅当所有更高优先级的请求均未有效时,当前请求被授权。
  4. 如果请求被授权,则ready信号由下游模块的out.ready决定;如果请求无效,则ready始终有效。
  5. 如果最低优先级请求被授权,则输出有效需要满足最后一个请求有效;否则,输出直接有效(更高优先级请求已被授权)。
仲裁器输出

遍历每个输出端口,如果仲裁器不为空,则将仲裁器的输出端口与对应的输出端口连接起来,并且仲裁器输出端口一直是就绪的;如果仲裁器为空,则输出端口为0。