В этом примере показан полный рабочий процесс создания компонента SystemVerilog DPI для интерфейса буфера FIFO, предназначенного для интеграции с приемником UART. Интерфейс записывается в MATLAB и экспортируется в имитатор HDL. Также предоставляются файлы SystemVerilog для приемника UART и его испытательного стенда.
В демонстрационных целях в этом примере используется Modelsim 10.3c в 64-разрядной Windows 7. Однако эта же процедура может быть легко воспроизведена для других систем и тренажеров.
Продукты, необходимые для этого примера:
Кодер MATLAB ®
Симуляторы: Mentor Graphics ® ModelSim ®/QuestaSim ® или Cadence ® Incisive
Один из поддерживаемых компиляторов C: Microsoft ® Visual C++ или GNU GCC
Универсальный асинхронный приемник и передатчик (UART) - это схема, которая посылает и принимает данные по последовательной линии. UART обычно используются в стандарте RS-232 и содержат приемник и передатчик. Однако в этом примере используется только приемник.
Последовательная передача начинается с «начального бита», который равен 0, за которым следуют биты данных, и заканчивается «битом четности» и «стоп-битом». Передача одного байта показана на следующем рисунке:

Передача является асинхронной, что означает отсутствие тактовой информации, поэтому приемник и передатчик должны согласовать, какая скорость передачи, стоп-биты и бит четности используются. В этом примере один байт будет передан со скоростью передачи в бодах 19 200, 1 стоповым битом и без битов четности.
Схема избыточной дискретизации будет использоваться для оценки средней точки бита данных со скоростью, в 16 раз превышающей скорость передачи в бодах, как показано на рисунке ниже.

Следующая схема иллюстрирует конструкцию приемника UART.

Первый шаг - написать код MATLAB, который будет удовлетворять требованиям вашего дизайна, вы должны попытаться зафиксировать требования в тестовом инструменте. В этом примере наша конструкция состоит из буфера FIFO, состоящего из 8 слов.
Проектирование: FIFO_Buffer
Испытательный стенд: FIFO_Buffer_tb
Запустите testbench, чтобы убедиться в отсутствии ошибок во время выполнения. Рисунок ниже должен быть напечатан.
FIFO_Buffer_tb

Обратите внимание, что испытательные инструменты реализуют проект следующим образом:
Тактовые циклы < 15: Запись 6 байт (сигнал записи включен, сигнал чтения отключен), затем Чтение 6 байт (сигнал чтения включен, сигнал записи отключен).
Тактовые циклы > 15: Одновременное чтение и запись (например, записываемый байт считывается в следующем такте).
Чтобы создать компонент, выполните следующую команду:
dpigen -testbench FIFO_Buffer_tb FIFO_Buffer -args {0,int8(0),0}
На рисунке ниже показаны соответствующие файлы для этого примера.

После того, как DPIGEN создаст компонент DPI и его тестовую среду, можно запустить тестовую среду SystemVerilog, выполнив следующие действия:
Запустите ModelSim/QuestaSim в режиме графического интерфейса пользователя.
Измените текущий каталог на «dpi_tb» в каталоге генерации кода в имитаторе HDL.
Введите следующую команду для запуска моделирования
do run_tb_mq.do
Будут созданы следующие формы волн:

Обратите внимание, что это соответствует нашему тестовому инструменту MATLAB, где мы записываем 6 байт и затем считываем их, а затем одновременно записываем и считываем 8 байт.
По завершении моделирования на консоли должен быть напечатан следующий текст:
**************TEST COMPLETED (PASSED)**************
После проверки поведения компонента DPI пришло время интегрировать его в приемник UART. На следующем рисунке показаны файлы, необходимые для различных компонентов.

Для реализации приемника UART с интегрированным компонентом DPI были предоставлены средства тестирования с именем «uart _ rx _ FIFO _ tb.sv». Для интеграции компонента необходимо создать экземпляр компонента в тестовых инструментах, как показано ниже:
// Instantiate DUT generated using MATLAB Based SystemVerilog DPI FIFO_Buffer_dpi u_FIFO_Buffer_dpi( .clk(clk), .clk_enable(clk_enable), .reset(reset), .wr(rx_done_tick), .w_data(dout), .rd(rd), .Empty(Empty), .r_data(r_data), .Full(Full) );
Для успешного моделирования конструкции убедитесь, что следующие файлы находятся в одной папке:

Аналогично шагу 3 откройте модуль Modelsim и запустите файл .do с помощью:
do run_tb.do
Формируются следующие формы волн:

В тестовом инструменте 6 ASCII букв ('MATLAB') передаются через последовательный сигнал 'rx' и записываются в буфер FIFO. После завершения передачи 6-й буквы подается сигнал «rd» для получения букв («MATLAB») обратно в «r _ data».
Pong P. Chu (2008), FPGA Prototyping by Verilog Examples. Hoboken, New Jersey: John Wiley & Sons, Inc.