3 / 37 · Conceito
Módulos, portas e instâncias: conexões como contratos
Componha módulos com conexões nomeadas, verificando acionamento único e limites da hierarquia.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Limite de módulo não é limite de clock
Um módulo agrupa portas e lógica. Instanciá-lo não cria automaticamente registrador nem ciclo. Módulos combinacionais em série continuam uma trajetória combinacional, com atrasos físicos somados. Um registrador explícito cria a fronteira de armazenamento. Documente direção, largura, sinal, acionamento e validade; nomes evitam depender da ordem posicional.
module select_word #(parameter integer W = 8) (
input logic [W-1:0] a, b,
input logic select_b,
output logic [W-1:0] y
);
assign y = select_b ? b : a;
endmodule
module choose_and_increment (
input logic [7:0] a, b,
input logic select_b,
output logic [8:0] result
);
logic [7:0] chosen;
select_word #(.W(8)) select_u (
.a(a), .b(b), .select_b(select_b), .y(chosen)
);
assign result = {1'b0, chosen} + 9'd1;
endmoduleselect_word é o tipo de módulo e select_u o nome de instância. .a(a) liga a porta a do filho ao sinal a do pai. .W(8) é configuração da elaboração, não entrada dinâmica.
Inspecione as duas pontas
chosen tem um único acionamento, y do filho, e é lido pelo pai. Não atribua também em outro processo; logic não torna conflitos válidos. result tem nove bits para 255+1=256; estende chosen antes de somar. a=255, b=9, select_b=0 dá 256 e select_b=1 dá 10. Oito bits perderiam carry no primeiro caso.
Hierarquia, arquivos e top
As definições podem estar juntas ou separadas, mas o compilador precisa das duas. O top é choose_and_increment; escolher select_word muda a fronteira testada. Ausência do arquivo filho é problema da lista de fontes, não prova de lógica incorreta. Conexões posicionais podem mudar ao editar portas. Entrada não ligada não é zero intencional: conecte constantes ou documente saídas não usadas e reveja diagnósticos. Siga dependências para evitar feedback combinacional sem armazenamento; módulos não interrompem o ciclo.
Prática: verifique composição independentemente
Para (a, b, select_b)=(0,255,0),(0,255,1),(255,0,0),(255,0,1), espere 1,256,256,1. Percorra 256 valores selecionados nos dois select e deixe o não selecionado diferente para revelar inversão. A referência escolhe a ou b inteiro e soma 1, comparando após estabilização; ler chosen interno compartilharia seleção errada. Acrescente depois registrador de saída, definindo reset, validade e a borda de entrada correspondente: o contrato temporal muda mesmo com aritmética igual.