Улучшенное 32-разрядное процессорное ядро SCR1 для встроенных применений с набором команд RISC-V

Общие сведения

Программа для ЭВМ «Улучшенное 32-разрядное процессорное ядро SCR1 для встроенных применений с набором команд RISC-V» (далее по тексту ПО SCR1) представляет собой реализацию процессора архитектуры RISC-V микроконтроллерного класса для встроенных применений.

ПО SCR1 предназначено для работы в составе систем на кристалле (СнК), реализованных непосредственно в кремнии или в программируемых логических интегральных схемах (ПЛИС), и может применяться в одноядерных и многоядерных конфигурациях.

ПО SCR1 является сложным функциональным СФ-блоком (Soft IP), передаваемым потребителю в виде описания на высокоуровневом языке описания аппаратуры SystemVerilog для дальнейшего использования в программах автоматизированного синтеза логических схем с привязкой к конкретной технологии ASIC или ПЛИС.

ПО разрабатывается с использованием собственных мощностей и ресурсов. Цена является договорной, размер вознаграждения за право использования зависит от конфигурации ПО. Обновление ПО производится силами разработчика.

Функциональные характеристики

ПО SCR1 реализует собой 32-х разрядный процессор архитектуры RISC-V микроконтроллерного класса, предназначенный для использования в составе различных встраиваемых и других систем.
Программа обеспечивает выполнение арифметических и логических операций с целочисленными операндами и поддерживает 16- и 32-битные инструкции и 32/16/8-битные операнды.

Основные функциональные характеристики ПО SCR1:

  • Гарвардская архитектура (раздельные шины команд и данных);
  • Конфигурируемая архитектура с набором команд: RV32IMСE
    • базовый набор с целочисленными операциями, 32-битный (RV32I);
    • команды операций целочисленное умножения и деления (М расширение);
    • команды компактного формата для увеличения плотности кода (16-битовые, С расширение);
    • опциональная поддержка базового набора с целочисленными операциями для встраиваемых систем (RV32E);
  • Один машинный уровень (режим M-mode) привилегированности исполнения команд;
  • Многоуровневый конвейер с последовательным исполнением команд;
  • опциональная поддержка памяти быстрого доступа (ТСМ, Tightly-Coupled Memory) до 64 Кб;
  • Поддержка работы в режиме без механизмов трансляции адресов и защиты доступа в память;
  • Интегрированный программируемый контроллер прерываний (IPIC) с поддержкой до 32-х источников прерываний;
  • Поддержка генерации периодических прерываний от часов реального времени (Real Time Clock) с настраиваемым коэффициентом деления.
  • Встроенный контроллер отладки с поддержкой аппаратных точек останова, совместимый со стандартом IEЕЕ 1149.1-2001 (JTAG);
  • Конфигурируемый внешний интерфейс, совместимый с шиной AXI (Advanced extensible Interface) или АНВ (Advanced High-performance Bus).

Состав ПО

ПО SCR1 в базовой конфигурации, реализующей архитектуру RV32IMС включает в себя:

  • Исходный код на языке SystemVerilog, пригодный для моделирования и синтеза;
  • Исходный код тестового окружения (Testbench) для выполнения функциональной верификации до и после синтеза;
  • Наборы скриптов для проведения моделирования и синтеза с файлами входных ограничений в формате (.sdc).
  • Комплект разработчика на базе ПЛИС (SCR1 SDK):
    • пример проекта СнК на основе ПО SCR1;
    • образы загрузки ПЛИС и объектных модулей прикладного ПО для выполнения на ядре SCR1.
  • Инструментальные средства разработки:
    • набор инструментальных средств, основанных на GCC 8.x, 9.x: компилятор, отладчик, компоновщик, функциональный симулятор, бинарные утилиты binutils, newlib, openocd;
    • IDE на базе Eclipse (для Linux и Windows).
  • Прикладное ПО:
    • начальный загрузчик;
    • набор архитектурных тестов и тестов совместимости;
    • примеры простых приложений (baremetal) и тестов производительности;
    • операционная система FreeRTOS для платы SCR1 SDK.
  • Сопроводительная документация:
    • спецификация внешней архитектуры ПО SCR1 (SCR1 EAS)
    • руководство пользователя ПО SCR1 (SCR1 UM)
    • руководство по системе команд (SCR1 ISM)
    • руководство на комплект разработчика (SCR1 SDK)
    • руководство по инструментам разработчика (SCRx development tools)
    • руководство на тестовое окружение

