Altifigence Academy

10 / 63 · Esercitazione

Esercitazione: dalla specifica alla maggioranza a tre ingressi

Convertire una specifica testuale in una tabella completa e collegare minimizzazione, realizzazione e verifica esaustiva.

Fissare le condizioni prima dell'implementazione

Progettiamo y=1 quando almeno due ingressi fra a, b, c valgono 1. Assumiamo ingressi 0/1 stabili, con lo stesso peso e senza memoria degli ingressi precedenti. «Esattamente due» e «almeno due» differiscono su 111.

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

Ogni termine indica due ingressi contemporaneamente a 1. La stessa funzione si fattorizza in y=ab+c(a+b)y=ab+c(a+b). La versione più veloce dipende dalle celle e dai tempi d'arrivo.

La maggioranza coincide con il carry del sommatore completo

Leggete cin come terzo ingresso c. cout è il nostro y, mentre sum è la parità dispariParità Indica se il numero di bit a 1 è pari o dispari. Rileva un numero dispari di errori, ma può non rilevarne un numero pari. Approfondisci. Confrontando 001 e 111 si riconosce l'errore di usare la parità al posto della maggioranza.

Verificare con cout gli otto ingressi della funzione di maggioranza

a + b + cin = sum + 2 × cout

Ricavare il riferimento separatamente dalla specifica

Copiare (a & b) | (a & c) | (b & c) nel modello di riferimento può duplicare lo stesso errore. Usiamo invece un calcolo intero della specifica «almeno due 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

L'estensione di ogni bit a int evita ambiguità di larghezza nell'aritmetica a un bit. #1 concede al circuito combinatorio simulato il tempo di aggiornarsi; non dimostra che il chip reale operi in 1 ns.

Cambiare la specifica e cercare controesempi

Aggiungendo l'abilitazione e, si ottiene y=e(ab+ac+bc)y=e(ab+ac+bc). Ora gli ingressi sono quattro e una verifica esaustiva richiede 16 combinazioni. Verificate anche l'invarianteInvariante Condizione sempre vera in ogni esecuzione ammessa. Una FIFO profonda quattro contiene, per esempio, sempre da zero a quattro elementi. Approfondisci secondo cui con e=0 tutti gli ingressi a, b, c devono essere ignorati.

Prova tu

Elencate tutti gli ingressi che rivelano l’errore y=(a XOR b XOR c). Quale riga cambia rispetto alla maggioranza richiedendo esattamente due 1?

Leggi la spiegazione

XOR differisce per 001, 010, 100, 011, 101 e 110: i primi tre producono erroneamente 1, gli ultimi tre erroneamente 0. Con esattamente due 1 cambia solo 111, che passa a 0.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.