Mipsfpga И Внутрисхемная Отладка

Документация, программное обеспечение и файлы конфигурации, поставляемые в составе пакета MIPSfpga, предполагают использование Bus Bluster в качестве аппаратного отладчика.

В статье приведены инструкции по использованию для этой цели практически любого USB-UART адаптера, построенного на микросхеме FTDI с поддержкой MPSSE (FT232H, FT2232H, FT4232H, FT2232D).

Кратко описывает интеграцию среды разработки Visual Studio Code и отладчика GNU GDB. Все конфигурационные файлы, описанные в статье, а также часть документации доступны.

на GitHub .



Эсистемные элементы



MIPSfpga и внутрисхемная отладка

MIPSfpga — промышленное процессорное ядро MIPS microAptiv, исходные коды которого доступны по академической лицензии [ Л1 ].

MIPSfpga-plus — это проект системы на кристалле, построенной на ядре MIPSfpga [ Л2 ].

В моем случае система развернута на плате Terasic DE10-Lite с ПЛИС Altera MAX10 на борту[ Л3 ].

Плата Pinboard II действует как адаптер (программатор, отладчик) между MIPSfpga-plus и ПК [ Л4 ] с чипом FT2232 [ Д1 ] производства FTDI [ Л5 ].

Платы физически соединены через интерфейсы UART и JTAG[ Л6 ].

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

Второй — базовый интерфейс для отладки с помощью EJTAG [ Д7 ].

Разница между JTAG и EJTAG очень хорошо показана в [ Л7 ].

Ключевой технологией, существенно упрощающей построение программаторов и отладчиков на базе микросхем FTDI, является Multi-Protocol Synchronous Serial Engine (MPSSE) [ Д2 , Д3 , Д4 ].

Поддержка MPSSE — основополагающий момент для конфигурации, описанной в статье.

Получить подобные результаты можно только с USB-адаптерами, построенными на следующих чипах FTDI: FT232H, FT2232H, FT4232H, FT2232D. На стороне ПК взаимодействие с платой USB осуществляется: по каналу UART – с помощью обычных драйверов от FTDI и любой терминальной программы; для канала MPSSE используется драйвер WinUSB (работа проводилась в системе Windows).

Для компиляции используются инструменты Codescape GNU [ Д9 ], для отладки — традиционный пакет OpenOCD[ Л8 , Д8 ] и GNU GDB [ Д5 ].

Эти пакеты программного обеспечения включены в Codescape MIPS SDK [ Л12 ].

Их взаимодействие между собой осуществляется с помощью протокола gdbserver[ Л9 ].

В качестве графического интерфейса для отладки использовался код Visual Studio (VSCode).

Л10 ] с установленным расширением vscode-cpptools [ Л11 ].

В связи с тем, что данное расширение ориентировано на высокоуровневую разработку (C/C++), в интерфейсе отсутствуют такие виды, как просмотр инструкций ассемблера, просмотр памяти или прямой доступ к регистрам.



Краткая информация о MPSSE и FTDI

MPSSE — это аппаратно реализованный набор примитивных функций, значительно упрощающих реализацию последовательных интерфейсов (SPI, I2C, JTAG).

Например: отправьте N бит по нарастающему фронту тактового сигнала, прочитайте M бит по спадающему фронту, установите вывод X на ноль и т. д. До 2014 года китайцы в значительных масштабах клепали контрафактные микросхемы FTDI, по этой причине преобразователи USB-UART на их основе были одними из самых распространенных на таких сайтах, как ebay или aliexpress. И разработчики были рады строить на них свои решения, взять хотя бы ту же поддержку со стороны OpenOCD. Список микросхем USB-адаптеров производства FTDI приведен ниже; те, у кого есть поддержка MPSSE, отмечены цветом.

В 2014 году FTDI выпустила обновленные драйверы, отказывающиеся работать с поддельными устройствами[ Л13 , Л14 ].

