verilator/test_regress/t/t_recursive_module_bug.v

80 lines
1.5 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of either the GNU Lesser General Public License Version 3
// or the Perl Artistic License Version 2.0.
// SPDX-FileCopyrightText: 2022 Geza Lore
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
// This hits a case where parameter specialization of recursive modules
// used to yield a module list that was not topologically sorted, which
// then caused V3Inline to blow up as it assumes that.
module top #(
parameter N = 8
) (
input wire [N-1:0] i,
output wire [N-1:0] o,
output wire [N-1:0] a
);
sub #(
.N(N)
) inst (
.i(i),
.o(a)
);
generate
if (N > 1) begin : recursive
top #(
.N(N / 2)
) hi (
.i(i[N-1:N/2]),
.o(o[N-1:N/2]),
.a()
);
top #(
.N(N / 2)
) lo (
.i(i[N/2-1:0]),
.o(o[N/2-1:0]),
.a()
);
end
else begin : base
assign o = i;
end
endgenerate
endmodule
module sub #(
parameter N = 8
) (
input wire [N-1:0] i,
output wire [N-1:0] o
);
generate
if (N > 1) begin : recursive
sub #(
.N(N / 2)
) hi (
.i(i[N-1:N/2]),
.o(o[N-1:N/2])
);
sub #(
.N(N / 2)
) lo (
.i(i[N/2-1:0]),
.o(o[N/2-1:0])
);
end
else begin : base
assign o = i;
end
endgenerate
endmodule