Требования к работе с ПО

Типом реализующей ЭВМ для ПО SCR1 является Система-на-Кристалле (СнК) в составе полузаказных интегральных микросхем или программируемых логических интегральных схем (ПЛИС).
При реализации собственных функционально законченных СнК пользователь должен самостоятельно дополнить основу (микропроцессорную структуру ПО SCR1) необходимыми ему дополнительными модулями в виде отдельных IP-ядер или инфраструктурами IP-ядер.
Для логического синтеза и функциональной верификации ПО SCR1 в составе СнК, пользователю предоставляется набор средств разработки “SCR1 SDK” для физического прототипирования на ПЛИС, основными компонентами которого являются:

  • пример проекта СнК для ПЛИС на основе ПО SCR1;
  • предварительно собранные образы процессорного ядра ПО SCR1 и начального загрузчика;
  • тестовое программное обеспечение для проверки работоспособности ПО SCR1.

Необходимое обеспечение для работы с ПО SCR1

Для работы с ПО SCR1 необходимо следующее обеспечение:

  1. Персональный компьютер (ПК) с объёмом оперативной памяти не менее 4 Гб.
  2. Установленные на ПК программы:
    • ОС Windows или Linux;
    • пакет программ Xilinx Vivado WebPack Edition версии не ниже 2018.1 (скачивается бесплатно после регистрации на сайте xilinx.com);
    • система отладки OpenOCD.
  3. Отладочная плата Arty A7-100T на базе ПЛИС Artix-7
    (https://store.digilentinc.com/arty-a7-artix-7-fpga-development-board/)
  4. JTAG Cable Adapter: Digilent JTAG-HS2 Programming Cable
    (https://store.digilentinc.com/jtag-hs2-programming-cable/)
  5. Набор стандартных кабелей типа USB Type A (m) - Type B micro (m), 2 шт. (из состава комплектов платы Arty A7-100T и JTAG адаптера)

Компиляция ПО

Процесс компиляции образа ПО SCR1 описан в руководстве на комплект разработчика (SCR1 SDK). В состав ПО входит Zip-архив, содержащий скомпилированные образы, созданные согласно руководству на комплект разработчика пример проекта СнК на основе ПО SCR1. В следующих разделах описан процесс установки и тестирования ПО SCR1 в составе проекта СнК.

Установка ПО

Процесс установки ПО заключается в выполнении процедуры программирования конфигурационного ППЗУ (флэш) на отладочной плате, для обеспечения дальнейшей загрузки ПЛИС.

Для установки и работы с ПО SCR1 персональный компьютер подключается к совмещенному (USB/JTAG/UART) порту на отладочной плате (см. рисунок 1, поз. J10).
Подключение выполняется одним кабелем типа USB Type A (m) - Type B micro (m). Это подключение выполняет три функции:

  • подачу питания +5В на отладочную Arty A7-100T;
  • подключение к JTAG порту для конфигурирования ПЛИС;
  • обеспечение консольного порта при выполнении программы на процессорном ядре SCR1.

Рисунок 1. Подключение к отладочной плате Arty A7-100T
Рисунок 1. Подключение к отладочной плате Arty A7-100T

 

Последовательность действий при программировании конфигурационной флэш

Примечание: Проверьте подключение к отладочной плате. К плате должен быть подключен только один USB-кабель, см. Рисунок 1.

  1. Распакуйте Zip архив, находящийся в дереве каталогов ПО SCR1 в папке SDK:<SDK_HOME>/images/arty/scr1/arty100_scr1.zip. В архиве находятся два файла: top_new.mcs, top_new.prm.
  2. После подачи питания на плату, запустите пакет программ Vivado на инструментальном ПК.
  3. Запустите утилиту «Hardware Manager» из меню или командной строки консоли Vivado. Выполните команду «Open Target» с опцией «Auto Connect», должно произойти подключение к микросхеме ПЛИС ПЛИС Artix-7 -100 отладочной платы по интерфейсу JTAG.
  4. Добавьте в конфигурационную цепочку для программирования микросхему конфигурационной флэш. Для этого в меню «Hardware» выделите указателем «мыши» микросхему ПЛИС и по нажатию правой кнопки «мыши» в контекстном меню указателем выберите «Add Configuration Memory Device».
  5. В открывшемся меню выберите (или введите) тип микросхемы флэш S25FL128Sxxxxxx0: производитель – Spansion; тип интерфейса – SPI; ёмкость - 128 Mbits; разрядность шины данных – х1_х2_х4.
  6. На вопрос программатора ”Do you want to program the configuration memory device now?", подтвердите “OK”.
  7. В открывшимся диалогом окне «Program Configuration Memory Device» добавьте загрузочные файлы .mcs и .prm образов «прошивки» ПЛИС, полученные на шаге 1.
  8. Нажмите “OK” для запуска процесса программирования конфигурационной микросхемы флэш (процесс программирования может занять несколько минут).
  9. После успешного завершения процесса программирования (можно проконтролировать по сообщениям в диалоговом окне), необходимо выйти из программы Vivado и загрузить образ «прошивки» в ПЛИС, для этого нажмите кнопку “PROG” на отладочной плате Arty A7-100T.

ПО SCR1 установлено и готово к работе.

Запуск тестов на процессоре SCR1 с использованием начального загрузчика

Подключение инструментального ПК к отладочной плате остается прежним (USB кабелем к разъему J10 на плате).

  1. Для загрузки и исполнения теста используется бинарный файл контрольной задачи – синтетического теста производительности процессорной системы (Dhrystone benchmark). Файл находится по следующему пути в структуре репозитория SDK:

    <SDK_HOME>/images/arty100/benchmarks_scr1.zip

    Распакуйте архив. В нем находится .bin-файл синтетического теста.

  2. Запустите терминальную программу (пример, приведенный ниже - для программы minicom. Некоторые комбинации клавиш для других терминальных программ могут отличаться). Настройте параметры последовательного порта (UART) на инструментальном ПК. Для ОС Linux — это /dev/ttyUSB0 (цифра может меняться, смотрите список файлов в папке /dev/):
    • Bps/Par/Bits - 115200 8N1
    • скорость - 115200
    • количество битов в посылке - 8
    • количество стоп-битов - 1
    • чётность - нет
    • Hardware Flow Control: No
  3. Инициируйте процесс перезагрузки ПЛИС, нажав кнопку “PROG” на отладочной плате, или подачей сигнала reset на ПЛИС, нажав кнопку “RESET” на плате.
  4. При включении платы или перезагрузке ПЛИС в терминал выдается начальное приглашение загрузчика, после чего загрузчик переходит в режим ожидания команды пользователя:

    SCR loader v1.3-gaecf467
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV32IMC [40101104] IMPID: 19083000
    SYSID: 21091300 BLDID: 21101400
    Platform: arty100_scr1, cpuclk 25MHz, sysclk 25MHz
    
    1: xload @addr
    g: start @addr
    d: mem dump
    m: mem modify
    t: mem test
    :

    Примечание: программа загрузчик (SCR bootloader), исполняемая на процессорном ядре SCR1 использует x-modem протокол передачи файлов и поддерживает загрузку только бинарных образов с расширением .bin

  5. Нажмите клавишу “1”
  6. Введите стартовый адрес (в шестнадцатеричном формате) для загрузки исполняемого файла в локальную память TCM процессорного ядра SCR1, и нажмите “Enter”. В терминальном окне начнут периодически выводиться символы “C”, сигнализируя готовность загрузчика принимать бинарный образ по протоколу x-modem:

    xload @addr
    addr: f0000000
    CCCCCCCC
  7. В терминальном окне minicom, нажав комбинацию клавиш "Ctrl+А" затем "S", откройте меню выбора протоколов загрузки, затем выберите “xmodem”:

    +-[Upload]--+
    | zmodem    |
    | ymodem    |
    | xmodem    |
    | kermit    |
    | ascii     |
    +-----------+
  8. На ПК нажмите клавишу “Enter”, затем выберите .bin файл для загрузки (нужно выделить файл и нажать клавишу пробел “space”):

    +------------------------[Select a file for upload]---------------------+
    |Directory: images/arty100                                              |
    | [..]                                                                  |
    | dhry21-o3lto.bin                                                      |
    |                                                                       |
  9. Нажмите “Enter”, начнется передача файла.

    +-----------[xmodem upload - Press CTRL-C to quit]--------------+
    |Sending dhrystone_o3lto.bin, 107 blocks: Give your local XMODE |
    |M receive command now.                                         |
    |Bytes Sent:  13952 BPS:5468                                    |
    |                                                               |
    |Transfer complete                                              |
    |                                                               |
    | READY: press any key to continue...                           |
    :+--------------------------------------------------------------+
  10. По окончании загрузки будет выведена статусная информация:

    Xmodem successfully received 13952 bytes

    Загруженная программа в память процессорного ядра SCR1 готова к исполнению.

  11. В терминальном окне в меню загрузчика выберите “g”, затем введите начальный адрес запуска программы 0xf0000200. После этого начнется выполнение программы:

    start @addr
    addr: f0000200
    
    
    Dhrystone Benchmark, Version 2.1 (Language: C)
    ...
  12. После выполнения теста на процессорном ядре SCR1, выводятся результаты:

    Microseconds for one run through Dhrystone:  12.766
    Dhrystones per Second:        78333

Запуск тестов на процессоре SCR1 с использованием отладчика OpenOCD

Open On-Chip Debugger (открытый отладчик для чипов) является программой с открытым исходным кодом. OpenOCD предоставляет доступ к адаптеру для отладки (JTAG debug adapter) и обеспечивает инструментарий отладки (debugging) и внутрисхемного программирования для встраиваемых систем.

Подключение JTAG кабеля адаптера OpenOCD

Подключение JTAG кабеля адаптера OpenOCD к плате Arty A7-100 показано на Рисунке 2.

Рисунок 2. Подключение JTAG адаптера к отладочной плате Arty A7-100T
Рисунок 2. Подключение JTAG адаптера к отладочной плате Arty A7-100T

Установка OpenOCD

Инструкции по установке OpenOCD приведены на вики-странице
https://github.com/syntacore/openocd/wiki/OpenOCD-for-sc_riscv32

Запуск сервера OpenOCD на ПК

  1. Настройка переменных окружения:

    $ export OOCD_ROOT=<Path to the OpenOCD installation directory>
  2. Запуск OpenOCD сервера - вводится в одну строку (в Ubuntu):

    $ sudo ${OOCD_ROOT}/bin/openocd                \
    -s ${OOCD_ROOT}/share/openocd/scripts              \
    -f ${OOCD_ROOT}/share/openocd/scripts/interface/ftdi/digilent-hs2_fixed.cfg  \
    -f ${OOCD_ROOT}/share/openocd/scripts/target/syntacore_riscv.cfg
    
    or if you build it from sources:
    
    $ sudo ${OOCD_ROOT}/src/openocd          \
    -s ${OOCD_ROOT}/tcl              \
    -f ${OOCD_ROOT}/tcl/interface/ftdi/digilent-hs2_fixed.cfg  \
    -f ${OOCD_ROOT}/tcl/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.cpu
    Info : clock speed 2000 kHz
    Info : JTAG tap: riscv.cpu tap/device found: 0xdeb13001 (mfg: 0x000 (<invalid>), part: 0xeb13, ver: 0xd)
    Info : riscv.cpu: datacount=2 progbufsize=6
    Info : riscv.cpu: Examined RISC-V core; found 1 harts
    Info : riscv.cpu: hart 0: XLEN=32, misa=0x40101104
    Info : Listening on port 3333 for gdb connections
  3. Откройте второй терминал (терминал 2) и введите команду:

    $ telnet localhost 4444

    В терминале 1 выводится подтверждение запуска telnet сессии:

    Info : accepting 'telnet' connection on tcp/4444

    OpenOCD запущен и готов к работе. Терминал 2 представляет собой интерактивную консоль OpenOCD.
    По команде help можно вывести список доступных команд openocd.

Загрузка и запуск на выполнение бинарных образов

Примечание: При загрузке с OpenOCD используются образы двоичных файлов в формате .elf или .bin

  1. Введите следующие команды в консоли OpenOCD (Терминал 2), выполняющие остановку ядра и загрузку исполняемого кода :

    > halt
    > load_image dhry21-o3lto.bin 0xf0000000 bin

    or

    > halt
    > load_image dhrystone.elf 0xf0000000 elf

    Примечание: Команда загрузки предполагает расположение файла в текущей директории. При другом расположении, имя загружаемого файла должно включать относительный путь.

  2. После ввода команды отображается прогресс загрузки. После завершения загрузки запустите программу теста:

    > resume 0xf000000
  3. После выполнения теста на процессорном ядре SCR1, выводятся результаты:

    Dhrystone Benchmark, Version 2.1 (Language: C)
    
    Program compiled without 'register' attribute
    
    
    Platform: SCR1 Syntacore FPGA @ 25.000 MHz
    Compiler: GCC10.2.0
    Flags:  -O3 -funroll-loops -flto
    
    Execution starts, 5000 runs through Dhrystone
    Execution ends
    ...
    
    Microseconds for one run through Dhrystone:  12.764
    Dhrystones per Second:        78345