Уровень 43: Остановка времени

Открыть уровень →

Задание

В модуле FullAdder допущена ошибка — один из проводов подключён неверно. Тест падает на нескольких входных наборах. Ваша задача: найти ошибку, исправить её и добиться прохождения всех тестов.

Файл fulladder.v — редактируемый. cpu.v и testbench.v — только для чтения (контекст). Используйте вкладки для переключения между файлами.

Подсказка: внимательно посмотрите на вентиль g4 — какой сигнал он должен обрабатывать для правильного формирования бита переноса c_out?

Материалы по теме

Решение

Как читать временную диаграмму, чтобы найти ошибку: 1. Найдите момент, где результат теста разошёлся с ожидаемым (первое несовпадение на выходе sum или c_out). 2. Посмотрите на внутренние провода в этот же момент времени — какой сигнал ведёт себя не так. 3. Идите назад от выхода к источнику: c_outw2/w3 → вентили → входы. Ошибка всегда живёт в том вентиле, чей выход не совпадает с формулой. Подробнее — в статье «Временная диаграмма».

В файле fulladder.v ошибка в вентиле g4:

and g4(w3, w1, w2);  // ошибка — третий порт w2 вместо c_in

Исправление:

and g4(w3, w1, c_in);  // правильно — w3 = w1 AND c_in

Сигнал w3 участвует в формировании выходного переноса: c_out = w2 OR w3, где w2 = a AND b. Полная формула: c_out = (a AND b) OR (w1 AND c_in) = (a AND b) OR ((a XOR b) AND c_in) — классическая логика полного сумматора. Подстановка w2 вместо c_in даёт неверный результат.

Схема решения уровня 43 — Остановка времени
Авторское решение уровня 43 в симуляторе (тёмная тема)