blob: 6dbd6a68483bc004901bad36c7afff26ed241bfa (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
module arb #(
parameter WIDTH = 32
)(
input clk,
input rstx,
input [WIDTH-1:0] valid,
output[WIDTH-1:0] selected
);
logic found0, found1;
logic [WIDTH-1:0] mask, next_mask0, next_mask1, cand0, cand1;
always_comb begin
found0 = 0;
found1 = 0;
for (int i = 0; i < WIDTH; ++i) begin
cand0[i] = !found0 & valid[i] & mask[i];
cand1[i] = !found1 & valid[i];
next_mask0[i] = found0;
next_mask1[i] = found1;
if (valid[i] & mask[i])
found0 = 1;
if (valid[i])
found1 = 1;
end
end
assign selected = found0 ? cand0 : cand1;
always_ff @(posedge clk or negedge rstx)
if (!rstx) begin
mask <= '0;
end else begin
if (|valid)
mask <= found0 ? next_mask0 : next_mask1;
else
mask <= mask;
end
endmodule // arb
|