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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.
always_comb begin
y = a;
if (sel) y = b;
endO 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.
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.
always_comb begin
next_y = sel ? b : a;
inverted_y = ~next_y;
endOutra 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.