Chapter 4: Arbitration Logic本文版权归作者所有任何形式的转载都请注明出处通常的仲裁模块可以抽象为以下模型其特性包括输入请求表示 Active 状态的请求Request[N-1:0]输出授权仲裁结果Grant[N-1:0]One-Hot 编码时序每个 Cycle 可连续仲裁优先级状态寄存器每个请求的 Priority State位宽取决于仲裁算法优先级更新逻辑由仲裁算法决定。固定优先级算法bit0 → bitN 优先级逐次降低。设Request {Rn, Rn-1, ..., R1, R0}则仲裁结果表达式为G[i]R[i]⋅R[i−1]‾⋅...⋅R[1]‾⋅R[0]‾G[i] R[i] \cdot \overline{R[i-1]} \cdot ... \cdot \overline{R[1]} \cdot \overline{R[0]}G[i]R[i]⋅R[i−1]​⋅...⋅R[1]​⋅R[0]​也就是说该逻辑为「找最低位的 1」具体实现方式有以下几种a. 从 bit0 向上查找遍历整个Request[N-1:0]复杂度 O(N)for(i0;iN;i)if(R[i]){G[i]1;break;}b.G R (~R 1)即 R 与 R 的补码按位与逻辑级数取决于加法计算的位宽。例如若R 0110_0100R 的补码为1001_1100则G 0110_0100 1001_1100 0000_0100。c. 二叉树查找每一级子树比较两 bit 大小选择右侧最大值逐级筛选 Request复杂度 O(log N)轮询Round-Robin算法将整个Request[N-1:0]通过 Priority 分成高优先级段HP和低优先级段LP。定义映射f(Req[i], Pri[i]) 2 * Req[i] Pri[i]将活跃请求与优先级转化为 2 bit 编码0b00非活跃 / LP0b01非活跃 / HP0b10活跃 / LP0b11活跃 / HP即可套用上述二叉树查找每一级子树比较右侧最大值逐级筛选 Request。仲裁成功后需要通过移位把 Pri 向量更新——例如若Grant 0001_0000则下次 Pri 更新为1110_0000目的是将上次仲裁成功的请求挪到 LP规律是由低到高轮询。利用二维优先级矩阵可以实现更多复杂仲裁算法。图中矩阵元素P(i, j)代表输入 i 与 j 的优先级关系若P(i, j) 1表示输入 i 优先级高于输入 j若P(i, j) 0表示输入 i 优先级低于输入 j其中P(i, i)无意义固定为 0。每行 1 的数量总和可以反映出量化的优先级——sum 越大优先级越高。若某一列中有 1表示自己并非最高优先级则无法获得 Grant。此外仲裁时还需要判断输入请求是否活跃非活跃的请求需要屏蔽掉对应行和列的 1。如Fig 4.8所示输入请求req {0, 1, 1}由于req[0]非活跃需要屏蔽第 0 行和第 0 列将剩余第 1、2 列做或非运算得到Grant {x, 0, 1}即本轮仲裁 req2 获胜具体电路如 Fig. 4.9 所示。利用不同的矩阵更新策略可以实现多种仲裁算法LRULeast Recently Used本轮仲裁获胜的输入 i将其优先级降为最低——将 i 行全部清 0i 列全部置 1即P(i, *) 0P(*, i) 1。MRUMost Recently Used本轮仲裁获胜的输入 i将其优先级升为最高——将 i 行全部置 1i 列全部清 0即P(i, *) 1P(*, i) 0。RRIncremental Round Robin无论是否活跃每一轮仲裁都将最高优先级的输入降为最低。FCFS LRUHybrid First-Come First Served and Least Recently Used检测到新请求 i 上升沿时若 j 非活跃则将其优先级提高到大于其他非活跃请求 j即P(i, j) 1若 i、j 同样活跃则优先级不变若输入 i 在本轮仲裁获胜则将优先级置为最低即P(i, *) 0P(*, i) 1。