• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Fair-Among-Equals仲裁方案的详细介绍

在计算机体系结构、片上网络(NoC)及多主设备总线系统中,Fair-Among-Equals(平等者间公平仲裁) 是一种基于优先级分组的混合仲裁策略,其核心思想是:在相同优先级的设备间采用公平仲裁(如Round Robin),而不同优先级设备间仍遵循优先级规则。这一方案在保证高优先级设备实时性的同时,避免了同优先级设备的资源饥饿问题。


核心设计原则

  1. 优先级分层
    将主设备(如CPU、DMA、GPU等)划分为不同的优先级组(如High/Medium/Low)。

    • 高优先级组:实时性要求高的设备(如中断控制器)。
    • 平等组(Equals):相同优先级的设备(如多个DMA引擎)。
  2. 组间仲裁:固定优先级(Fixed Priority)

    • 高优先级组的请求始终优先于低优先级组。
    • 例如:High > Medium > Low
  3. 组内仲裁:公平轮询(Round Robin)

    • 同优先级组内设备通过轮询机制公平分配带宽。
    • 例如:3个Medium优先级设备按M0→M1→M2→M0...顺序循环授权。

工作流程

假设系统存在以下设备分组:

  • High组:H0(实时性设备)
  • Medium组:M0, M1, M2(平等设备)
  • Low组:L0, L1(后台任务)

仲裁场景:

  1. 初始状态:所有设备同时请求总线。
  2. 组间仲裁:
    • 仲裁器检测到High组请求 → 授权给H0(固定优先级最高)。
  3. H0传输结束:
    • High组无新请求 → 仲裁器切换到Medium组。
  4. 组内仲裁(Medium组):
    • 采用Round Robin:假设当前指针指向M1 → 授权给M1。
    • M1结束后,指针移至M2 → 授权给M2。
    • M2结束后,指针移至M0 → 授权给M0。
  5. Medium组无请求时:
    • 切换到Low组,组内继续Round Robin(如L0→L1→L0...)。

关键优势

特性 说明
平衡实时性与公平性 高优先级设备即时响应,同优先级设备避免饥饿。
灵活性 支持动态调整分组策略(如根据QoS需求划分优先级)。
资源利用率优化 空闲组的带宽自动分配给其他活跃组。
硬件开销可控 组内Round Robin逻辑简单,组间仅需优先级比较器。

与纯Round Robin/固定优先级方案的对比

场景 纯Round Robin 固定优先级 Fair-Among-Equals
高优先级设备响应 延迟可能较高(需等待轮询) ✅ 即时响应 ✅ 即时响应(组间优先级)
同优先级设备公平性 ✅ 绝对公平 ❌ 低优先级易饿死 ✅ 组内公平轮询
低优先级设备吞吐量 ✅ 稳定 ❌ 可能为零(持续被抢占) ⚖️ 取决于高/中组负载
适用场景 带宽敏感型系统(如GPU渲染管线) 实时控制系统(如汽车ECU) 混合负载系统(如SoC多核处理器)

硬件实现示例

// 简化的Fair-Among-Equals仲裁器伪代码
module arbiter (
  input [2:0] high_req,    // High组请求信号
  input [2:0] med_req,     // Medium组请求信号
  input [1:0] low_req,     // Low组请求信号
  output reg [3:0] grant   // 授权设备ID
);

reg [1:0] med_ptr;  // Medium组轮询指针
reg [0:0] low_ptr;  // Low组轮询指针

always @(posedge clk) begin
  // 组间优先级仲裁
  if (|high_req) begin                      // High组有请求
    grant <= {2'b10, priority_encoder(high_req)}; // 编码High组设备
  end else if (|med_req) begin              // Medium组有请求
    grant <= {2'b01, med_rr_arb(med_req, med_ptr)}; // 组内轮询
    med_ptr <= next_ptr(med_req, med_ptr);  // 更新指针
  end else if (|low_req) begin              // Low组有请求
    grant <= {2'b00, low_rr_arb(low_req, low_ptr)}; 
    low_ptr <= next_ptr(low_req, low_ptr);
  end
end

// Medium组内Round Robin函数
function [1:0] med_rr_arb(input [2:0] req, input [1:0] ptr);
  for (int i=1; i<=3; i++) begin
    logic [1:0] next = (ptr + i) % 3;
    if (req[next]) return next;  // 找到下一个请求设备
  end
  return 0;
endfunction
endmodule

实际应用场景

  1. 多核CPU内存控制器

    • 高优先级:CPU核的缓存填充请求。
    • 平等组:多个DMA引擎的数据搬运请求(轮询分配带宽)。
    • 低优先级:后台磁盘I/O请求。
  2. 片上网络(NoC)路由仲裁

    • 将数据包按QoS标记分组(如实时/尽力而为),同等级别流量公平调度。
  3. PCIe总线设备仲裁

    • 高优先级:中断消息;平等组:多个Endpoint的常规数据传输。

设计注意事项

  1. 优先级反转风险
    低优先级组长期阻塞时,可能影响关联的高优先级服务(需结合超时机制)。
  2. 组内设备数量限制
    轮询指针逻辑复杂度随组内设备数线性增加(通常每组≤8设备)。
  3. 动态优先级调整
    高级实现支持运行时切换设备分组(如DRAM控制器根据进程QoS调整)。

💡 总结:Fair-Among-Equals通过“组间优先级+组内公平” 的分层策略,在复杂系统中实现了实时性与公平性的平衡,已成为现代异构计算架构(如ARM Neoverse平台、Intel UPI总线)的核心仲裁方案之一。

posted on 2025-08-02 14:48  SOC验证工程师  阅读(36)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3