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;
endmoduleO #(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 MSBSobrescrevendo 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];
endmoduleLocalparam
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
endmoduleUse localparam para constantes que não devem mudar.
Desafio
Adicione um parâmetro chamado WIDTH com um valor padrão de 4.
O que fazer:
- Adicione um parâmetro chamado
WIDTH - Defina seu valor padrão como
4 - 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;
endmoduleSobrescrevendo Parâmetros na Instanciação
counter u1 (.clk(clk), .count(count1)); // uses default (8)
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // overridden to 16Mú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
);
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo