Странно все это.
Я так понимаю, у Вас синтезатор на SystemVerilog установлен.
Поэтому и обрабатывает двумерный массив на выходе. Но SystemVerilog и мой пример тоже должен скушать.
Я работаю в верилоге 2001. Только верилог 1995 не поддерживает generate. (Посмотрите в опциях своего пакета что стоит).
Что касается остального. нет ничего проще с мыщления программиста на мышление разработчика перейти. Текстом Вы описываете схему. На выходе регистры. логика и провода. Функция при описании схемы порождает что то, что Потом часто используется. Например тот же сумматор с одной и той же разрядностью по входу и выходу (Чтобы сто раз один и тот же сумматор не описывать)
Что касается соединения модулей вот пример
Еще раз повторюсь. Я работаю в верилоге 2001.
module dff_top_p
#( parameter with_d = 16)
(
input clk,
input enable_data_a,
input [with_d-1:0] in_data_a, in_data_b,
output [with_d-1:0] out_data_a, out_data_b
);
dff_e #(with_d) dff_e (
.clk (clk),
.enable_data (enable_data_a),
.in_data (in_data_a),
.out_data (out_data_a)
);
dff_e #(with_d) dff_ee (
.clk (clk),
.enable_data (1'b1),
.in_data (in_data_b),
.out_data (out_data_b)
);
endmodule
module dff_e
#( parameter with_d = 8)
(
input clk,
input enable_data,
input [with_d-1:0] in_data,
output reg [with_d-1:0] out_data
);
always @(posedge clk)
begin
if (enable_data) out_data <= in_data;
end
endmodule