Altifigence Academy

10 / 63 · Практика

Практикум проектирования: от спецификации к трёхвходовому большинству

Преобразуйте словесную спецификацию в полную таблицу истинности и свяжите минимизацию, реализацию и исчерпывающую проверку.

Зафиксируйте условия до реализации

Построим схему, в которой y=1, если минимум два из входов a,b,c равны 1. Входы — устойчивые 0/1, веса одинаковы, предыдущие входы не запоминаются. «Ровно два» и «минимум два» — разные функции при 111.

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

Каждый из трёх членов означает одновременную единицу на двух входах. Ту же функцию можно факторизовать как y=ab+c(a+b)y=ab+c(a+b). Какая форма быстрее, зависит от ячеек и времени прихода сигналов.

Большинство совпадает с переносом полного сумматора

Считайте cin ниже третьим входом c. cout — наш y, sum — нечётная чётностьЧётность указывает, чётно или нечётно число единичных битов. Проверка чётности обнаруживает ошибки в нечётном числе битов, но может пропустить ошибки в чётном числе. Подробнее. Сравнение 001 и 111 выявляет ошибочную подмену большинства паритетом.

Проверьте восемь входных комбинаций большинства через cout

a + b + cin = sum + 2 × cout

Независимый критерий выводите из спецификации

Если скопировать (a & b) | (a & c) | (b & c) в эталон, можно повторить ту же ошибку. Используйте целочисленный подсчёт по требованию «как минимум две единицы».

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

Каждый бит расширен до int, чтобы избежать неоднозначности ширины однобитной арифметики. #1 даёт комбинационной логике теста время обновиться и не доказывает работу реального чипа за 1 ns.

Измените спецификацию и найдите контрпример

Добавив разрешение e, получаем y=e(ab+ac+bc)y=e(ab+ac+bc). Теперь входов четыре, для исчерпывающей проверки нужны 16 комбинаций. Отдельно проверяйте инвариантИнвариант — условие, которое должно выполняться при любом допустимом выполнении. Например, число хранимых элементов FIFO глубиной 4 всегда находится между 0 и 4 включительно. Подробнее: при e=0 значения a,b,c не должны влиять на выход.

Попробуйте сами

Перечислите все входы, обнаруживающие ошибочную реализацию y=(a XOR b XOR c). Какая строка изменится относительно большинства, если функция должна выдавать 1 при ровно двух единицах?

Прочитать объяснение

XOR отличается на 001, 010, 100, 011, 101, 110. В первых трёх случаях ошибочно выдаёт 1, в последних трёх — 0. Для функции «ровно две» только строка 111 большинства меняется на 0.

Выбор действует в этом браузере. Его можно изменить внизу страницы.