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.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
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.
| abc | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| y | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
Cada término indica que una pareja de entradas vale 1. También puede factorizarse como . 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.
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».
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
endmoduleAmpliar 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 . 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.