Отладка аппаратно-программного обеспечения реконфигурируемых систем на кристалле семейства A7 фирмы Triscend
Использование эффективных средств отладки и верификации протекающих программно-аппаратных процессов значительно ускоряет цикл проектирования устройств цифровой обработки сигналов. Особенно это характерно для устройств класса «реконфигурируемая система на кристалле» [1, 2], объединяющей в себе такие узлы, как микропроцессор, память, массив программируемой логики, набор периферийных устройств, соединенные несколькими внутренними шинами обмена.
Всостав системы на кристалле A7 фирмы Triscend входит встроенный контроллер JTAG-интерфейса, подключаемый через внешний аппаратный модуль к компьютеру, на котором происходит разработка аппаратного и программного обеспечения. Контроллер JTAG-интерфейса способен исполнять роль мастера шины и применяется совместно с внешними инструментальными средствами для отладки целевого программного и аппаратного обеспечения, обеспечивая при этом следующие возможности:
- управление основными состояниями системы на кристалле;
- обеспечение пошагового выполнения инструкций процессорного ядра ARM7TDMI;
- задание аппаратных точек останова;
- загрузка аппаратно-программной конфигурации в различные виды памяти (как внутренней, так и внешней);
- просмотр и модификация содержимого памяти (как внутренней, так и внешней), системных регистров, регистров процессора и адресных селекторов.
Тестирование и отладку системы на кристалле А7 можно проводить и традиционными средствами, однако встроенные аппаратные ресурсы позволяют это делать значительно эффективнее.
Система на кристалле А7 для целей отладки имеет два независимых блока прерываний по контрольным точкам (breakpoint unit — BPU):
- cобственно BPU устройства А7, включающий две независимые аппаратные точки останова, называемые tracepoint, с возможностью ведения журнала пересылок (транзакций) trace. При этом возможно отслеживание разнообразных транзакций как на системной шине (CSI Bus), так и на локальной шине процессора (Local Bus). Этот блок конфигурируется в пункте меню Tracepoint Dialog утилиты FastChip Device Link (FDL);
- блок точек останова из состава ядра ARM7TDMI (согласно спецификации ARM EmbeddedICE). Он также обеспечивает две независимые аппаратные точки останова, но при этом анализируются транзакции только на внутренней локальной шине ARM. Этот блок конфигурируется в пункте меню Breakpoint Dialog утилиты FastChip Device Link (FDL).
Наиболее развитым из блоков отладки является собственный BPU устройства А7, который позволяет в реальном времени обнаруживать следующие условия:
- совпадение состояния шины (Address Bus) с заданным разработчиком значением регистра Address Compare, с учетом ограничений задаваемой в регистре маскирования Address Mask;
- совпадение состояния шины данных (Data Bus) с аналогичными задаваемыми параметрами Data Compare и Data Mask.
Для целей отладки можно определить как режим обнаружения совпадений условий 1 и 2 (Match), так и несовпадения (Not Match), при котором производится увеличение счетчика Count выбранных признаков тестирования. Установка внутреннего триггера останова по контрольной точке (TPEvent) происходит в простейшем случае при установке триггера Tracepoint, что достигается при совпадении содержимого счетчика Count и заданного разработчиком значения TPCounter. Кроме этого, аппаратный блок отслеживает задаваемые конкретные типы транзакций. Для системной шины (CSI Bus), процессы на которой протекают с арбитражем нескольких активных ведущих устройств, может быть задана и раздельно обнаружена любая транзакция из таблице 1. В зависимости от задачи отладки разработчик может выбрать для анализа интересующий вид транзакции. Для внутренней локальной шины процессора ARM может быть задано обнаружение только транзакции чтения (CPU Read) или записи (CPU Write) процессорного ядра. Маскирование заключается в проведении поразрядной операции «И» 32-битной шины (адреса или данных) и регистра маски. Единица в соответствующем разряде регистра маски приводит к участию этого разряда шины в сравнении с регистром (Address Compare или Data Compare), если же разряд регистра маски равен нулю, то этот бит шины исключается из сравнения. Например, для исключения из анализа на точку останова содержимого шины данных необходимо задать значения регистров Data Compare и Data Mask равными нулю. Такой механизм позволяет задавать сложные условия обнаружения состояний шин адреса и данных. Упрощенная блок-схема одного канала узла аппаратной точки останова приведена на рис. 1.
При обнаружении заданных условий отладки устанавливается триггер контрольной точки TPEvent, что вызывает заранее заданную разработчиком реакцию (см. табл. 2). С целью отладки может быть выбран любой набор условий поведения системы на кристалле при установленном триггере, но реакция 3 и 4 не может быть задана одновременно, что является очевидным, так как процессор не может вызывать прерывания в режиме останова.
Как было отмечено выше, в состав встроенного BPU системы A7 входит две независимые точки останова Tracepoint0 и Tracepoint1, при этом логика установки триггера TPEvent допускает условную работу с целью выработки нетривиального сигнала останова. Так, например, разработчик может выбрать режим, при котором контрольная точка Tracepoint0 разрешает работу контрольной точки Tracepoint1, при этом формирование триггера TPEvent будет задано следующим работающим в реальном времени алгоритмом:
Отладчик BPU A7 позволяет аппаратно накапливать в реальном времени информацию о происходящих на системной шине транзакциях, определенных условиями контрольных точек. Для хранения такой информации организуется журнал, располагающийся в старших 8 кбайтах встроенной оперативной памяти на кристалле. Чтение этого журнала производится по инициативе разработчика при отладке системы.
Анализ встроенного в А7 устройства BPU и его практическое использование позволяет сделать заключение об эффективности интегрированных инструментальных средств для отладки не только программного (исполняемого кода процессора ARM), но и аппаратного (конфигурации матрицы программируемой логики CSL) окружения. Так, JTAG-модуль позволяет производить чтение и запись не только произвольного адреса памяти, но и чтение и возможную модификацию цепей во встроенной матрице программируемой логики. Для динамических процессов в матрице CSL такой асинхронный мониторинг имеет прежде всего качественный результат — например, можно узнать, работает ли размещенный в матрице FPGA счетчик, периодически считывая его значение по запросу из программного средства отладки. В случае же останова системы на кристалле по контрольной точке разработчик имеет возможность провести анализ статической картины сигналов внутри матрицы CSL.
Для иллюстрации вышесказанного проведем отладку программно-аппаратного проекта для реконфигурируемой системы на кристалле А7. Разместим в матрице программируемой логики (CSL) кристалла A7 восьмиразрядный счетчик Counter, на тактовый вход которого поступает системная частота. Выходы этого счетчика CountData[7:0] подключены ко входам программно-доступного регистра StatusReg, содержимое которого будет считываться программным обеспечением. В момент обращения к данному регистру сформируем выходной сигнал на выводе LedOut для индикации работы. При реализации проекта воспользуемся готовыми библиотечными аппаратными модулями, предоставляемыми системой проектирования FastChip (на рис. 2, а изображена конфигурация и электрические связи счетчика Counter, на рис. 2, б и в — программно доступного регистра StatusReg и выходного элемента LedOut соответственно). На рис. 3 взаимосвязи указанных модулей отражены в САПР FastChip. Заметим, что конфигурацию аппаратной части можно определить и на языке описания аппаратуры (VHDL, Verilog) — это не отразится на процессе отладки.
После проведения этапов размещения и разводки в среде FastChip будет образован файл конфигурации аппаратной части debug.csl. Также в FastChip производится генерация заголовочного файла debug.h, в котором содержатся адресные константы, в нашем случае в нем содержится адрес регистра StatusReg:
Разработку программного обеспечения для ядра процессора ARM выполним на языке высокого уровня С:
В заголовочном файле debug.h определен адрес программно-доступного регистра StatusReg, программа в бесконечном цикле считывает этот регистр и формирует результат, умножая его значение на 1000. В результате компиляции получаем файл debug.hex, содержащий исполняемый код для ядра ARM.
С целью иллюстрации процесса отладки программное и аппаратное обеспечение имеет простейший вид, аппаратная реализация занимает менее 0,5% отведенных ресурсов кристалла TA7S20-60QC, а программное обеспечение функции main() транслируется в 28 байт кода. При помощи утилиты FastChip Device Link (FDL), входящей в пакет FastChip, производится создание и загрузка по JTAG-интерфейсу конфигурационного файла debug.cfg, объединяющего в себе аппаратную конфигурацию debug.csl и исполняемый код debug.hex. Также при помощи этой утилиты будем производить отладку проекта.
Пусть цель отладки состоит в останове и анализе процессов в системе на кристалле после трех программных считываний регистра StatusReg. Заметим, что значения счетчика Counter изменяется непрерывно с системной тактовой частотой, программный же цикл состоит из нескольких периодов тактовой частоты, число которых связано со многими факторами (настройки компилятора, оптимизация, тип и быстродействие внешней памяти, настройка кэш-памяти и т. д.), поэтому можно утверждать, что последовательные считывания из регистра StatusReg не будут отличаться на единицу (за аппаратным счетом не угнаться даже ARM).
Загрузим файл debug.cfg в целевое устройство, затем при помощи осциллографа измерим периодичность сигнала обращения к программно-доступному регистру StatusReg. При системной частоте 40 МГц программный цикл, включающий считывание регистра и умножение на 1000, прокручивается за 350 нс. Во время обращения к регистру на выводе системы на кристалле формируется импульс положительной полярности с длительностью один такт частоты синхронизации (25 нс). Далее, в утилите FDL настроим параметры точки останова как показано на рис. 4. В целях отладки мы анализируем следующие параметры:
- обращения ядра ARM по чтению (ARM Read);
- обращение по адресу 0x100ffffc (регистр StatusReg, реализованный в матрице CSL) с учетом всех разрядов Address Mask = 0xFFFFFFFF;
- значение шины данных любое (Data Compare = Data Mask = 0xFFFFFFFF);
- включаем триггер события TPEvent по накоплению трех описанных транзакций (Count = 3);
- при обнаружении условий контрольной точки останавливаем процессор (CPU Freeze).
После определения этих настроек и пересылки их по JTAG-интерфейсу в целевое устройство, отладчик практически мгновенно переводит систему A7 в режим останова, тем самым сигнализируя, что заданные условия достигнуты. Произведем чтение аппаратного журнала трассировки (его содержимое отражено на рис. 5). Заметим, что информация этого журнала накапливалась в режиме реального времени в целевом устройстве, внешние инструментальные средства только задавали конфигурацию накопления. Журнал трассировки TraceDump содержит разнообразную исчерпывающую информацию о виде транзакции, состояния шин в момент пересылки, размеров пересылаемых данных и т. д. В частности, анализируя конкретный журнал событий, можно сделать следующие выводы:
- было проведено три операции чтения байта по адресу 0x100ffffc;
- ввиду синхронности шины чтение производилось за два такта: на первом такте установка адреса, на втором — снятие данных;
- ядро ARM обращалось к непосредственным данным, минуя кэш-память;
- последовательные значения счетчика системной частоты, доступного через регистр, составляли 0xFD, 0x0B, 0x19.
Легко можно подсчитать, что за время одного программного цикла (350 нс), внутренний аппаратный счетчик увеличивает свое значение на 0×19 – 0×0B = 14, следовательно, период системной частоты равен 350 нс/14 = 25 нс, что с точностью до осциллографических измерений указывает на системную тактовую частоту 40 МГц.
Встроенный в систему на кристалле A7 блок отладки обладает возможностью проводить мониторинг системных регистров, регистров процессора, адресных селекторов и что особо интересно — диагностику состояния электрических сигналов в матрице CSL. На рис. 6 приведено содержимое окна отладки (Debug watch), при этом видно, что в качестве объектов отладки выступают не только традиционные регистры, но и электрические цепи, как заданные на этапе проектирования (CountData[7:0]), так и определяемые как результат машинного синтеза и реализации алгоритма функционирования (Counter.sum[7:0], Counter.carry[6:0]). Инструментальные средства отладки позволяют на этапе загрузки проекта в целевое устройство вычленить список цепей, регистров и других встроенных или синтезируемых объектов и предоставить их разработчику для выбора.
Модель взаимодействия микроконтроллера со встроенным отладчиком и работа под управлением внешней программной среды отладки достаточно удачно отражена в литературе [4]. Безусловно, как отмечено авторами [4], снаружи системы на кристалле имеется еще один процесс — внешний отладчик, который решает задачи управления, задания режимов встроенного отладчика, выполняя инструкции разработчика-пользователя. Для системы на кристалле Triscend A7 такой внешний отладчик выполнен по клиент-серверной технологии, сервером при этом является программное ядро, называющееся MultiJTAG Server, непосредственно имеющее низкоуровневый контакт со встроенным блоком отладки A7, а клиентское приложение, в частном случае FDL, позволяет задавать высокоуровневые команды и визуализировать ответы. Приведенные рис. 4, 5, 6 — это и есть виды клиентского интерфейса, входящего в состав системы проектирования FastChip. При этом разработчик может самостоятельно, преследуя собственные цели тестирования и отладки, написать свое клиентское приложение, поскольку высокоуровневый интерфейс общения с сервером не является закрытым и хорошо отражен в документации. Например, на ранних стадиях отладки системы ввода и обработки изображений при помощи инструментального JTAG интерфейса на головной компьютер производилась передача достаточно больших объемов данных. В подобных случаях, когда отсутствует возможность внутрисхемной отладки, разработчик вынужден часть ресурсов контроллера (таких, как время, память, последовательный порт и т. д.) выделять под цели тестирования, формировать свой отладочный монитор, что приводит к временным и аппаратным издержкам. В нашем же случае для работы встроенного отладчика никакой программной поддержки со стороны процессорного ядра не требуется, более того, программная часть вообще может отсутствовать.
Рассмотрим далее кратко второй блок отладки, входящий в состав системы на кристалле Triscend A7, — отладчик из состава ядра ARM7TDMI, выполненный согласно спецификации ARM EmbeddedICE [3]. Его возможности по сравнению с предыдущим блоком скромнее, он обеспечивает анализ транзакций только по локальной шине ARM при выборке кода или пересылке данных. Механизм маскирования значений шины адреса и данных подобен вышеописанному, что позволяет избирательно формировать условия останова.
Основное достоинство этого блока заключается в его стандартности, широко распространенной спецификации. Это позволяет использовать для работы с ним отладочные средства сторонних производителей, что является актуальным прежде всего для отладки программного обеспечения. Ниже рассмотрим пример конфигурации отладчика AXD Debugger из состава среды проектирования Arm Developer Suite (ADS) для работы с системой на кристалле Triscend A7. Отладчик AXD обеспечивает:
- работу в реальном времени с точками останова, определяемыми по состоянию шин адреса и данных;
- пошаговый режим работы;
- полный доступ и управление состояниями ядра ARM;
- полный доступ к содержимому памяти и устройств ввода-вывода.
При помощи AXD можно провести и программную симуляцию работы процессора, однако наибольший интерес представляет режим аппаратной внутрисхемной отладки при непосредственной работе с целевой платой. Взаимодействие отладчика с интегрированными инструментальными средствами происходит через MultiJTAG Server при помощи свободно распространяемой библиотеки TriscendA7.dll (она доступна на сайте фирмы Triscend www.triscend.com). Такой способ взаимодействия обусловлен тем, что кроме собственно ядра ARM в системе на кристалле А7 имеется механизм управления картой памяти, а также несколько видов системного сброса, что требует специфического управления. На рис. 7 приведено окно конфигурации библиотеки TriscendA7.dll для работы в составе AXD. После настройки отладчика и запуска целевой программы на выполнение разработчик может задавать точки останова, просматривать и изменять содержимое памяти. На рис. 8 представлен вид окна при отладке приведенной выше тестовой программы, в строке 10 разработчиком задана точка останова и при ее достижении производится анализ программного состояния. Разработчик может включить пошаговый режим и просмотреть содержимое всех банков регистров ядра ARM. Представляет интерес дизассемблированный код тестовой программы. Как видно из рис. 8, компилятор произвел умножение считанного из регистра StatusReg значения на 1000 без применения встроенной команды умножения. В системах реального времени для критических участков необходимо анализировать получаемый машинный код с целью оптимизации временных характеристик. Также из окна отладчика видно, что операция присвоения на языке высокого уровня (Result = Flag) в машинном коде оказалась вырожденной, то есть ей не соответствует никаких низкоуровневых инструкций.
Таким образом, встроенные средства отладки системы на кристалле A7 обеспечивают широкие возможности внутрисхемной отладки и позволяют автоматизировать тестирование аппаратуры и программного обеспечения. При этом максимум внимания разработчик уделяет основной цели тестирования — выработке эффективных воздействий на систему с целью диагностики ее функционирования, а не созданию инструментов отладки. Опыт реального проектирования 32-разрядной системы на кристалле [5] для целей формирования и ввода изображений отражает значительное ускорение разработки при использовании встроенных инструментальных средств.
Литература
- Е. К. Александров, Р. И. Грушвицкий, М. С. Куприянов и др. / Под общ. ред. Д. В. Пузанкова. Микропроцессорные системы: Учебное пособие для вузов. СПб.: Политехника. 2002.
- А. К. Цыцулин. Телевидение и космос: Учебное пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ». 2003.
- Application Note 28 The ARM7TDMI Debug Architecture ARM DAI 0028A. http://www.arm.com.
- А. Ключев, А. Платунов. Встроенные инструментальные средства современных микроконтроллеров // Электронные компоненты. 2002. № 7.
- В. Березин, Р. Золотухо. 32-разрядная реконфигурируемая система на кристалле фирмы Triscend // Компоненты и технологии. 2003. № 4.