BypassNetwork
- 版本:V2R2
- 状态:OK
- 日期:2025/02/27
- commit:xxx
术语说明
| 全称 | 描述 |
|---|---|
| BypassNetWork | 旁路网络 |
子模块列表
| 子模块 | 描述 |
|---|---|
| ImmExtracter | 立即数生成模块 |
| UIntExtracter | UInt解码模块 |
功能
BypassNetWork 位于 DataPath,Exu 流水级之间,主要用于为功能单元提供源操作数。目前27个功能单元,总计71个源操作数
首先对于可以前递/旁路/两级旁路的源操作数:
根据 Datapath 输入的 ExuSource 信息,由 UintExtract 提取出独热码,选取可能的来自功能单元的旁路数据,具体现有的唤醒配置见下表。
| Source | Sink |
|---|---|
| ALU0 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| ALU1 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| ALU2 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| ALU3 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| LDU0 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| LDU1 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| LDU2 | ALU0, BJU0, ALU1, BJU1, ALU2, BJU2, ALU3, BJU3, LDU0, LDU1, LDU2, STA0, STA1, STD0, STD1 |
| Source | Sink |
|---|---|
| FEX0 | FEX0, FEX1, FEX2, FEX3, FEX4 |
| FEX2 | FEX0, FEX1, FEX2, FEX3, FEX4 |
| FEX4 | FEX0, FEX1, FEX2, FEX3, FEX4 |
其中作用于向量浮点以及访存单元之间的二级旁路,目前暂时取消。
其次对于源操作数是立即数部分,根据来自 datapath 的立即数信息,由 ImmExtracto r组装生成64bit立即数。
最后根据datapath中 data source 信息,从所有可能的数据来源(前递,旁路,二级旁路,v0,寄存器堆,立即数,regcache,0号寄存器)中选取源操作数,传入功能单元。
另外,对于跳转功能单元,部分 pcoffset 逻辑也放在旁路网络中,立即数信息同样由 ImmExtractor 组装生成。
具体设计见此图:
模块设计
二级模块 ImmExtracter
该模块负责生成 64bit 立即数,首先根据下述映射,将立即数映射为 32bit 形式,之后再对结果进行符号拓展成 64bit 立即数。
| SelImm | ImmUnion | Immlen | extracter |
|---|---|---|---|
| IMM_I | I | 12 | SignExt(imm(len - 1, 0), 32) |
| IMM_S | S | 12 | SignExt(imm, 32) |
| IMM_SB | B | 12 | SignExt(Cat(imm, 0.U(1.W)), 32) |
| IMM_U | U | 20 | Cat(imm(len - 1, 0), 0.U(12.W)) |
| IMM_UJ | J | 20 | SignExt(Cat(imm, 0.U(1.W)), 32) |
| Z | Z | 22 | imm |
| IMM_B6 | B6 | 6 | ZeroExt(imm, 32) |
| IMM_VSETVLI | VSETVLI | 11 | SignExt(imm, 32) |
| IMM_VSETIVLI | VSETIVLI | 15 | SignExt(imm, 32) |
| IMM_OPIVIS | OPIVIS | 5 | SignExt(imm, 32) |
| IMM_OPIVIU | OPIVIU | 5 | ZeroExt(imm, 32) |
| IMM_LUI32 | LUI32 | 32 | imm(31, 0) |
| IMM_VRORVI | VRORVI | 6 | ZeroExt(imm, 32) |
二级模块 UIntExtracter
该模块服务于 toExuOH 功能:负责将压缩成UInt的源操作数旁路来源的 exuidx 解码为one-hot形式。
记录源操作数旁路来源的 exusource 中的功能单元标号在发射阶段经历了两次压缩:
- 首先将标志27个功能单元的独热码,根据旁路唤醒可能的来源,压缩为7/3个功能单元的独热码
- 其次将7/3个功能单元的独热码,压缩为UInt形式,共3/2bit UInt
因此在旁路网络中需要对来自 DataPath 的压缩后 exusource 进行两次解压缩:
- 首先将 3/2 bit的 exusource 解压为独热码
- 其次将 压缩后的独热码,根据当前功能单元可能的唤醒来源,解压为标志27个功能单元的独热码
对于第一步解压操作,在 toExuOH 中只需要简单通过移位(唤醒源与源操作数是一一对应的)完成
UIntExtracter 负责第二步解压操作,完成下述映射:
| EncodedExuOH | ExtractExuOH |
|---|---|
| ALU0(0) | 0 |
| ALU1(1) | 2 |
| ALU2(2) | 4 |
| ALU3(3) | 6 |
| LDU0(4) | 20 |
| LDU1(5) | 21 |
| LDU2(6) | 22 |
| EncodedExuOH | ExtractExuOH |
|---|---|
| FEX0(0) | 8 |
| FEX1(1) | 10 |
| FEX2(2) | 12 |