Высокопроизводительное процессорное ядро SCR6 для встроенных применений с набором команд RISC-V и поддержкой многоядерных конфигураций
Общие сведения
Программа для ЭВМ «Высокопроизводительное процессорное ядро SCR6 для встроенных применений с набором команд RISC-V и поддержкой многоядерных конфигураций» (далее по тексту ПО SCR6) представляет собой реализацию процессора архитектуры RISC-V микроконтроллерного класса для встроенных применений.
ПО SCR6 предназначено для работы в составе систем на кристалле (СнК), реализованных непосредственно в кремнии или в программируемых логических интегральных схемах (ПЛИС), и может применяться в одноядерных и многоядерных конфигурациях.
ПО SCR6 является сложным функциональным СФ-блоком (Soft IP), передаваемым потребителю в виде описания на высокоуровневом языке описания аппаратуры SystemVerilog для дальнейшего использования в программах автоматизированного синтеза логических схем с привязкой к конкретной технологии ASIC или ПЛИС.
ПО разрабатывается с использованием собственных мощностей и ресурсов. Цена является договорной, размер вознаграждения за право использования зависит от конфигурации ПО. Обновление ПО производится силами разработчика.
Функциональные характеристики
ПО SCR6 реализует собой 64-х разрядный процессор архитектуры RISC-V микроконтроллерного класса, предназначенный для использования в составе различных встраиваемых и других систем.
Программа обеспечивает выполнение арифметических и логических операций с целочисленными операндами и поддерживает 16- и 32-битные инструкции и 64/32/16/8-битные операнды.
Основные функциональные характеристики ПО SCR6:
- Гарвардская архитектура (раздельные шины команд и данных);
- Поддержка симметричной многопроцессорности (SMP) и межъядерного взаимодействия с настраиваемой конфигурацией от 1 до 4-х процессорных ядер в кластере;
- Набор команд: RV64IMСAFD
- базовый набор с целочисленными операциями, 64-битный (RV64I);
- команды операций целочисленного умножения и деления (М расширение);
- команды компактного формата для увеличения плотности кода (16-битовые, С расширение);
- опциональная поддержка атомарных операций (А расширение);
- арифметические операции с плавающей точкой над числами одинарной точности (Single-Precision Floating-Point, F расширение);
- арифметические операции с плавающей точкой над числами двойной точности (Double-Precision Floating-Point, D расширение);
- Два уровня привилегированности и соответствующих им режимов исполнения команд: машинный уровень (режим M-mode) и пользовательский уровень (режим U-mode);
- Многоуровневый конвейер с реализацией внеочередного исполнения команд;
- Конфигурируемая подсистема памяти:
- контроль доступа к физической памяти с помощью модуля защиты памяти (MPU - Memory Protection Unit);
- опциональная поддержка памяти быстрого доступа (ТСМ, Tightly-Coupled Memory) до 512 Кб;
- опциональная поддержка кэш команд уровня L1 размером от 8 до 64 Кб;
- опциональная поддержка кэш данных уровня L1 размером от 8 до 64 Кб;
- опциональная поддержка кэш данных уровня L2 размером до 2 Мб на кластер;
- Поддержка конфигурируемого контроллера прерываний уровня платформы (PLIC) с возможностью приема большого количества внешних запросов прерываний (до 1023) и с динамическим заданием (изменением) приоритета прерываний;
- Встроенный 64-битовый таймер часов реального времени (Real Time Clock) с настраиваемым коэффициентом деления;
- Встроенный контроллер отладки с поддержкой аппаратных точек останова, совместимый со стандартом IEЕЕ 1149.1-2001 (JTAG);
- Конфигурируемый внешний интерфейс, совместимый с шиной AXI (Advanced extensible Interface) с поддержкой когерентности в многоядерной системе - расширение ACE (AXI Coherency Extensions).
Состав ПО
ПО SCR6 в базовой конфигурации, реализующей архитектуру RV64IMСAFD включает в себя:
- Исходный код на языке SystemVerilog, пригодный для моделирования и синтеза;
- Исходный код тестового окружения (Testbench) для выполнения функциональной верификации до и после синтеза;
- Наборы скриптов для проведения моделирования и синтеза с файлами входных ограничений в формате (.sdc).
- Комплект разработчика на базе ПЛИС (SCR6 SDK):
- пример проекта СнК на основе ПО SCR6;
- образы загрузки ПЛИС и объектных модулей прикладного ПО для выполнения на ядре SCR6.
- Инструментальные средства разработки:
- набор инструментальных средств, основанных на GCC 8.x, 9.x: компилятор, отладчик, компоновщик, функциональный симулятор, бинарные утилиты binutils, newlib, openocd;
- IDE на базе Eclipse (для Linux и Windows).
- Прикладное ПО:
- начальный загрузчик;
- набор архитектурных тестов и тестов совместимости;
- примеры простых приложений (baremetal) и тестов производительности;
- Сопроводительная документация:
- спецификация внешней архитектуры ПО SCR6 (SCR6 EAS);
- руководство пользователя ПО SCR6 (SCR6 UM);
- руководство по системе команд (SCR6 ISM);
- руководство на комплект разработчика (SCR6 SDK);
- руководство по инструментам разработчика (SCRx development tools);
- руководство на тестовое окружение.
Требования к работе с ПО
Типом реализующей ЭВМ для ПО SCR6 является Система-на-Кристалле (СнК) в составе полузаказных интегральных микросхем или программируемых логических интегральных схем (ПЛИС).
При реализации собственных функционально законченных СнК пользователь должен самостоятельно дополнить основу (микропроцессорную структуру ПО SCR6) необходимыми ему дополнительными модулями в виде отдельных IP-ядер или инфраструктурами IP-ядер.
Для логического синтеза и функциональной верификации ПО SCR6 в составе СнК, пользователю предоставляется набор средств разработки “SCR6 SDK” для физического прототипирования на ПЛИС, основными компонентами которого являются:
- пример проекта СнК для ПЛИС на основе ПО SCR6;
- предварительно собранные образы процессорного ядра ПО SCR6 и начального загрузчика;
- тестовое программное обеспечение для проверки работоспособности ПО SCR6.
Необходимое обеспечение для работы с ПО SCR6
Для работы с ПО SCR6 необходимо следующее обеспечение:
- Персональный компьютер (ПК) с объёмом оперативной памяти не менее 8 Гб.
- Установленные на ПК программы:
- ОС Windows или Linux;
- пакет программ Xilinx Vivado WebPack Edition версии не ниже 2018.1 (скачивается бесплатно после регистрации на сайте xilinx.com);
- система отладки OpenOCD.
- Отладочная плата Virtex UltraScale+ FPGA VCU118 Evaluation Kit
(https://www.xilinx.com/products/boards-and-kits/vcu118.html). - Адаптер для соединения с отладчиком OpenOCD (JTAG Cable Adapter): JTAG-HS2
(https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD-H/). - Набор стандартных кабелей типа USB Type A (m) - Type B micro (m), 3 шт. (из состава комплектов платы VCU118 и JTAG адаптера).
Компиляция ПО
Процесс компиляции образа ПО SCR6 описан в руководстве на комплект разработчика (SCR6 SDK). В состав ПО входит Zip-архив, содержащий скомпилированные образы, созданные согласно руководству на комплект разработчика пример проекта СнК на основе ПО SCR6. В следующих разделах описан процесс установки и тестирования ПО SCR6 в составе проекта СнК.
Установка ПО
Процесс установки ПО заключается в выполнении процедуры программирования конфигурационного ППЗУ (флэш) на отладочной плате, для обеспечения дальнейшей загрузки ПЛИС.
Для установки и работы с ПО SCR6 персональный компьютер подключается к отладочной плате VCU118 стандартными кабелями типа USB Type A (m) - Type B micro (m).
Подключение кабелей к отладочной плате VCU118
- Подключите один кабель "USB Type A (m) - Type B micro (m)" между хост компьютером и портом USB JTAG (J106) на плате VCU118;
- Подключите второй кабель "USB Type A (m) - Type B micro (m)" между хост компьютером и портом USB UART на плате VCU118;
- Подключите кабель источника питания (есть в комплекте платы) к разъему "Power" платы VCU118.
Это подключение выполняет три функции:
- подачу питания +12В на отладочную VCU118;
- обеспечение конфигурирования ПЛИС через USB JTAG порт;
- обеспечение функциональности консольного порта при выполнении программы на процессорном ядре SCR6 через USB UART порт.
Подключение кабелей к отладочной плате VCU118 приведено на Рисунке 1.
Рисунок 1. Подключение кабелей к отладочной плате VCU118
Последовательность действий при программировании конфигурационной флэш
- Распакуйте архив, находящийся в дереве каталогов ПО SCR6 в папке SDK:<
SDK_HOME >/images/vcu118_scr6.tar.gz. В архиве находятся два файла: vcu118_scr6.mcs, vcu118_scr6.prm. - После подачи питания на плату VCU118, запустите пакет программ Vivado на инструментальном ПК.
- Проверьте подключение кабеля USB JTAG, затем запустите утилиту «Hardware Manager» из меню или командной строки консоли Vivado. Выполните команду «Open Target» с опцией «Auto Connect», должно произойти подключение к микросхеме ПЛИС xcvu9p_0 отладочной платы VCU118 по интерфейсу JTAG.
Примечание: Если подключение не произошло (микросхемы нет в списке обнаруженных), необходимо установить необходимые USB-драйвера для ОС Windows или для ОС Linux настроить правила сервиса UDEV-rules, как описано в AR# 66440 Vivado - Linux OS - Digilent and Xilinx USB cable installation check
- Добавьте в конфигурационную цепочку для программирования микросхему конфигурационной flash. Для этого в меню «Hardware» выделите указателем «мыши» микросхему ПЛИС xcvu9p_0 и по нажатию правой кнопки «мыши» в контекстном меню указателем выберете «Add Configuration Memory Device».
- В открывшемся меню выберите (или введите) тип микросхемы flash: mt25qu01g-spi-x1_x2_x4 и нажмите OK
- На вопрос программатора ”Do you want to program the configuration memory device now?", подтвердите “OK”.
- В открывшимся диалогом окне «Program Configuration Memory Device» добавьте загрузочные файлы образов «прошивки» ПЛИС (см. выше: vcu118_scr6.mcs, vcu118_scr6.prm)
- Нажмите “OK” для запуска процесса программирования конфигурационной микросхемы flash (процесс программирования может занять несколько минут).
Примечание: Проверьте, что DIP переключатель SW16 на плате VCU118 установлен в положение выбора режима загрузки ПЛИС Master SPI
- После успешного завершения процесса программирования (можно проконтролировать по сообщениям в диалоговом окне), необходимо выйти из программы Vivado и загрузить образ «прошивки» в ПЛИС, для этого нажмите кнопку “PROG” на отладочной плате VCU118, или нажмите кнопку “CPU_RESET” на плате (см. рисунок ниже), или выключите и включите плату.
Рисунок 2: Аппаратный сброс платы VCU118
ПО SCR6 установлено и готово к работе.
Запуск тестов на процессоре SCR6 с использованием начального загрузчика
Подключение инструментального ПК к отладочной плате остается прежним, см. Рисунок 1.
-
Для загрузки и исполнения теста используется бинарный файл контрольной задачи – синтетического теста производительности процессорной системы (Dhrystone benchmark). Файл находится по следующему пути в структуре репозитория SDK:
<
SDK_HOME >/images/benchmarks.7z Распакуйте архив. В нем находится .bin-файл синтетического теста.
- Запустите терминальную программу. Возможно использование любой терминальной программы для Linux (например, minicom), или для Windows (например, teraterm).
Примечание: Для Windows потребуется установка драйвера для USB-to-UART Bridge, иструкции приведены по ссылке ниже:
https://www.silabs.com/Support%20Documents/Software/CP210x_Windows_Drivers.zipНастройте параметры последовательного порта (UART) следующим образом:
- Название последовательного порта
- для Windows - это COM4 (цифра может меняться, точную можно узнать через Диспетчер устройств, найдя в нём переходник USB-UART)
- для Linux - это /dev/ttyUSB0 (цифра может меняться, смотрите список файлов в папке /dev/)
- Bps/Par/Bits - 115200 8N1
- скорость - 115200
- количество битов в посылке - 8
- количество стоп-битов - 1
- чётность - нет
- Hardware Flow Control: No
- Название последовательного порта
- Инициируйте процесс перезагрузки ПЛИС, нажав кнопку “PROG” на отладочной плате, или подачей сигнала reset на ПЛИС, нажав кнопку “CPU_RESET” на плате (см. Рисунок 2).
- При включении платы или перезагрузке ПЛИС по аппаратному сбросу, в терминал выдается начальное приглашение загрузчика, после чего загрузчик переходит в режим ожидания команды пользователя:
SCR loader v1.3-gdf04d45 SMP Copyright (C) 2015-2020 Syntacore. All rights reserved. ISA: RV64IMAFDC [800000000014112D] IMPID: 0000000021101131 BLDID: 21101401 Platform: vcu118_scr6, cpuclk 65MHz, sysclk 65MHz SMP: incoming mailbox empty status: 8000000000000003 SMP: mailbox slots 4 (bits 2 shift 2) status 0 SMP[0]: master hart loopback slot SMP[1]: active SMP[2]: active SMP[3]: active 0: start SMP @addr 1: xload @addr v: int flash load u: int flash update g: start @addr d: mem dump m: mem modify t: mem test :
- При нажатии клавиши "SPACE" и затем комбинации клавиш "SHIFT+1" можно вывести в терминал дополнительную информацию о процессорной платформе:
SCR loader v1.3-gdf04d45 SMP (Oct 23 2021 17:12:07) Copyright (C) 2015-2020 Syntacore. All rights reserved. ISA: RV64IMAFDC [800000000014112D] IMPID: 0000000021101131 BLDID: 21101401 Platform: vcu118_scr6, cpuclk 65MHz, sysclk 65MHz L1i [00000943] 32K, 4-way, 16-byte line, enabled L1d [00002943] 32K, 4-way, 16-byte line, enabled L2 [21080500 3003e95] 512K, 8-way, 32-byte line, shared (4 cores), status: f Memory map: 0000000000000000 4G 000003FE DDR FFFFFFFFF0000000 128K 000003FE TCM FFFFFFFFF0040000 8K 00030006 MMCFG FFFFFFFFFE000000 16M 00010186 PLIC FFFFFFFFFF000000 8M 00010186 MMIO FFFFFFFFFFFF0000 64K 0000008E On-Chip RAM MPU regions (16): 1 0000007F 0000000000000000 00FFFFFF00000000 2 000003FF FFFFFFFFF0000000 00FFFFFFFFFC0000 3 00030007 FFFFFFFFF0040000 00FFFFFFFFFFE000 4 00010187 FFFFFFFFFE000000 00FFFFFFFF000000 5 00010007 FFFFFFFFFF000000 00FFFFFFFF800000 6 0000000F FFFFFFFFFFFF0000 00FFFFFFFFFF0000 !
- Для загрузки прикладной программы (например, теста поизводительности Dhrystone benchmark) в локальную память процессора SCR6, в терминальном окне в меню загрузчика нужно выбрать "1".
- Далее необходимо ввести стартовый адрес (в шестнадцатеричном формате) для загрузки исполняемого файла в локальную память процессора SCR6, и нажать “Enter”. В терминальном окне начнут периодически выводиться символы “C”, сигнализируя готовность загрузчика принимать бинарный образ по протоколу x-modem:
xload @addr addr: 0 CCCCCCCC
Примечание: программа загрузчик (SCR bootloader), исполняемая на процессоре SCR6 использует x-modem протокол передачи файлов и поддерживает загрузку только бинарных образов с расширением .bin
- В терминальном окне minicom, нажав комбинацию клавиш "Ctrl+А" затем "S", откройте меню выбора протоколов загрузки, затем выберите “xmodem”:
+-[Upload]--+ | zmodem | | ymodem | | xmodem | | kermit | | ascii | +-----------+
- На ПК нажмите клавишу “Enter”, затем выберите .bin файл для загрузки (нужно выделить файл и нажать клавишу пробел “space”):
+--------------[Select a file for upload]---------------+ |Directory: /images/scr6 | | [..] | | dhrystone.bin | | |
- Нажмите “Enter”, начнется передача файла. dhrystone_o3lto.bin
+-----------------[xmodem upload - Press CTRL-C to quit]------------------+ |Sending dhrystone_o3.bin, 106 blocks: Give your local XMODEM |receive command now. |Bytes Sent: 13696 BPS:4164 | |Transfer complete | | READY: press any key to continue... +-------------------------------------------------------------------------+
- По окончании загрузки будет выведена статусная информация:
Xmodem successfully received 13696 bytes
Загруженная программа в память процессора SCR6 готова к исполнению.
- В терминальном окне в меню загрузчика выберите “g”, затем введите начальный адрес запуска программы 0. После этого начнется выполнение программы:
start @addr addr: 0 Dhrystone Benchmark, Version 2.1 (Language: C) ...
- После выполнения теста на процессоре SCR6, выводятся результаты:
Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Platform: SCR6 Syntacore FPGA @ 65MHz.000 MHz Compiler: GCC10.2.0 Flags: -O3 -funroll-loops -flto Execution starts, 5000 runs through Dhrystone ... Microseconds for one run through Dhrystone: 1.3 Dhrystones per Second: 737463.1
Запуск тестов на процессоре SCR6 с использованием отладчика OpenOCD
Open On-Chip Debugger (открытый отладчик для чипов) является программой с открытым исходным кодом. OpenOCD предоставляет доступ к адаптеру для отладки (JTAG debug adapter) и обеспечивает инструментарий отладки (debugging) и внутрисхемного программирования для встраиваемых систем.
Подключение JTAG кабеля адаптера OpenOCD
Подключение JTAG кабеля адаптера JTAG-HS2 к плате VCU118 к разъему J52 PMOD приведено на рисунке ниже.
Рисунок 3: Подключение JTAG кабеля адаптера OpenOCD к плате VCU118
Установка OpenOCD
Инструкции по установке OpenOCD приведены на вики-странице OpenOCD-for-sc_riscv32
Запуск сервера OpenOCD на ПК
- Настройка переменных окружения:
$ export OOCD_ROOT=<
Path to the OpenOCD installation directory > - Запуск OpenOCD сервера - вводится в одну строку (в Ubuntu):
$ sudo ${OOCD_ROOT}/bin/openocd \ -s ${OOCD_ROOT}/share/openocd/scripts/ \ -f ${OOCD_ROOT}/scripts/interface/ftdi/olimex-arm-usb-ocd-h.cfg \ -f ${OOCD_ROOT}/scripts/target/syntacore_riscv.cfg
После выполнения в текущий терминал будет выдано сообщение о подключении к ядрам RISC-V:
Open On-Chip Debugger 0.10.0+dev-01974-g3d33e05 (2019-05-22-20:30) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html none separate sw_reset_halt Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections adapter speed: 2000 kHz trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain connect_deassert_srst Info : auto-selecting first available session transport "jtag". To override use 'transport select <
transport >'. riscv.cpu3 Info : clock speed 2000 kHz Info : JTAG tap: riscv.cpu0 tap/device found: 0xdeb14001 (mfg: 0x000 (< invalid >), part: 0xeb14, ver: 0xd) Info : JTAG tap: riscv.cpu1 tap/device found: 0xdeb14001 (mfg: 0x000 (< invalid >), part: 0xeb14, ver: 0xd) Info : JTAG tap: riscv.cpu2 tap/device found: 0xdeb14001 (mfg: 0x000 (< invalid >), part: 0xeb14, ver: 0xd) Info : JTAG tap: riscv.cpu3 tap/device found: 0xdeb14001 (mfg: 0x000 (< invalid >), part: 0xeb14, ver: 0xd) Info : riscv.cpu0: datacount=4 progbufsize=6 Info : riscv.cpu0: Examined RISC-V core; found 1 harts Info : riscv.cpu0: hart 0: XLEN=64, misa=0x800000000010112d Info : riscv.cpu1: datacount=4 progbufsize=6 Info : riscv.cpu1: Examined RISC-V core; found 1 harts Info : riscv.cpu1: hart 0: XLEN=64, misa=0x800000000010112d Info : riscv.cpu2: datacount=4 progbufsize=6 Info : riscv.cpu2: Examined RISC-V core; found 1 harts Info : riscv.cpu2: hart 0: XLEN=64, misa=0x800000000010112d Info : riscv.cpu3: datacount=4 progbufsize=6 Info : riscv.cpu3: Examined RISC-V core; found 1 harts Info : riscv.cpu3: hart 0: XLEN=64, misa=0x800000000010112d Info : Listening on port 3333 for gdb connections Info : Listening on port 3334 for gdb connections Info : Listening on port 3335 for gdb connections Info : Listening on port 3336 for gdb connections - Откройте второй терминал (терминал 2) и введите команду:
$ telnet localhost 4444 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger
OpenOCD запущен и готов к работе. Терминал 2 представляет собой интерактивную консоль OpenOCD.
По команде help можно вывести список доступных команд openocd.
Загрузка и запуск на выполнение бинарных образов
- Введите следующие команды в консоли OpenOCD (Терминал 2), выполняющие остановку ядра, загрузку и запуск исполняемого кода:
> targets TargetName Type Endian TapName State -- ------------------ ---------- ------ ------------------ ------------ 0 riscv.cpu0 riscv little riscv.cpu0 running 1 riscv.cpu1 riscv little riscv.cpu1 running 2 riscv.cpu2 riscv little riscv.cpu2 running 3* riscv.cpu3 riscv little riscv.cpu3 running >reset halt; load_image dhrystone_o3.bin 0 JTAG tap: riscv.cpu0 tap/device found: 0xdeb15001 (mfg: 0x000 (<
invalid >), part: 0xeb15, ver: 0xd) JTAG tap: riscv.cpu1 tap/device found: 0xdeb15001 (mfg: 0x000 (< invalid >), part: 0xeb15, ver: 0xd) JTAG tap: riscv.cpu2 tap/device found: 0xdeb15001 (mfg: 0x000 (< invalid >), part: 0xeb15, ver: 0xd) JTAG tap: riscv.cpu3 tap/device found: 0xdeb15001 (mfg: 0x000 (< invalid >), part: 0xeb15, ver: 0xd) 13696 bytes written at address 0 downloaded 13696 bytes in 0.234904s (87.685 KiB/s) Примечание: Команда загрузки предполагает расположение файла в текущей директории. При другом расположении, имя загружаемого файла должно включать относительный путь.
- После ввода команды отображается прогресс загрузки. После завершения загрузки, образ начнет выполняться с выводом в UART терминал:
Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Platform: SCR6 Syntacore FPGA @ 65MHz.000 MHz Compiler: GCC10.2.0 Flags: -O3 -funroll-loops -flto Execution starts, 5000 runs through Dhrystone ... Microseconds for one run through Dhrystone: 1.3 Dhrystones per Second: 737463.1