Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module priority_select #(
- parameter W_REQ = 32 // must be of form 2**m * 3**n, m >= 0, n >= 0
- ) (
- input wire [W_REQ-1:0] req,
- output wire [W_REQ-1:0] gnt
- );
- generate
- if (W_REQ <= 4) begin: base
- reg [W_REQ-1:0] deny;
- always @ (*) begin: smear
- integer i;
- deny[0] = 1'b0;
- for (i = 1; i < W_REQ; i = i + 1)
- deny[i] = deny[i - 1] || req[i - 1];
- end
- assign gnt = req & ~deny;
- end else begin: recurse
- localparam SPLIT =
- W_REQ % 4 == 0 ? 4 :
- W_REQ % 3 == 0 ? 3 :
- 2 ;
- localparam PART_SIZE = W_REQ / SPLIT;
- wire [W_REQ-1:0] partial_gnts;
- priority_select #(
- .W_REQ (PART_SIZE)
- ) inner_select [SPLIT-1:0] (
- .req (req),
- .gnt (partial_gnts)
- );
- integer i;
- reg [SPLIT-1:0] coarse_req;
- wire [SPLIT-1:0] coarse_gnt;
- always @ (*)
- for (i = 0; i < SPLIT; i = i + 1)
- coarse_req[i] = |(partial_gnts[i * PART_SIZE +: PART_SIZE]);
- priority_select #(
- .W_REQ (SPLIT)
- ) outer_select (
- .req (coarse_req),
- .gnt (coarse_gnt)
- );
- reg [W_REQ-1:0] masked_gnt;
- always @ (*)
- for (i = 0; i < SPLIT; i = i + 1)
- masked_gnt[i * PART_SIZE +: PART_SIZE] =
- partial_gnts[i * PART_SIZE +: PART_SIZE]
- & {PART_SIZE{coarse_gnt[i]}};
- assign gnt = masked_gnt;
- end
- endgenerate
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement