Цель этой работы — получение навыка структурного описания схем на языке SystemVerilog, исследование влияния структуры на быстродействие. Анализ быстродействия полученной схемы, выделение критического пути. Дополнительно можно иллюстрировать различие структурного и поведенческого описания.
Необходимо спроектировать и описать на SystemVerilog 32-битный компаратор целых беззнаковых чисел.
Модуль должен принимать два входа:
input logic [31:0] a input logic [31:0] b
и формировать три выхода: output logic gt output logic eq output logic lt
когда a больше b, a равно b и a меньше b соответственно.
Выходы должны быть взаимоисключающими, в каждый момент времени активен ровно один выходной сигнал.
###Требование: Способ проектирования - только описание структуры. Используется только assign, если требуются дополнительные проводники, они описываются типом logic. Запрещено использовать операторы == != < > <= >= для сравнения целых векторов. Запрещено использовать:
- always
- always_comb
- if
- case
Можно (и нужно) использовать:
- оператор assign;
- побитовые операции (&, |, ^, ~);
- редукционные операции (|vector);
- конструкцию generate.
Сравнение чисел разумно проводить, начиная со старшего бита (MSB). Как только найден первый различающийся бит, можно принять решение: если a[i]=0, b[i]=1 → a < b; если a[i]=1, b[i]=0 → a > b. Если различий нет — числа равны.
-
Вам предоставлен готовый файл проекта:
vivado/comp.xprи шаблон кода
comp.svВ нем уже приведено описание интерфейса модуля — список входных и выходных сигналов.
-
После описания интерфейса добавьте описание структуры схемы. Учитывайте ограничения, указанные выше.
После описания логики:
- Перейдите в RTL Analysis → Schematic.
- Посмотрите, какая логическая схема была синтезирована.
- Ответьте для себя:
- какие логические элементы используются?
- соответствует ли схема ожидаемой логике?
Для проверки корректности работы используется симуляция.
- Тестбенч
tb_comp.svуже подготовлен. - Найдите его в окне Sources и откройте.
- Пока изменять тестбенч не нужно.
Рекомендуемый порядок:
- Внимательно прочитайте код тестбенча.
- Для лучшего понимания можно скопировать его в ChatGPT и попросить:
- объяснить, что делает этот код;
- как он работает;
- зачем нужен каждый его фрагмент.
- Если что-то непонятно — задайте дополнительные вопросы.
- В панели Flow Navigator выберите Behavioral Simulation.
- После завершения симуляции:
- откройте вывод в Tcl Console;
- проанализируйте результаты.
- Перейдите в Synthesis → Run Synthesis.
- Если синтез завершился неуспешно, исправьте ошибки и повторите синтез.
- Отметьте, сколько логических ячеек использовано (Synthesis → Report Utilization или закладка Design Runs ).
- В панели Flow Navigator выберите Simulation → Post-Synthesis Timing Simulation. Теперь симуляция будет выполнена с учетом задержек в каждом использованном логическом элементе. Директива `timescale в начале файла задает точность симуляции: величину "единицы времени" и через слэш - дискретность вычислений, в нашем случае "единица отсчета" -0 наносекунда, точность измерения - пикосекунда.
- После завершения симуляции:
- откройте вывод в Tcl Console;
- проанализируйте результаты.
- Откройте окно с файлом .wcfg, где результаты симуляции представлены в виде временной диаграммы.
- Научитесь пользоваться кнопками изменения масштаба, поиска моментов изменения определенного сигнала.
- Измерьте время от подачи новых данных на вход компаратора до появления на выходе верного результата.
- Измените разрядность входных чисел до 128. Чтобы код выглядел профессионально, используйте директиву parameter N = 128.
- Измените разумным образом тестовые данные. Как изменится время работы компаратора? Подберите тестовые данные так, чтобы время работы было максимально возможным.
Закомментируйте написанный вами код модуля comp. Замените его на assign gt = (a > b) и так далее. Теперь Vivado самостоятельно создаст компаратор. Тестбенч, естественно, менять не нужно - интерфейс модуля не изменился. Повторите синтез и Post-Synthesis Timing Simulation. Сравните количество использованных ячеек и быстродействие схемы.