1、RR轮询调度?
RR轮询调度指的是在一次轮询响应请求中,每个请求信号都会获得响应。
如下所示:输入rr_req[3:0]为4个请求信号,输出rr_grant[3:0]为4请求信号对应的4个响应信号:1表示有请求or响应,信号为0表示无请求or响应。如表所示,第1次,所有请求均有效,首先响应低bit的请求,所以rr_grant[0]=1。第3次请求,请求rr_req[1]有效,但是在第2次中被响应(rr_grant[1]=1),因此此次不再响应,而是响应rr_req[2],所以rr_grant[2]=1.
时间顺序 | 请求信号rr_req[3:0] | 请求响应rr_grant[3:0] |
0 | 4’b0000 | 4’b0000 |
1 | 4’b1111 | 4’b0001 |
2 | 4’b1110 | 4’b0010 |
3 | 4’b1101 | 4’b0100 |
4 | 4’b1011 | 4’b1000 |
2、Verilog是如何实现RR轮询调度的?
在verilog实现中,仅仅采用简单的组合逻辑和寄存器就可以实现rr轮询调度,不需要状态机等设计。
基本原理是锁存上一次输出请求响应rr_grant[3:0],并且生成相应的有效位rr_mask[3:0],从(rr_valid[3:0]&rr_mask[3:0]) 和 rr_valid[3:0]&(~rr_mask[3:0]) 选取不为0的作为获得rr_grant_tmp,rr_grant_tmp再经过组合逻辑并且取最低有效位。此处mask中1表示请求有效。
A | B | C | E | D | F | G |
时间顺序 | 请求信号rr_req[3:0] | pre_rr_result(已锁存的上一拍rr_grant[3:0]) | rr_mask | ~rr_mask 生成有效位 | rr_grant_tmp B&D or B&E,取其中不为0的 | 请求响应rr_grant[3:0] |
0 | 4’b0000 | 4’b0000 | 4’b1111 | 4’b0000 | 4’b0000 | 4’b0000 |
1 | 4’b1111 | 4’b0000 | 4’b1111 | 4’b0000 | 4’b1111 | 4’b0001 |
2 | 4’b1110 | 4’b0001 | 4’b0001 | 4’b1110 | 4’b1110 | 4’b0010 |
3 | 4’b1101 | 4’b0010 | 4’b0011 | 4’b1100 | 4’b1100 | 4’b0100 |
4 | 4’b1011 | 4’b0100 | 4’b0111 | 4’b1000 | 4’b1000 | 4’b1000 |
B列为请求信号rr_req[3:0]
C列pre_rr_result 为模块内部锁存的上一拍rr_grant[3:0]。
D列rr_mask为pre_rr_result经过组合逻辑得到的掩码,rr_mask= {pre_rr_result[2:0],pre_rr_result[3]}-1’b1
E列 ~rr_mask为pre_rr_result经过组合逻辑得到的掩码,rr_mask=~( {pre_rr_result[2:0],pre_rr_result[3]}-1’b1)
F列:rr_grant_tmp为B&D or B&E,取其中不为0的
G列:rr_grant_tmp经过组合逻辑输出最低有效位:(~rr_grant_tmp+1’b1)&rr_grant_tmp