Количество предложений этих USB-UART-адаптеров с тех пор несколько уменьшилось, но они по-прежнему остаются одними из самых распространенных, доступных разработчикам.

FTDI, несмотря на отличные чипы, иногда подвергается критике за качество программного обеспечения.

Возможно, это мои кривые руки, но Имея изрядные затруднения при работе с libMPSSE из-под .

NET, я написал свой аналог этой библиотеки на C# [ Л15 ].

Если кто-то из читателей знает адекватную альтернативу чипам FTDI, недорогую и при этом корректно поддерживаемую OpenOCD, буду благодарен за информацию.



MIPSfpga и внутрисхемная отладка



Схема USB-модуля

Ниже приведен фрагмент схемы отладочной платы Pinboard II; в вашем случае схема модуля может отличаться.

Основным определяющим параметром для нас является возможность прямого доступа к портам микросхемы: для работы достаточно одного свободного канала MPSSE (для TCK, TDI, TDO, TMS) + 1 выход GPIO для сигнала сброса (SRSTn).

Для второго канала микросхемы функционал MPSSE не требуется; однако его удобно использовать для UART-взаимодействия с отлаживаемой системой.

Выводы микросхемы FTDI напрямую подключены к портам FPGA. Строго говоря, это нарушение[ Д7 , Д6 ], поскольку предполагается, что там должны быть установлены подтягивающие, понижающие или последовательные резисторы.

У меня и без них все работает: внимательно проверяем настройки портов ввода/вывода, проверяем ограничение максимального тока на портах FPGA, используемых для EJTAG. Напряжение на выводах адаптера выставлено на уровне 3,3В.

В случае с Pinboard II для выбора этого напряжения предусмотрена отдельная перемычка (VCCIO_PWR_SEL).

Для других плат — ориентируйтесь на их схемы и настройки ПЛИС; в некоторых случаях может потребоваться модификация адаптера (что проще) и/или схемы преобразования уровней [ Л16 ] (что сложнее и может привести к помехам или снижению скорости).



MIPSfpga и внутрисхемная отладка



Типичное соединение EJTAG

Типичная схема подключения интерфейса EJTAG взята из [ Д6 ].

Дополнительные входы DINT и TRSTn в этой конфигурации не используются.

Соответствие остальных приведено в таблице.



MIPSfpga и внутрисхемная отладка

Таблица подключения USB-модуля к ПЛИС

MIPSfpga и внутрисхемная отладка



Конфигурационные файлы ( на GitHub )

mipsfpga_ftdi.cfg
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

# # OpenOCD config for using FT2232D that is directly connected # to FPGA as MIPSfpga EJTAG debugger # Any FTDI USB IC with MPSSE support (required) can be used # # 2017, Stanislav Zhelnio # # ########################################################## # interface part # ########################################################## # interface, transport and channel setup # (use zadig to install WinUSB driver instead of FTDI one) interface ftdi transport select jtag ftdi_channel 0 ftdi_vid_pid 0x0403 0x6010 # ftdi MPSSE initial value and direction # for detailed description of Magic Numbers look at # connection table and FTDI AppNote AN_108: # chapter 2.1 Data bit Definition ftdi_layout_init 0x0018 0x081b # special signals # described in OpenOCD User’s Guide: # chapter 8.2 Interface Drivers (ftdi) # chapter 9 Reset Configuration # nTRST is not used ftdi_layout_signal nSRST -data 0x0010 -oe 0x0020 ftdi_layout_signal LED -ndata 0x0800 -oe 0x0800 # speed setup # decrease when errors adapter_khz 10000 # ########################################################## # target part # ########################################################## # reset delays # described in OpenOCD User’s Guide: # chapter 9 Reset Configuration adapter_nsrst_delay 100 jtag_ntrst_delay 100 # reset sygnal config # nSRST is directly connected to MIPSfpga (~SI_ColdReset) wire reset_config srst_only separate srst_nogate srst_push_pull # To check connection and scan EJTAG chain uncomment this # and comment all that is bellow then 'shutdown' command. # Use IDCODE value to detect connection errors: # IDCODE that was set in RTL config should be identical # to -expected-id result in 'shutdown' output. # The IDCODE structure is described in EJTAG Specification: # chapter 6.5.1 Device Identification (ID) Register #shutdown # tap connector and target creation # change -expected-id to your IDCODE value # for other arguments see at OpenOCD User’s Guide jtag newtap auto0 tap -expected-id 0x000f1005 -irlen 5 -ircapture 0x1 -irmask 0x1f target create auto0.tap mips_mAptiv -endian little -chain-position auto0.tap # tap configuration # change params acording to compile and memory settings # for details see at OpenOCD User’s Guide auto0.tap configure -work-area-phys 0xa0003ff00 -work-area-size 256 -work-area-backup 0 # EJTAG scan perion mips32 scan_delay 20000 # run the debugger process and wait for gdb connection init

  • основной и единственный файл конфигурации OpenOCD;
  • условно можно разделить на 2 части: одна описывает связь программатора с целевой системой (интерфейсная часть), вторая — настройки, специфичные для отлаживаемого ядра (целевая часть).

    Внутри каталога OpenOCD они обычно располагаются в разных папках, но здесь для простоты объединены в одну.

