Altifigence Academy

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.

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.

abc000001010011100101110111
y00010111
y=Σm(3,5,6,7)=ab+ac+bcy=\Sigma m(3,5,6,7)=ab+ac+bc

Cada termo indica que um par de entradas vale 1. Também é possível fatorar como y=ab+c(a+b)y=ab+c(a+b). 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.

Verifique as oito entradas da maioria com cout

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

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

Estender 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 y=e(ab+ac+bc)y=e(ab+ac+bc). 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.

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