Altifigence Academy

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.

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.

SystemVerilog
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;
endmodule

select_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.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.