noc多核芯片设计:booksim仿真从入门到精通2Router 类型及路由算法修改
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 |