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

发布于:2025-05-29 ⋅ 阅读:(26) ⋅ 点赞:(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


网站公告

今日签到

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