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写回。
整体框图
接口列表
见接口文档
二级模块 VldMergeUnit
功能
VldMergeUnit 模块主要用于处理向量加载操作的合并逻辑,它接收来自执行单元的写回数据,通过VldMgu 模块进行合并处理,最终输出合并后的写回数据。该模块使用寄存器wbReg存储中间数据,并根据vlWen信号选择是否直接使用写回数据或使用合并后的数据。
对于vl被first-only-fault指令修改的uop,写回的数据能被直接使用。
整体框图
二级模块 RealWBCollideChecker
功能
RealWBCollideChecker 模块主要功能是对写回操作的写口进行冲突检查和仲裁,通过将输入端口分组,为每个输出端口实例化一个仲裁器,并将输入和输出端口与仲裁器连接起来,实现写端口的仲裁。
输入输出映射
首先对输入的元素按照端口(port)进行分组,然后对每个分组内的元素按照优先级(priority)进行排序,最终返回分组排序后的映射inGroup。
仲裁器实例化
每个仲裁器负责处理一个输出端口的仲裁,如果映射中包含当前输出端口号x,则实例化一个RealWBArbiter 模块;否则,该输出端口没有对应的仲裁器。
仲裁器输入
遍历每个仲裁器,如果仲裁器不为空,则将仲裁器的输入端口与映射的对应输入分组连接起来。
仲裁器
优先级仲裁器,从多个输入请求中选择一个最高优先级的请求进行响应。
- 默认选择最低优先级请求,当所有请求均无效时,选择最后一个输入(索引为n-1)作为默认输出。
- 从次低优先级(n-2)到最高优先级(0)遍历输入端口,当某个请求i的valid有效时,更新chosen为i,并将输出数据设置为该请求的数据。优先级规则:索引越小(0为最高优先级),优先级越高。第一个有效的请求会覆盖后续请求的赋值。
- 根据所有请求的valid信号序列生成控制信号grant,表示每个请求是否被授权。如果请求的valid信号序列长度为0,则无请求;如果请求的valid信号序列长度为1,则只有唯一的请求,直接授权;如果请求的valid信号序列长度大于1,首元素使用原始值,表示最高优先级请求无需判断前置条件,后续元素每个位置的控制信号为!(前置所有请求的或),表示仅当所有更高优先级的请求均未有效时,当前请求被授权。
- 如果请求被授权,则ready信号由下游模块的out.ready决定;如果请求无效,则ready始终有效。
- 如果最低优先级请求被授权,则输出有效需要满足最后一个请求有效;否则,输出直接有效(更高优先级请求已被授权)。
仲裁器输出
遍历每个输出端口,如果仲裁器不为空,则将仲裁器的输出端口与对应的输出端口连接起来,并且仲裁器输出端口一直是就绪的;如果仲裁器为空,则输出端口为0。