noc多核芯片设计:booksim仿真从入门到精通2Router 类型及路由算法修改

发布于:2025-05-29 ⋅ 阅读:(391) ⋅ 点赞:(0)

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:

步骤如下:

  1. 创建 FlitChannel 和 CreditChannel 对象

    • 在拓扑构建代码中为每个新连接创建两个对象(flit 和 credit)。
  2. 调用 AddOutputChannel(flit_chan, credit_chan)

    • 将它们添加到对应的路由器中。
  3. 确保在路由函数中支持新方向

    • 修改路由函数(如 route_func.cpp 中的函数),使其能处理新增的方向编号。
  4. 修改仲裁逻辑(如有必要)

    • 如果新增方向影响仲裁器(如 RoundRobinArb),需确保其能处理更多输入/输出。
  5. 在配置文件中设置拓扑和路由器类型

    • .cfg 文件中指定正确的拓扑结构和 router 类型。

✅ 总结建议

功能 建议位置
新增信道 使用 AddOutputChannel 添加
读取输入 ReadInputs, ReceiveFlits
输出处理 WriteOutputs, SwitchUpdate
路由计算 RouteEvaluate, RouteUpdate
仲裁处理 SWAllocEvaluate, SWAllocUpdate
跳数统计 UpdateNoQ
流控信用 SendCredits, ReceiveCredits


微信公众号

今日签到

点亮在社区的每一天
去签到