1. Fixed Priority Arbitrary
固定优先级就是指每个req的优先级是不变的,即优先级高的先被处理,优先级低的必须是在没有更高优先级的req的时候才会被处理。所以转化为数学模型就是找出req序列中第一个为1的位置,然后将其转换为onehot。
例如:
req[3:0] = 4'b1100 ==> grant[3:0] = 4'b0100
req[3:0] = 4'b1010 ==> grant[3:0] = 4'b0010
要做的第一步就是先根据req构造出一个mask,该mask会将第一个非0bit以上的值掩盖。例如,
req[3:0] = 4'b1100 ==> mask[3:0] = 4'b1000
req[3:0] = 4'b1010 ==> mask[3:0] = 4'b1100
可以通过假设req[0]为1,那么mask[0] = 0,mask[3:1] = req[2:0] | mask[2:0]。
得到mask后,就能够使用mask将req变为onehot的grant,即grant[3:0] = req[3:0] & (~mask[3:0])。
module fixed_priorty_arb (
//output
gnt,
//input
req);
parameter REQ_WIDTH = 16;
input [REQ_WIDTH-1:0] req;
output[REQ_WIDTH-1:0] gnt;
wire [REQ_WIDTH-1:0] req;
wire [REQ_WIDTH-1:0] mask;
wire [REQ_WIDTH-1:0] gnt;
assign mask[0] = 1'b0;
assign mask[REQ_WIDTH-1:1] = req[REQ_WIDTH-2:0] | mask[REQ_WIDTH-2:0];
assign gnt[REQ_WIDTH-1:0] = req[REQ_WIDTH-1:0] & (~pre_req[REQ_WIDTH-1:0]);
endmodule
2. Round-Robin Priority Arbitrary
前面所描述的Fixed Priority Arbitrary有个缺点,如果优先级高的一直来req,那么优先级低的req将会被饿死,一直不能被选中执行。因此,为了更加公平,可以采用Round-Robin仲裁算法。
该算法每个req的优先级并不固定,会根据前一次的仲裁结果动态调整各个req的优先级。具体描述如下,同样假设有有四个req(