c_cpp_properties.json

{ "configurations": [ { "name": "Mac", "includePath": [ "/usr/include", "/usr/local/include" ], "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } }, { "name": "Linux", "includePath": [ "/usr/include", "/usr/local/include" ], "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } }, { "name": "Win32", "includePath": [ "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*" ], "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } }, { "name": "mips-mti-elf", "includePath": [ "D:/Codescape/Toolchains/mips-mti-elf/2016.05-03/lib/gcc/mips-mti-elf/4.9.2/include/*" ], "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } } ] }

  • файл конфигурации расширения vscode-cpptools;
  • содержит информацию о расположении заголовочных файлов, необходимую для упрощения навигации по источникам и работы функции автодополнения в окне редактора VSCode.
launch.json

{ "version": "0.2.0", "configurations": [ { "name": "MIPS Load", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/program.elf", "cwd": "${fileDirname}", "miDebuggerPath": "d:/CODESC~1/TOOLCH~1/mips-mti-elf/2016.05-03/bin/mips-mti-elf-gdb.exe", "setupCommands": [ {"text": "file 'D:/mipsfpga-plus/programs/00_counter/program.elf'"}, {"text": "target remote localhost:3333"}, {"text": "set endian little"}, {"text": "monitor reset halt"}, {"text": "load"}, {"text": "br main"}, {"text": "monitor continue"} ], "customLaunchSetupCommands": [], "launchCompleteCommand": "None", "targetArchitecture": "mips" //Uncomment this to debug //,"logging": { "engineLogging": true } //or this for verbose debug //,"logging": { "engineLogging": true, "trace": true, "traceResponse": true } }, { "name": "MIPS Attach", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/program.elf", "cwd": "${fileDirname}", "miDebuggerPath": "d:/CODESC~1/TOOLCH~1/mips-mti-elf/2015.06-05/bin/mips-mti-elf-gdb.exe", "setupCommands": [ {"text": "file 'D:/mipsfpga-plus/programs/00_counter/program.elf'"}, {"text": "target remote localhost:3333"}, {"text": "set endian little"} ], "customLaunchSetupCommands": [], "launchCompleteCommand": "None", "targetArchitecture": "mips" //Uncomment this to debug //,"logging": { "engineLogging": true } //or this for verbose debug //,"logging": { "engineLogging": true, "trace": true, "traceResponse": true } } ] }

  • Конфигурационный файл VSCode, содержащий настройки запуска отлаживаемой программы;
  • в данном случае описываются два профиля запуска: «MIPS Load» — загрузка прошивки в системную память, а затем начало отладки; "MIPS Attach" - подключиться к уже прошивке системы.



Начальная настройка

  • подключите USB-модуль к ПК;
  • дождаться установки драйверов FTDI с помощью программы Zadig, сменить драйвер на канале с MPSSE на WinUSB;
  • скопируйте файл конфигурации mipsfpga_ftdi.cfg в директорию с OpenOCD;
  • если ваша схема подключения по каким-то причинам отличается от приведенной в таблице, вам необходимо пересчитать параметры инициализации OpenOCD, в частности, аргументы команды ftdi_layout_init И ftdi_layout_signal .

  • Давайте посмотрим на порядок их получения для таблицы соединений выше: 0x0018 — установить 1 в качестве начального значения на портах ADBUS3 и ADBUS4 (биты 3 и 4 соответственно); 0x081b — настроить порты ADBUS0,1,3,4, ACBUS3 как выходные (биты 0-3,4, 11).



    ftdi_layout_init 0x0018 0x081b

  • для команды ftdi_layout_signal логика та же, аргументы параметров те же -данные И -ое (выход включен) означает, что соединение осуществляется напрямую, без какого-либо буфера.

    Применение -ndata — позволяет инвертировать вывод.

  • Соответствие выводов конкретным битам приведено в разделе 2.1 приложения [ Д3 ].



Настройки на стороне MIPSFpga

  • При инициализации EJTAG-соединения отлаживаемое устройство передает на ПК значение регистра IDCODE, которое задается разработчиком в RTL-коде.

    Рекомендую задавать в этом регистре любые произвольные (ненулевые) значения, поскольку это поможет выявить ошибки подключения: если полученный при подключении IDCODE не совпадает с указанным в коде, значит где-то уже закралась ошибка .

  • формат этого регистра [ Д7 ] следующий:

    MIPSfpga и внутрисхемная отладка

  • параметры EJ_ManufID и EJ_PartNumber задаются в файле mfp_system.v;
  • проверьте и установите значения EJ_DINT и EJ_TRST_N. В рассматриваемой конфигурации они не используются для подключения:


assign EJ_DINT = 1'b0; assign EJ_TRST_N = 1'b1;



Настройки компиляции

  • убедитесь, что настройки компилятора относительно использования памяти не противоречат параметрам команды настроить в файле mipsfpga_ftdi.cfg ;
  • добавить символы отладки — параметры -g -gdwarf-2
  • установить уровень оптимизации -О0 или -O1 .

    С -O2 отладка также будет работать, но выполнение кода может не быть последовательным: указатель на исполняемую в данный момент строку кода будет «прыгать».



Тест подключения

  • открыть файл mipsfpga_ftdi.cfg и закомментируйте все команды, которые приходят после установки сигнала сброса (после сброс_конфигурации ).

    Раскомментируйте команду неисправность .

    В этой конфигурации OpenOCD подключится к отлаживаемому устройству, получит IDCODE и отключится;

  • запустите команду в консоли openocd-0.9.2.exe -f mipsfpga_ftdi.cfg
  • результатом его правильного выполнения является следующий вывод, где 0x000f1005 это ранее указанный IDCODE

    Open On-Chip Debugger 0.9.1-dev-microAptiv-dirty (2015-05-08-15:32) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html adapter speed: 10000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 srst_only separate srst_nogate srst_push_pull connect_deassert_srst shutdown command invoked Info : clock speed 10000 kHz Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!! Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x000f1005 .

    " Warn : AUTO auto0.tap - use ".

    -irlen 5" Warn : gdb services need one or more targets defined

  • проверьте, что полученное значение соответствует именно тому, которое было ранее указано в RTL-коде ( mfp_system.v );
  • если значения расходятся, необходимо найти и устранить ошибку подключения.

    Возможно, вам придется замедлиться.

    В моем случае, например, помехи были вызваны щупами подключенного логического анализатора;

  • После успешного получения правильного значения IDCODE файл можно вернуть в исходное состояние.



Отладка в консольном режиме

  • бегать openocd-0.9.2.exe -f mipsfpga_ftdi.cfg .

    Иногда при внезапной потере соединения OpenOCD может зависнуть, поэтому я предпочитаю запускать его в отдельном окне терминала.

  • Следующий вывод верен, после чего OpenOCD не прерывается и ждет соединения от gdb:

    Open On-Chip Debugger 0.9.1-dev-microAptiv-dirty (2015-05-08-15:32) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html adapter speed: 10000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 srst_only separate srst_nogate srst_push_pull connect_deassert_srst scan delay: 20000 nsec running in fast queued mode Info : clock speed 10000 kHz Info : JTAG tap: auto0.tap tap/device found: 0x000f1005 (mfg: 0x002, part: 0x00f1, ver: 0x0)

  • В отдельном окне терминала запустите gdb: mips-mti-elf-gdb -q program.elf и сделать некоторую отладку

    > mips-mti-elf-gdb -q program.elf Reading symbols from program.elf.done.

  • подключение к отлаживаемой системе

    (gdb) target remote localhost:3333 Remote debugging using localhost:3333 0xbfc00000 in ?? ()

  • установка целевого порядка байтов

    (gdb) set endian little The target is assumed to be little endian

  • выключение системы

    (gdb) monitor reset halt JTAG tap: auto0.tap tap/device found: 0x000f1005 (mfg: 0x002, part: 0x00f1, ver: 0x0) target state: reset entered debug state at PC 0xbfc00000, target->state: halted target state: halted target halted in MIPS32 mode due to debug-request, pc: 0xbfc00000

  • загрузка прошивки

    (gdb) load Loading section .

    text_ram, size 0x260 lma 0x80001000 Loading section .

    init, size 0x24 lma 0x80001260 Loading section .

    fini, size 0x1c lma 0x80001284 Loading section .

    eh_frame, size 0x4 lma 0x800012a0 Loading section .

    data, size 0xc lma 0x800012a4 Loading section .

    ctors, size 0x8 lma 0x800012b0 Loading section .

    dtors, size 0x8 lma 0x800012b8 Loading section .

    jcr, size 0x4 lma 0x800012c0 Loading section .

    reset, size 0x280 lma 0x9fc00000 Start address 0xbfc00000, load size 1348 Transfer rate: 12 KB/sec, 149 bytes/write.

  • установка точки останова при входе в основную функцию

    (gdb) b main Breakpoint 1 at 0x800011e0: file main.c, line 14.

  • запуск кода для выполнения

    (gdb) c Continuing. entered debug state at PC 0x800011e0, target->state: halted [Remote target] #1 stopped. main () at main.c:14 warning: Source file is more recent than executable. 14 {

  • получение значений регистров после остановки

    (gdb) i r zero at v0 v1 a0 a1 a2 a3 R0 00000000 deadbeef 800011e0 00000010 00000000 00000002 80001000 00000000 t0 t1 t2 t3 t4 t5 t6 t7 R8 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef s0 s1 s2 s3 s4 s5 s6 s7 R16 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef t8 t9 k0 k1 gp sp s8 ra R24 deadbeef deadbeef deadbeef deadbeef 800092a8 80040000 00000000 9fc00274 status lo hi badvaddr cause pc 00400000 00000100 00000000 c0000000 00000008 800011e0 (gdb)



Настройка VSCode

  • скачайте и установите код Visual Studio [ Л17 ];
  • запустите, перейдите в раздел расширений, установите расширение vscode-cpptools [ Л11 ];
  • откройте в VSCode каталог (так называемый каталог рабочей области), содержащий исходные коды отлаживаемой программы;
  • в корне каталога рабочей области создайте папку .

    vscode, скачайте и поместите в нее файлы c_cpp_properties.json И launch.json ;

  • откройте эти файлы и скорректируйте пути к заголовочным файлам, gdb, а также файлу elf, который предполагается загрузить в отлаживаемую систему;
  • Я столкнулся с небольшой ошибкой, из-за которой мне пришлось явно указывать полный путь к файлу elf.


Отладка в VSCode

  • предполагается, что компиляция уже завершена и файл elf находится там, где задано настройками launch.json ;
  • бегать openocd-0.9.2.exe -f mipsfpga_ftdi.cfg аналогично тому, как было описано выше;
  • в интерфейсе VSCode перейдите на панель «Отладка», выберите профиль отладки MIPS-загрузка ;
  • начать отладку;
  • если все настроено правильно, окно VSCode будет выглядеть примерно так, как показано на скриншоте ниже;
  • Несмотря на то, что интерфейс VSCode не имеет специализированных представлений для просмотра инструкций сборки, просмотра памяти и регистров, эту информацию можно получить в консоли отладки, обратившись напрямую к gdb. Для этого используйте команду -исполнительный .

    Например: -exec я р

  • если что-то пошло не так, раскомментируйте раздел «логи» в файле launch.json и выполните анализ ошибок в консоли отладки (открывается с помощью сочетания клавиш ( Ctrl + ` );


MIPSfpga и внутрисхемная отладка



Благодарности

Автор выражает благодарность команде переводчиков учебников Дэвиду Харрису и Саре Харрис».

Цифровая схемотехника и компьютерная архитектура ", компании Технологии воображения за академическую лицензию на современное процессорное ядро лично Юрию Панчулу ЮрийПанчул за его работу по продвижению MIPSfpga, а также ДИХАЛЬТ за отладочную плату, которая уже несколько лет не сходит с поверхности моего стола.



Ссылки

[Л1] — Как начать работу с MIPSfpga ; [Л2] — Проект MIPSfpga-plus на github ; [Л3] — Плата FPGA Terasic DE10-Lite ; [Л4] — Совет по развитию Pinboard II ; [Л5] — Сайт компании ФТДИ ; [Л6] — JTAG-интерфейс? - Это очень просто! [Л7] — EJTAG: приманка для хакеров ; [Л8] — OpenOCD: руководство пользователя (перевод) ; [Л9] — Википедия.

gdbserver ; [Л10] — Документация VSCode: отладка ; [Л11] — Документация VSCode: C/C++ для VS Code ; [Л12] — Кодовый ландшафт MIPS SDK ; [Л13] — FTDI наносит ответный удар ; [Л14] — Возрождение FTDI в картинках ; [Л15] — MPSSELight. Облегченная библиотека .

net MPSSE ; [Л16] — Согласование логических уровней устройств 5 В и 3,3 В.

[Л17] — Код Visual Studio ;

Документация

[Д1] — Технический паспорт FTDI FT2232D ; [Д2] — Рекомендации по применению FTDI AN 135. Основы FTDI MPSSE ; [Д3] — Замечания по применению FTDI AN 108. Командный процессор для режимов эмуляции главной шины MPSSE и MCU. ; [Д4] — Разработка программного обеспечения FTDI. Руководство программиста D2XX ; [Д5] — Отладка с помощью GDB. Codescape GNU Tools 2016.05-03 для MIPS MTI Bare Meta ; [Д6] — Руководство интегратора семейства процессоров MIPS32 microAptiv UP Core ; [Д7] — Спецификация EJTAG. Номер документа: MD00047 ; [Д8] — Руководство пользователя OpenOCD для версии 0.8.0 ; [Д9] — Использование коллекции компиляторов GNU. Codescape GNU Tools 2016.05-03 для MIPS MTI Bare Metal ; [Д10] — Руководство по началу работы с MIPSfpga ;

Изображений

[П1] Основные элементы системы ; [П2] Характеристики микросхем USB-адаптеров FTDI (источник: Л5 ); [С3] Фрагмент принципиальной схемы отладки Теги: #FPGA #микроэлектроника #verilog #mipsfpga #mipsfpga #mips #mips #Системный анализ и проектирование #Системное программирование #FPGA #Программирование микроконтроллеров
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.