Altifigence Academy

10 / 37 · Conceito

RTL combinacional e atribuições completas

Expresse a mesma função com o operador condicional e always_comb e encontre omissões que inferem latches.

A lógica combinacional depende das entradas atuais

A forma mais direta de um MUXMultiplexador Circuito combinacional que conecta uma dentre várias entradas à saída conforme um sinal de seleção. É preciso especificar a correspondência entre os bits de seleção e os números das entradas. Saiba mais é assign y = sel ? b : a;. Para calcular várias saídas em conjunto, pode-se usar always_comb.

SystemVerilog
always_comb begin
  y = a;
  if (sel) y = b;
end

O valor padrão também define o caminho sel=0. Se restar apenas if (sel) y = b;, com sel=0 a y anterior precisa ser mantida: deixa de ser uma função puramente combinacional. Não ignore avisos da ferramenta nem confie somente na palavra always_comb.

Atribuir y=a por padrão e escolher b apenas com sel=1 tem a mesma função combinacional 0/1 do circuito abaixo. A saída também fica determinada com sel=0.

Dois caminhos cobertos pela atribuição padrão

y = sel ? b : a

A sintaxe procedural não é apenas ordem de execução de software

Em blocos combinacionais, resultados intermediários costumam ser calculados com atribuições bloqueantes =. Se uma expressão lê um resultado atribuído antes no mesmo bloco, essa dependência forma um caminho combinacional. Distinga esse papel de <=, a atribuição não bloqueanteAtribuição não bloqueante Atribuição escrita com <= em RTL sequencial. Avalia o lado direito e agenda a atualização, permitindo que os registradores da mesma borda calculem a partir do estado anterior. Saiba mais que atualiza registradoresRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais sequenciais.

SystemVerilog
always_comb begin
  next_y = sel ? b : a;
  inverted_y = ~next_y;
end

Outra regra básica é não acionar a mesma saída por vários blocos. Ao dividir módulos, identifique na interface quem é o único acionador de cada sinal.

Iguale primeiro as larguras dos dados

Se selecionar entre 8 e 12 bits, explicite a largura de y e a extensão de sinal. Defina os intervalos no projeto, em vez de depender de descobrir por acaso na forma de onda se a extensão implícita estava correta. Fora do modelo 0/1, o operador condicional com sel=X pode diferir de um if simples; não generalize os resultados binários do curso para todos os quatro estados.

Experimente

Um always_comb contém apenas if(en) y=d;. Como convertê-lo em lógica combinacional que produza 0 sem enable?

Ler a explicação

Atribua 0 a y no início do bloco e sobrescreva com d se en estiver ativo, ou use uma expressão de largura explícita equivalente a assign y = en ? d : 0. Manter o valor anterior com en=0 é outra especificação, de registrador ou latch, e não equivale a produzir 0.

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