interface Interface #(num_clients = 0); bit [num_clients-1:0] req; for (genvar i = 0; i < num_clients; ++i) begin : mps modport client_mp (output .client_req(req[i])); end endinterface module ClientAnd (client_ifc, bits); parameter WIDTH = 2; Interface client_ifc; input [WIDTH-1:0] bits; assign client_ifc.client_req = &bits; endmodule module ClientTick #(start = 0, period = 1) (Interface client_ifc, input clock); initial client_ifc.client_req = start; integer counter; initial counter = 0; always @(posedge clock) begin counter += 1; if (counter % period == 0) client_ifc.client_req = ~client_ifc.client_req; end endmodule module top; logic clock; initial begin clock = 1; forever #1 clock = ~clock; end parameter N = 8; Interface #(.num_clients(N)) intf(); for (genvar j = 0; j < N - 1; j++) begin : clients ClientTick #(j, j + 1) client( .clock, .client_ifc(intf.mps[j + 1].client_mp) ); end ClientAnd #(4) client( .bits(intf.req[4:1]), .client_ifc(intf.mps[0].client_mp) ); initial begin $monitor("%0d %b %b", $time, clock, intf.req); #100 $finish(0); end endmodule