Router::NewRouter
函数中所有支持的路由器类型(type
)及其含义的详细解释表格。
这些类型决定了在 NoC 仿真器(如 BookSim)中使用哪种具体的路由策略和架构实现。
🧩 BookSim 中支持的 Router 类型一览表
type 字符串值 |
路由器类名 | 英文全称 / 简介 | 特点说明 |
---|---|---|---|
"iq" |
IQRouter |
Input-Queued Router | 基础输入队列路由器,每个输入端口有独立的缓冲区,适合模拟传统交换结构 |
"event" |
EventRouter |
Event-driven Router | 基于事件驱动机制的路由器,用于更细粒度的时间控制 |
"chaos" |
ChaosRouter |
Chaos-based Routing | 使用混沌理论进行路径选择,具有随机性以避免拥塞 |
"vct" |
VCTRouter |
Virtual Cut-Through Router | 支持虚拟直通(Virtual Cut-Through),减少延迟 |
"fbfcl" |
FBFCLRouter |
Flit Bubble Flow Control Localized | 使用 flit bubble 流控技术,局部流控优化 |
"bypass_no_arb" |
BypassNoArbRouter |
Bypass without Arbitration | 绕过仲裁机制的快速旁路路由器 |
"bypass_no_arb_fbfcl" |
BypassNoArbFBFCLRouter |
Bypass + FBFCL | 结合 bypass 和 FBFCL 的特性 |
"bypass_arb" |
BypassArbRouter |
Bypass with Arbitration | 带仲裁机制的旁路路由器 |
"bypass_arb_fbfcl" |
BypassArbFBFCLRouter |
Bypass + FBFCL + Arb | 加入仲裁机制的混合式旁路路由器 |
"bypass_vct" |
BypassVCTRouter |
Bypass + VCT | 在 VCT 模式下启用旁路机制 |
"bypass_vct_bubble" |
BypassVCTBubbleRouter |
Bypass + VCT + Bubble | 在 VCT 基础上加入 bubble 技术优化 |
"hybrid" |
HybridRouter |
Hybrid Router | 混合架构,结合多种路由方式提高性能 |
"hybrid_fbfcl" |
HybridFBFCLRouter |
Hybrid + FBFCL | 混合架构 + FBFCL 流控 |
"hybrid_simplified" |
BypassArbRouter |
Simplified Hybrid | 简化的混合旁路架构(实际复用 BypassArb) |
"hybrid_simplified_fbfcl" |
BypassArbFBFCLRouter |
Simplified Hybrid + FBFCL | 同上,但加入 FBFCL 流控 |
"smart" |
——(子类型决定) | SMART (Smart Multi-hop Adaptive Routing) | 智能多跳自适应路由架构 |
📌 SMART 子类型(当 type == “smart” 时)
SMART 是一种智能多跳绕道路由机制,旨在通过 lookahead 预测网络状态并提前决策路径,从而降低延迟、提升吞吐量。
smart_type 字符串值 |
路由器类名 | 描述 |
---|---|---|
"classic" |
SMARTRouter |
最初的 SMART 架构,基于 lookahead 决策是否绕行 |
"not_empty_realocation" |
SMARTNotEmptyRealocationRouter |
SMART 变体,在非空状态下重新分配资源 |
"nebb_wh" |
SMARTNEBBWHRouter |
NEBB_WH:带 lookahead 的高效绕道策略 |
"nebb_wh_fbfcl" |
SMARTNEBBWHFBFCLRouter |
NEBB_WH + FBFCL |
"nebb_vct" |
SMARTNEBBVCTRouter |
NEBB_VCT:使用 VCT 的 SMART 实现(未优化信用) |
"nebb_vct_opt" |
SMARTNEBBVCTOPTRouter |
NEBB_VCT_OPT:SMART++,带信用优化 |
"nebb_vct_opt_bubble" |
SMARTNEBBVCTOPTBubbleRouter |
SMART++ + bubble 技术 |
"s-smart" |
SMARTLARouter |
S-SMART++:进一步优化的 lookahead 自适应路由 |
"nebb_vct_la" |
SMARTNEBBVCTLARouter |
NEBB_VCT_LA:结合 lookahead 的 VCT SMART |
"nebb_vct_la_bubble" |
SMARTNEBBVCTLABubbleRouter |
NEBB_VCT_LA + bubble,适用于 Torus 网络 |
🔍 术语解释(名词对照)
名词缩写 | 全称 | 含义简述 |
---|---|---|
IQ | Input-Queued | 输入队列,每个输入通道有自己的缓冲队列 |
VCT | Virtual Cut-Through | 虚拟直通,flit 到达后立即转发,不等待整个 packet 缓存 |
FBFCL | Flit Bubble Flow Control Localized | 局部化 flit 泡沫流控,优化链路利用率 |
Bypass | —— | 快速通道绕过主路由逻辑,缩短关键路径 |
SMART | Smart Multi-hop Adaptive Routing Technique | 智能多跳自适应路由技术,利用 lookahead 提前决策路径 |
NEBB | Non-Empty Buffer Based | 基于非空缓冲区的状态判断绕道 |
LA | Lookahead | 预读机制,提前查看下一跳状态以优化路由决策 |
✅ 建议配置示例
[general]
router = smart
smart_type = nebb_vct_opt
use_noc_latency = 1
这表示使用 SMART++ 架构,结合 lookahead 和 credit 优化,适合高性能片上网络场景。
逐个函数进行解释
- 函数名称;
- 所属类(主要是
IQRouter
); - 函数作用说明;
- 是否与 信道(channel)相关;
- 是否与 跳数(hop count)追踪或统计相关;
- 是否参与 仲裁(arbitration)流程;
- 是否涉及 输入/输出处理、路由决策、VC 分配等关键步骤。
🧾 表格:IQRouter 类中所有函数详解
函数名 | 所属类 | 含义说明 | 信道相关 | 跳数相关 | 仲裁相关 | 输入/输出/路由相关 |
---|---|---|---|---|---|---|
IQRouter(...) |
IQRouter |
构造函数,初始化路由器参数 | ✅ | ❌ | ❌ | ✅ |
~IORouter() |
IORouter |
析构函数,释放资源 | ❌ | ❌ | ❌ | ❌ |
AddOutputChannel(FlitChannel* channel, CreditChannel* backchannel) |
IORouter |
添加一个输出通道及其反向信用通道 | ✅ | ❌ | ❌ | ✅ |
ReadInputs() |
IORouter |
从输入通道读取 flits(数据包片段) | ✅ | ❌ | ❌ | ✅ |
InternalStep() |
IORouter |
内部逻辑执行一步(如更新 VC 状态) | ❌ | ❌ | ❌ | ✅ |
WriteOutputs() |
IORouter |
将 flits 写入输出通道 | ✅ | ❌ | ❌ | ✅ |
ReceiveFlits() |
IORouter |
接收来自输入通道的 flits | ✅ | ❌ | ❌ | ✅ |
ReceiveCredits() |
IORouter |
接收信用(Credit),用于流控 | ✅ | ❌ | ❌ | ✅ |
InputQueuing() |
IQRouter |
将输入的 flits 放入相应的输入队列(VC) | ❌ | ❌ | ❌ | ✅ |
RouteEvaluate() |
IORouter |
根据当前 flit 计算路由路径(调用路由函数) | ❌ | ✅ | ❌ | ✅ |
RouteUpdate() |
IORouter |
更新路由结果(保存到 VC 中) | ❌ | ✅ | ❌ | ✅ |
VCAllocEvaluate() |
IORouter |
VC 分配评估阶段,决定哪些 VC 可以发送 flit | ❌ | ❌ | ❌ | ✅ |
VCAllocUpdate() |
IORouter |
更新 VC 分配结果 | ❌ | ❌ | ❌ | ✅ |
SWHoldEvaluate() |
IORouter |
判断是否需要保持当前开关状态 | ❌ | ❌ | ❌ | ✅ |
SWHoldUpdate() |
IORouter |
更新开关保持状态 | ❌ | ❌ | ❌ | ✅ |
SWAllocAddReg(int input, int vc, int output) |
IORouter |
注册某个输入 VC 到输出端口的请求 | ❌ | ❌ | ✅ | ✅ |
SWAllocEvaluate() |
IORouter |
开关仲裁评估阶段,收集所有输入对输出的请求 | ❌ | ❌ | ✅ | ✅ |
SWAllocUpdate() |
IORouter |
更新开关仲裁结果,确定哪个输入被选中 | ❌ | ❌ | ✅ | ✅ |
SwitchEvaluate() |
IORouter |
检查开关是否准备好传输 flit | ❌ | ❌ | ❌ | ✅ |
SwitchUpdate() |
IORouter |
实际完成 flit 的转发操作 | ✅ | ❌ | ❌ | ✅ |
OutputQueuing() |
IORouter |
处理输出队列,准备发送 flits | ✅ | ❌ | ❌ | ✅ |
SendCredits() |
IORouter |
向上游节点发送信用反馈 | ✅ | ❌ | ❌ | ✅ |
Display(ostream&) |
IORouter |
显示路由器状态(调试用) | ❌ | ❌ | ❌ | ❌ |
GetUsedCredit(int o) const |
IORouter |
获取某个输出端口已使用的信用数 | ✅ | ❌ | ❌ | ❌ |
GetUsedCreditVc(int o, int vc) const |
IORouter |
获取某个输出端口特定 VC 的已使用信用数 | ✅ | ❌ | ❌ | ❌ |
GetBufferOccupancy(int i) const |
IORouter |
获取某个输入缓冲区的占用情况 | ✅ | ❌ | ❌ | ❌ |
UsedCredits() |
IORouter |
返回每个输出端口的已使用信用数 | ✅ | ❌ | ❌ | ❌ |
FreeCredits() |
IORouter |
返回每个输出端口的剩余信用数 | ✅ | ❌ | ❌ | ❌ |
MaxCredits() |
IORouter |
返回每个输出端口的最大信用数 | ✅ | ❌ | ❌ | ❌ |
UpdateNoQ(int input, int vc, Flit const *f) |
IQRouter |
不使用 QoS 时更新统计数据(包括 hop count) | ❌ | ✅ | ❌ | ✅ |
🔍 重点功能分类说明
📡 1. 信道相关函数
这些函数负责读写输入输出通道(FlitChannel 和 CreditChannel):
AddOutputChannel
ReadInputs
WriteOutputs
ReceiveFlits
ReceiveCredits
SendCredits
如果你要添加新的 channel,必须在构造路由器时通过 AddOutputChannel
添加,并确保其被正确连接。
🔄 2. 跳数(Hop Count)相关函数
跳数通常在 UpdateNoQ
中更新,该函数会在每次 flit 发送前被调用:
UpdateNoQ(...)
这个函数会检查 flit 的 hop count 并递增,用于统计网络延迟和路径长度。
⚖️ 3. 仲裁相关函数
这些函数负责在多个输入之间竞争同一个输出时进行仲裁:
SWAllocAddReg
SWAllocEvaluate
SWAllocUpdate
它们构成了开关仲裁的核心逻辑,通常使用 Round Robin 或其他策略实现。
🧭 4. 路由相关函数
这些函数负责决定 flit 应该发往哪个方向:
RouteEvaluate
RouteUpdate
路由函数(如 dim_order_route
)在这里被调用。
🛠️ 如果你要添加新的 Channel:
步骤如下:
创建 FlitChannel 和 CreditChannel 对象
- 在拓扑构建代码中为每个新连接创建两个对象(flit 和 credit)。
调用
AddOutputChannel(flit_chan, credit_chan)
- 将它们添加到对应的路由器中。
确保在路由函数中支持新方向
- 修改路由函数(如
route_func.cpp
中的函数),使其能处理新增的方向编号。
- 修改路由函数(如
修改仲裁逻辑(如有必要)
- 如果新增方向影响仲裁器(如 RoundRobinArb),需确保其能处理更多输入/输出。
在配置文件中设置拓扑和路由器类型
.cfg
文件中指定正确的拓扑结构和 router 类型。
✅ 总结建议
功能 | 建议位置 |
---|---|
新增信道 | 使用 AddOutputChannel 添加 |
读取输入 | ReadInputs , ReceiveFlits |
输出处理 | WriteOutputs , SwitchUpdate |
路由计算 | RouteEvaluate , RouteUpdate |
仲裁处理 | SWAllocEvaluate , SWAllocUpdate |
跳数统计 | UpdateNoQ |
流控信用 | SendCredits , ReceiveCredits |