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 8-bit counter, um 16-bit counter e um 32-bit counter. Sem parâmetros, você precisaria escrever três módulos separados.

Parâmetros resolvem esse problema.

Um parameter é um valor constante que você pode definir quando cria 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 default 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 # por completo.

Usando Parameters

Parameters podem ser usados em qualquer lugar onde uma constante for 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 Parameters

Quando você usa o module, você pode alterar o valor do parameter:

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

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

Multiple Parameters

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 alterado de fora (overridden):

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

Use localparam para constantes que não devem ser alteradas.

challenge icon

Desafio

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

O que fazer:

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

Experimente você mesmo

module counter #(
  // Adicione o parâmetro WIDTH aqui com valor 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