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