Параметры

Параметры позволяют легко создать несколько похожих модулей с различной спецификацией. Параметры являются константами времени компиляции. SystemVerilog предоставляет несколько методов для установки значения констант параметров. Каждому параметру может быть присвоено значение по умолчанию при объявлении. Значение параметра созданного модуля, интерфейса или программы может быть переопределено в каждом экземпляре.

Параметры обозначаются ключевым словом parameter. Помимо параметров, которые можно специфицировать извне модуля, можно задать локальные параметры (localparam), которые задаются внутри модуля и не видны снаружи.

Синтаксис

/* Вариант 1: объявление параметризованного модуля */
module module_name #(parameter <parameter_name> = <value>) ...

/* Вариант 2: объявление параметризованного модуля с локальным параметром */
module module_name(ports);
  parameter <parameter_name> = <value>; // или localparam
  ...

/* Вариант 3: инстанцирование параметризованного модуля */
module_name module_var #(<value1>, <value2>, ...) ...

/* Враиант 4: инстанцирование параметризованного модуля именнованным списком параметров */
module_name module_var #(.<parameter_name1>(<value1>), ...) ...

Пример

module counterm #(parameter N = 4)(output reg[N-1:0] out, input clk, reset, enable);
  always @ (posedge clk) begin
    if (enable) begin
      if (reset) 
        out = 0;       
      else 
        out = out + 1; 
    end else begin
      out = out;
    end
  end
endmodule

module counterm_tb;
    parameter _N = 5;
    reg clk, reset, enable;
    wire[_N-1:0] out;    
    counterm #(_N) _counterm(out, clk, reset, enable); // mod 2**5 

    initial begin
        $display("Time [**]:\tclk\trst\ten\tout_bin\tout_dec");
        clk = 0; reset = 1; enable = 1;
        #1 reset = 0;
        #2 reset = 1;
        #2 reset = 0;      
        #10 $finish;
    end

    always #1 clk = ~clk;
  
    always @(posedge clk) 
        $display("Time [%0t]:\t%b\t%b\t%b\t%b\t%d", 
            $time, clk, reset, enable, out, out);
endmodule

Результат исполнения

Time [**]:  clk rst en  out_bin out_dec
Time [1]:   1   0   1   xxxxx    x
Time [3]:   1   1   1   00000    0
Time [5]:   1   0   1   00000    0
Time [7]:   1   0   1   00010    2
Time [9]:   1   0   1   00010    2
Time [11]:  1   0   1   00100    4
Time [13]:  1   0   1   00100    4
Time [15]:  1   0   1   00110    6

Last updated