Как определить параметрический модуль в Verilog? - PullRequest
0 голосов
/ 19 мая 2019

У меня есть ниже модуль в Verilog для наложения задержки на провод:

  module DelayModule (input_signal, delayed_signal);
    output  delayed_signal;
    input input_signal;
    wire [16:1] dummy_wire;
    wire [16:1] other = {dummy_wire[15:1],input_signal};
    assign delayed_signal =  dummy_wire[16];
    BUFX12 BUF [16:1] (.A(other),.Y(dummy_wire));
  endmodule

Я хочу сделать этот модуль таким, чтобы с помощью входного параметра я мог сделать задержку этого модуля переменной в соответствии с входными параметрами.Примерно так:

module DelayModule (input_signal, delayed_signal,k);
    output  delayed_signal;
    input input_signal;
    integer k;
    wire [k:1] dummy_wire;
    wire [k:1] other = {dummy_wire[k-1:1],input_signal};
    assign delayed_signal =  dummy_wire[k];
    BUFX12 BUF [k:1] (.A(other),.Y(dummy_wire));
endmodule

Это объявление не разрешено в Verilog, но я ищу метод для реализации такой вещи, что модуль принимает некоторый параметр, например k, но количество буферов и провод внутримодуль будет параметром этого k значения.Я хочу знать, могу ли я сделать такую ​​вещь или сделать что-то для реализации этой идеи в Verilog или нет?

1 Ответ

0 голосов
/ 19 мая 2019

Это разрешено только через параметры 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
...