summaryrefslogtreecommitdiff
path: root/src/arb.sv
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