Menu
Coddy logo textTech

Parâmetros

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 11 de 90.

Você pode criar muitas cópias do mesmo módulo e usá-las em lugares diferentes — isso é chamado de **múltiplas instâncias**. Em vez de escrever o mesmo código repetidamente, você o escreve uma vez e o reutiliza quantas vezes precisar. Cada instância é uma cópia separada desse hardware no chip.

Mas e se você precisar que cada cópia seja diferente? Por exemplo, um contador de 8 bits, um contador de 16 bits e um contador de 32 bits. Sem parâmetros, você precisaria escrever três módulos separados.

Parâmetros resolvem este problema.

Um parâmetro é um valor constante que você pode definir ao criar uma instância. Ele permite configurar cada cópia do módulo de forma diferente.

Declarando Parâmetros

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

O #(parameter WIDTH = 8) define um parâmetro chamado WIDTH com um valor padrão de 8.

Ao declarar parâmetros, usamos o símbolo # logo após o nome do módulo e antes da lista de portas. O # informa ao Verilog que o que se segue é uma lista de parâmetros que configuram o módulo. Se o seu módulo não tiver parâmetros, você simplesmente omite o # completamente.

Usando Parâmetros

Parâmetros podem ser usados em qualquer lugar onde uma constante seja necessária:

reg [WIDTH-1:0] data;        // Tamanho do vetor
count <= count + 1;           // Funciona com qualquer largura
assign out = data[WIDTH-1];   // Posição do MSB

Sobrescrevendo Parâmetros

Ao usar o módulo, você pode alterar o valor do parâmetro:

// Largura padrão (8 bits)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// Sobrescrever para 16 bits
counter #(.WIDTH(16)) u2 (.clk(clk), .reset(reset), .count(count2));

Múltiplos Parâmetros

Você pode ter múltiplos parâmetros:

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Localparam

Um localparam é semelhante, mas não pode ser sobrescrito por fora:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // Estes valores são fixos dentro deste módulo
endmodule

Use localparam para constantes que não devem mudar.

challenge icon

Desafio

Adicione um parâmetro chamado WIDTH com um valor padrão de 4.

O que fazer:

  1. Adicione um parâmetro chamado WIDTH
  2. Defina seu valor padrão como 4
  3. O parâmetro vai dentro de #( ) após o nome do módulo

Folha de consulta

Parâmetros permitem configurar instâncias de módulos de forma diferente sem reescrever o código.

Declarando Parâmetros

module counter #(
  parameter WIDTH = 8  // default value
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Sobrescrevendo Parâmetros na Instanciação

counter u1 (.clk(clk), .count(count1));          // uses default (8)
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // overridden to 16

Múltiplos Parâmetros

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)( ... );

Localparam (constante não sobrescrevível)

localparam STATE_IDLE = 2'b00;
localparam STATE_RUN  = 2'b01;

Use localparam para constantes internas que não devem ser alteradas de fora do módulo.

Experimente você mesmo

module counter #(
  // Adicione o parâmetro WIDTH aqui com o padrão 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos