Fair-Among-Equals仲裁方案的详细介绍
在计算机体系结构、片上网络(NoC)及多主设备总线系统中,Fair-Among-Equals(平等者间公平仲裁) 是一种基于优先级分组的混合仲裁策略,其核心思想是:在相同优先级的设备间采用公平仲裁(如Round Robin),而不同优先级设备间仍遵循优先级规则。这一方案在保证高优先级设备实时性的同时,避免了同优先级设备的资源饥饿问题。
核心设计原则
-
优先级分层
将主设备(如CPU、DMA、GPU等)划分为不同的优先级组(如High/Medium/Low)。- 高优先级组:实时性要求高的设备(如中断控制器)。
- 平等组(Equals):相同优先级的设备(如多个DMA引擎)。
-
组间仲裁:固定优先级(Fixed Priority)
- 高优先级组的请求始终优先于低优先级组。
- 例如:
High > Medium > Low
-
组内仲裁:公平轮询(Round Robin)
- 同优先级组内设备通过轮询机制公平分配带宽。
- 例如:3个Medium优先级设备按
M0→M1→M2→M0...顺序循环授权。
工作流程
假设系统存在以下设备分组:
- High组:H0(实时性设备)
- Medium组:M0, M1, M2(平等设备)
- Low组:L0, L1(后台任务)
仲裁场景:
- 初始状态:所有设备同时请求总线。
- 组间仲裁:
- 仲裁器检测到High组请求 → 授权给H0(固定优先级最高)。
- H0传输结束:
- High组无新请求 → 仲裁器切换到Medium组。
- 组内仲裁(Medium组):
- 采用Round Robin:假设当前指针指向M1 → 授权给M1。
- M1结束后,指针移至M2 → 授权给M2。
- M2结束后,指针移至M0 → 授权给M0。
- 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
实际应用场景
-
多核CPU内存控制器
- 高优先级:CPU核的缓存填充请求。
- 平等组:多个DMA引擎的数据搬运请求(轮询分配带宽)。
- 低优先级:后台磁盘I/O请求。
-
片上网络(NoC)路由仲裁
- 将数据包按QoS标记分组(如实时/尽力而为),同等级别流量公平调度。
-
PCIe总线设备仲裁
- 高优先级:中断消息;平等组:多个Endpoint的常规数据传输。
设计注意事项
- 优先级反转风险
低优先级组长期阻塞时,可能影响关联的高优先级服务(需结合超时机制)。 - 组内设备数量限制
轮询指针逻辑复杂度随组内设备数线性增加(通常每组≤8设备)。 - 动态优先级调整
高级实现支持运行时切换设备分组(如DRAM控制器根据进程QoS调整)。
💡 总结:Fair-Among-Equals通过“组间优先级+组内公平” 的分层策略,在复杂系统中实现了实时性与公平性的平衡,已成为现代异构计算架构(如ARM Neoverse平台、Intel UPI总线)的核心仲裁方案之一。
浙公网安备 33010602011771号