10 / 63 · Prática
Prática de projeto: da especificação à maioria de três entradas
Converta uma especificação verbal em uma tabela completa e conecte minimização, implementação e teste exaustivo.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Fixe as condições antes de implementar
Construa um circuito com y=1 se pelo menos duas entradas a,b,c valerem 1. Pressupomos entradas 0/1 estáveis, pesos iguais e ausência de memória das entradas anteriores. «Exatamente duas» e «pelo menos duas» diferem em 111.
| abc | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| y | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
Cada termo indica que um par de entradas vale 1. Também é possível fatorar como . A alternativa mais rápida depende das células e dos tempos de chegada.
A maioria coincide com o carry de um somador completo
Leia cin como a terceira entrada c. cout é nossa y; sum é a paridadeParidade Valor que indica se a quantidade de bits em 1 é par ou ímpar. A verificação de paridade detecta uma quantidade ímpar de erros de bit, mas pode deixar passar uma quantidade par. Saiba mais ímpar. Comparar 001 com 111 revela o erro de usar paridade como maioria.
a + b + cin = sum + 2 × cout
Construa o critério de teste a partir da especificação
Copiar (a & b) | (a & c) | (b & c) como referência pode duplicar o mesmo erro. Use uma referência aritmética baseada em «pelo menos dois bits em 1».
module voter3(input logic a, b, c, output logic y);
assign y = (a & b) | (a & c) | (b & c);
endmodule
module tb;
timeunit 1ns;
timeprecision 1ps;
logic a, b, c, y;
int ones;
voter3 dut(.*);
initial begin
for (int v = 0; v < 8; v++) begin
{a, b, c} = v[2:0];
#1;
ones = int'(a) + int'(b) + int'(c);
assert (y === (ones >= 2))
else $fatal(1, "voter mismatch at %03b", {a,b,c});
end
$finish;
end
endmoduleEstender cada bit para int evita confusão de largura na aritmética de um bit. #1 permite a atualização da lógica combinacional do testbench; não demonstra que o chip funciona em 1 ns.
Mude a especificação e procure contraexemplos
Ao acrescentar uma autorização enable e, resulta . Agora há quatro entradas e o teste exaustivo exige 16 combinações. Confira também separadamente o invarianteInvariante Condição que deve ser verdadeira em toda execução permitida. Por exemplo, a ocupação de uma FIFO com profundidade 4 sempre fica entre 0 e 4. Saiba mais de que, com e=0, a,b,c são ignorados.
Experimente
Enumere todas as entradas que detectam a implementação incorreta y=(a XOR b XOR c). Se a função mudar para «exatamente dois bits em 1», qual linha difere da maioria?
Ler a explicação
A XOR difere em 001, 010, 100, 011, 101 e 110. Nas três primeiras produz incorretamente 1 e nas três últimas, 0. «Exatamente dois» só muda 111 para 0 em relação à maioria.