module foo #(
    parameter type T = logic,
    parameter size = 0
);
    generate
        if (size != 0) begin : foo
            bar #(T, size - 1) x();
        end
    endgenerate
    initial $display("foo %d %d", $bits(T), size);
endmodule

module bar #(
    parameter type U = logic,
    parameter size = 0
);
    generate
        if (size != 0) begin : bar
            foo #(U, size - 1) x();
        end
    endgenerate
    initial $display("bar %d %d", $bits(U), size);
endmodule

module top_1; foo #(byte, 2) x(); endmodule
module top_2; bar #(byte, 3) x(); endmodule

module top_3; foo #(bit, 4) x(); endmodule
module top_4; bar #(bit, 5) x(); endmodule

module top; endmodule