Altifigence Academy

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

Практикум: исчерпывающая проверка MUX и анализ выхода регистра

Подайте одинаковые входы на комбинационный и регистровый пути и проверьте результаты по таблице истинности и моменту выборки.

Объект эксперимента и условия наблюдения

При sel=0 на y выходит a, при sel=1 — b. sampled_y сохраняет y на положительном фронтеПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Изменение входов не меняет sampled_y до следующего положительного фронта.

Перед началом

Подготовьте Desktop-проект Digital Design Studio и действующее разрешение на выполнение. Сохраните каждый пример как rtl/top.sv в отдельной папке.

Сначала задайте разные a и b. Проверьте, что при sel=0 выходит a, при sel=1 — b, затем сопоставьте с каждой строкой входного файла.

Изменяйте выбранный путь самостоятельно

y = sel ? b : a

Исходный код SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

Порядок запуска

В New analysis выберите Two-state single-clock v1. Clock port — clk, период — 1000ps. Выполните Preflight с параметрами ниже, затем Run RTL simulation и сравните результаты.

ПараметрЗначение
Начальные значения регистров, от LSB[false]
Reset portОставить пустым
Maximum cycles / time8 / 8000ps

Каждый столбец соответствует одному элементу входного файла ниже. Ожидаемые комбинационные y: 0,0,0,1,1,0,1,1. Это функциональный прогноз по порядку входов; моменты обновления sampled_y на рисунке не показаны.

Все восемь комбинаций входного JSON
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
a0...1...
b0.1.0.1.
sel01010101
y ожидаемое0..1.01.

Входные воздействия

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

Сравнение результата

8 cycles · y=1 · sampled_y=1. В момент 3000ps проверьте y=1 и sampled_y=0.

Практикум использует однотактовый RTL 0/1. Тестбенч с #delay, initial, X/Z не входит в него. Отметка завершения урока фиксирует обучение, а не фактический результат симуляции.

Сначала запишите ожидаемые результаты

До запуска симулятора вычислите комбинационный yy для указанной последовательности. Ожидаемая строка: 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1. Она проверяет все восемь входных комбинаций и даёт более сильное свидетельство, чем совпадение одного конечного значения.

Выход регистраРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее обновляется на положительном фронте, а не в момент смены воздействия. Отдельно записывайте комбинационный выход перед фронтом и регистровый выход после него.

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

Здесь состояние после фронта qk+1q_{k+1} определено входами, выбранными на kk-м фронте. Сигнал sampled_y соответствует этому состоянию. Даже при одной временной координате проверяйте порядок событий подачи входа и обновления регистра.

Три проверки для различения дефектов

  1. Инверсия выбора: до замены на sel ? a : b предскажите первый ошибочный вектор. Векторы с a=ba=b не обнаруживают этот дефект.
  2. Путаница момента наблюдения: объясните, почему немедленное сравнение sampled_y вместо y с комбинационным эталоном делает исправную схему похожей на неисправную.
  3. Проверка сохранения выхода: меняйте только невыбранный вход и проверяйте постоянство yy. Изменениям выбранного входа yy должен следовать.

В отчёте об ошибке записывайте вход, момент наблюдения, ожидаемое и фактическое значение. Фраза «странная диаграмма» не позволяет отличить ошибку выбора от задержки на цикл.

Дополнительное задание

При расширении данных до 4 бит пространство комбинационных входов равно 24+4+1=5122^{4+4+1}=512. Исчерпывающая проверка всё ещё возможна, но сначала используйте 0, максимум, 0101, 1010 и walking-one, чтобы быстро выявить ошибки позиций битов. Обновите также настройки и входной файл для новой ширины.

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

На положительном фронте сохранён результат при a=0,b=1,s=0a=0,b=1,s=0. До следующего фронта изменён только ss на 1. Найдите yy после логической задержки и sampled_y до и после следующего положительного фронта.

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

Комбинационный y=1y=1. sampled_y хранит 0 до следующего положительного фронта, затем сохраняет 1. Предполагается, что вход устойчив в течение времени, необходимого для выборки.

Lesson files

mux-top.sv ↓mux-inputs.json ↓

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