Altifigence Academy

10 / 63 · Práctica

Práctica de diseño: de la especificación a una mayoría de tres entradas

Convierta una especificación verbal en una tabla completa y conecte minimización, implementación y prueba exhaustiva.

Fije las condiciones antes de implementar

Construya un circuito con y=1 si al menos dos entradas a,b,c valen 1. Suponemos entradas 0/1 estables, igual peso para cada una y ausencia de memoria de entradas anteriores. «Exactamente dos» y «al menos dos» difieren en 111.

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

Cada término indica que una pareja de entradas vale 1. También puede factorizarse como y=ab+c(a+b)y=ab+c(a+b). La alternativa más rápida depende de las celdas y de los tiempos de llegada.

La mayoría coincide con el acarreo de un sumador completo

Lea cin como la tercera entrada c. cout es nuestra y; sum es la paridadParidad Valor que indica si el número de bits a 1 es par o impar. La comprobación de paridad detecta un número impar de errores de bit, pero puede omitir un número par. Más información impar. Comparar 001 con 111 revela el error de usar paridad como mayoría.

Verifique las ocho entradas de la mayoría con cout

a + b + cin = sum + 2 × cout

Construya el criterio de prueba desde la especificación

Copiar (a & b) | (a & c) | (b & c) como referencia puede duplicar el mismo error. Use una referencia aritmética basada en «al menos dos unos».

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

Ampliar cada bit a int evita confusiones de ancho en la aritmética de un bit. #1 permite que se actualice la lógica combinacional del banco de pruebas; no demuestra que el chip funcione en 1 ns.

Cambie la especificación y busque contraejemplos

Al añadir un permiso enable e, resulta y=e(ab+ac+bc)y=e(ab+ac+bc). Ahora hay cuatro entradas y la prueba exhaustiva requiere 16 combinaciones. Compruebe también por separado el invarianteInvariante Condición que debe cumplirse en toda ejecución permitida. Por ejemplo, la ocupación de una FIFO de profundidad 4 siempre está entre 0 y 4. Más información de que con e=0 se ignoran a,b,c.

Inténtalo tú

Enumere todas las entradas que detectan la implementación incorrecta y=(a XOR b XOR c). Si se cambia la función a «exactamente dos unos», ¿qué fila difiere de la mayoría?

Leer la explicación

La XOR difiere en 001, 010, 100, 011, 101 y 110. En las tres primeras produce incorrectamente 1 y en las tres últimas, 0. «Exactamente dos» solo cambia 111 a 0 respecto a la mayoría.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.