Это разрешено только через параметры Verilog (обычно реализуемые как иерархические параметры, передаваемые целевому модулю в том месте, где он создается). Обратите внимание, что это будет опция времени компиляции, поэтому вы не сможете изменить ее во время работы контроллера. Ниже приведен фрагмент кода, объясняющий эту концепцию:
//----------------------------------------------------
// Module Name: dff_sync.v
//----------------------------------------------------
// Description: conventional 2xFF sync module with parameterizable options
// such as:
// - (1) Reset Value - DFF_SYNC_RESET_VALUE
// - (2) Number of FF stages - DFF_SYNC_NUM_FF_STAGES
// - (3) Input Bus width - DFF_SYNC_INP_BUS_WIDTH
//
// TBD:
// - application of random delay (+/- 1 clk cycle), as it is the best evidence
// of bug-free CDC functinal implementation.
//----------------------------------------------------
module dff_sync #
(
parameter DFF_SYNC_RESET_VALUE = 'b0,
parameter DFF_SYNC_NUM_FF_STAGES = 'd2,
parameter DFF_SYNC_INP_BUS_WIDTH = 'd1
)
(
input clk,
input rst_n,
input [DFF_SYNC_INP_BUS_WIDTH-1:0] data_in,
output [DFF_SYNC_INP_BUS_WIDTH-1:0] data_out
);
/* packed dimension */ /* unpacked dimension*/
reg [DFF_SYNC_NUM_FF_STAGES-1:0] dff_chain [DFF_SYNC_INP_BUS_WIDTH-1:0];
// Note: multi-dimensional array can be accessed as shown below
// reg [7:0] regA [3:0]
// regA[unpacked_3_thru_0][packed_7_thru_0]
genvar i;
generate
// iterate through unpacked dimension...
for (i = 0; i < DFF_SYNC_INP_BUS_WIDTH; i = i + 1)
begin: g_dff_sync
always @(posedge clk or negedge rst_n)
begin: p_sync_chain
if (!rst_n)
dff_chain[i] <= {DFF_SYNC_NUM_FF_STAGES{DFF_SYNC_RESET_VALUE}};
else
dff_chain[i] <= {dff_chain[i][DFF_SYNC_NUM_FF_STAGES-1:1],data_in[i]};
end // p_sync_chain
assign data_out[i] = dff_chain[i][DFF_SYNC_NUM_FF_STAGES-1];
end // g_dff_sync
endgenerate
endmodule // dff_sync
И ниже. Вы можете найти код, который будет создавать экземпляр варианта этого модуля, что приведет к синхронизатору 2xFF с RESET_VALUE = 0, NUM_FF_STAGES = 2 и INP_BUS_WIDTH = 1:
dff_sync #
(
.DFF_SYNC_RESET_VALUE ('d0),
.DFF_SYNC_NUM_FF_STAGES ('d2),
.DFF_SYNC_INP_BUS_WIDTH ('d1)
)
i_dff_sync
(
// ---- Inputs ----
.clk (clk),
.rst_n (rst_n),
.data_in (data_in),
// ---- Outputs ----
.data_out (data_out)
); // i_dff_sync