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

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

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

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

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

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

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

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

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

  • Гарвардская архитектура (раздельные шины команд и данных);
  • Поддержка симметричной многопроцессорности (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) до 128 Кб;
    • опциональная поддержка кэш команд уровня L1 размером от 8 до 64 Кб;
    • опциональная поддержка кэш данных уровня L1 размером от 8 до 64 Кб;
    • опциональная поддержка кэш данных уровня L2 размером до 2 Мб на кластер;
  • Интегрированный программируемый контроллер прерываний (IPIC) с поддержкой до 32-х источников прерываний;
  • Опциональная замена IPIC на конфигурируемый контроллер прерываний уровня платформы (PLIC) с возможностью приема большого количества внешних запросов прерываний (до 255) и с динамическим заданием (изменением) приоритета прерываний;
  • Встроенный 64-битовый таймер часов реального времени (Real Time Clock) с настраиваемым коэффициентом деления;
  • Встроенный контроллер отладки с поддержкой аппаратных точек останова, совместимый со стандартом IEЕЕ 1149.1-2001 (JTAG);
  • Конфигурируемый внешний интерфейс, совместимый с шиной AXI (Advanced extensible Interface) или АНВ (Advanced High-performance Bus).

Состав ПО

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

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

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

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

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

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

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

  1. Персональный компьютер (ПК) с объёмом оперативной памяти не менее 8 Гб.
  2. Установленные на ПК программы:
    • ОС Windows или Linux;
    • пакет программ Xilinx Vivado WebPack Edition версии не ниже 2018.1 (скачивается бесплатно после регистрации на сайте xilinx.com);
    • система отладки OpenOCD.
  3. Отладочная плата Virtex UltraScale+ FPGA VCU118 Evaluation Kit
    (https://www.xilinx.com/products/boards-and-kits/vcu118.html).
  4. Адаптер для соединения с отладчиком OpenOCD (JTAG Cable Adapter): Olimex ARM-USB-OCD-H (or ARM-USB-OCD)
    (https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD-H/).
  5. Переходная плата
    (https://www.xilinx.com/products/boards-and-kits/hw-fmc-xm105-g.html).
  6. Набор стандартных кабелей типа USB Type A (m) - Type B micro (m), 3 шт. (из состава комплектов платы VCU118 и JTAG адаптера).

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

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

Установка ПО

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

Для установки и работы с ПО SCR4х64 персональный компьютер подключается к отладочной плате 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 порт;
  • обеспечение функциональности консольного порта при выполнении программы на процессорном ядре SCR4х64 через USB UART порт.

Подключение кабелей к отладочной плате VCU118 приведено на Рисунке 1.

image
Рисунок 1: Подключение кабелей к отладочной плате VCU118

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

  1. Распакуйте архив, находящийся в дереве каталогов ПО SCR4x64 в папке SDK:<SDK_HOME>/images/vcu118_scr4.tar.gz. В архиве находятся два файла: vcu118_scr4.mcs, vcu118_scr4.prm.
  2. После подачи питания на плату VCU118, запустите пакет программ Vivado на инструментальном ПК.
  3. Проверьте подключение кабеля 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

  1. Добавьте в конфигурационную цепочку для программирования микросхему конфигурационной flash. Для этого в меню «Hardware» выделите указателем «мыши» микросхему ПЛИС xcvu9p_0 и по нажатию правой кнопки «мыши» в контекстном меню указателем выберете «Add Configuration Memory Device».
  2. В открывшемся меню выберите (или введите) тип микросхемы flash: mt25qu01g-spi-x1_x2_x4 и нажмите OK
  3. На вопрос программатора ”Do you want to program the configuration memory device now?", подтвердите “OK”.
  4. В открывшимся диалогом окне «Program Configuration Memory Device» добавьте загрузочные файлы образов «прошивки» ПЛИС (см. выше: vcu118_scr4.mcs, vcu118_scr4.prm)
  5. Нажмите “OK” для запуска процесса программирования конфигурационной микросхемы flash (процесс программирования может занять несколько минут).

Примечание: Проверьте, что DIP переключатель SW16 на плате VCU118 установлен в положение выбора режима загрузки ПЛИС Master SPI

  1. После успешного завершения процесса программирования (можно проконтролировать по сообщениям в диалоговом окне), необходимо выйти из программы Vivado и загрузить образ «прошивки» в ПЛИС, для этого нажмите кнопку “PROG” на отладочной плате VCU118, или нажмите кнопку “CPU_RESET” на плате (см. рисунок ниже), или выключите и включите плату.

image
Рисунок 2: Аппаратный сброс платы VCU118

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

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

Подключение инструментального ПК к отладочной плате остается прежним, см. Рисунок 1 .

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

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

  2. Запустите терминальную программу. Возможно использование любой терминальной программа дя 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
  1. Инициируйте процесс перезагрузки ПЛИС, нажав кнопку “PROG” на отладочной плате, или подачей сигнала reset на ПЛИС, нажав кнопку “CPU_RESET” на плате (см. рисунок Рисунок 2).
  2. При включении платы или перезагрузке ПЛИС по аппаратному сбросу, в терминал выдается начальное приглашение загрузчика, после чего загрузчик переходит в режим ожидания команды пользователя:
    SCR loader v1.3-g0d64a5e SMP
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV64IMAFDC [800000000010112D] IMPID: 0000000021061743
    BLDID: 21070800
    Platform: vcu118_scr4c2p, 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
    :
  3. При нажатии клавиши "SPACE" и затем комбинации клавиш "SHIFT+1" можно вывести в терминал дополнительную информацию о процессорной платформе:
    SCR loader v1.3-g0d64a5e SMP (Jul  9 2021 10:17:10)
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV64IMAFDC [800000000010112D] IMPID: 0000000021061743
    BLDID: 21070800
    Platform: vcu118_scr4c2p, cpuclk 65MHz, sysclk 65MHz
    L1i [00000942] 32K, 4-way, 16-byte line, enabled
    L1d [00002942] 32K, 4-way, 16-byte line, enabled
    L2  [21061700 3003e953] 512K, 8-way, 32-byte line, shared (4 cores), status: f
    Memory map:
    0000000000000000  2G    000003FE  DDR
    FFFFFFFFF0000000  128K  000003FE  TCM
    FFFFFFFFF0040000  8K    00030006  MMCFG
    FFFFFFFFFF000000  8M    00010186  MMIO
    FFFFFFFFFFFF0000  64K   0000008E  On-Chip RAM
    MPU regions (16):
    01 0000007F 0000000000000000 000000FF80000000
    02 0000007F FFFFFFFFF0000000 000000FFFFFE0000
    03 00030007 FFFFFFFFF0040000 000000FFFFFFE000
    04 00010007 FFFFFFFFFF000000 000000FFFF800000
    05 0000000F FFFFFFFFFFFF0000 000000FFFFFF0000
    !
  4. Для загрузки прикладной программы (например, теста поизводительности Dhrystone benchmark) в локальную память процессора SCR4x64, в терминальном окне в меню загрузчика нужно выбрать "1".
  5. Далее необходимо ввести стартовый адрес (в шестнадцатеричном формате) для загрузки исполняемого файла в локальную память процессора SCR4x64, и нажать “Enter”. В терминальном окне начнут периодически выводиться символы “C”, сигнализируя готовность загрузчика принимать бинарный образ по протоколу x-modem:
    xload @addr
    addr: 0
    CCCCCCCC

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

  1. В терминальном окне minicom, нажав комбинацию клавиш "Ctrl+А" затем "S", откройте меню выбора протоколов загрузки, затем выберете “xmodem”:
     +-[Upload]--+
     | zmodem    |
     | ymodem    |
     | xmodem    |
     | kermit    |
     | ascii     |
     +-----------+
  1. На ПК нажмите клавишу “Enter”, затем выберите .bin файл для загрузки (нужно выделить файл и нажать клавишу пробел “space”):
    +------------------------[Select a file for upload]-------------------------+
    |Directory: /images/scr4                                                    |
    | [..]                                                                      |
    | dhrystone.bin                                                             |
    |                                                                           |
  2. Нажмите “Enter”, начнется передача файла. dhrystone_o3lto.bin
    +-----------[xmodem upload - Press CTRL-C to quit]------------+
    |Sending dhrystone.bin, 160 blocks: Give your local XMODEM rec|
    |eive command now.                                            |
    |Bytes Sent:  20608   BPS:5300                                |
    |                                                             |
    |Transfer complete                                            |
    |                                                             |
    | READY: press any key to continue...                         |
    +-------------------------------------------------------------+
  3. По окончании загрузки будет выведена статусная информация:
    Xmodem successfully received 20608 bytes

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

  4. В терминальном окне в меню загрузчика выберите “g”, затем введите начальный адрес запуска программы 0x106c. После этого начнется выполнение программы:
    start @addr
    addr: 0
    
    
    Dhrystone Benchmark, Version 2.1 (Language: C)
    ...
  5. После выполнения теста на процессоре SCR4x64, выводятся результаты:
    Microseconds for one run through Dhrystone:   15.4
    Dhrystones per Second:                      64933.3

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

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

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

Подключение JTAG кабеля адаптера Olimex ARM-USB-OCD к плате VCU118 (см. рисунок ниже) выполняется с помощью переходной платы FMC XM105, имеющей в своем составе пользовательский разъемом J20 для подключения стандартного 20-ти контактного гибкого шлейфа.

Примечание: Необходимо соединить выводы TDI и TDO на разъеме J5 платы FMC XM105 (JTAG chain bypass).

image
Рисунок 3: Подключение JTAG кабеля адаптера OpenOCD к плате VCU118

Установка OpenOCD

Инструкции по установке OpenOCD приведены на вики-странице OpenOCD-for-sc_riscv32

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

  1. Настройка переменных окружения:
    $ export OOCD_ROOT=<Раth to the OpenOCD installation directory>
  2. Запуск 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 '.
    riscv.cpu3
    Info : clock speed 2000 kHz
    Info : JTAG tap: riscv.cpu0 tap/device found: 0xdeb14001 (mfg: 0x000 (), part: 0xeb14, ver: 0xd)
    Info : JTAG tap: riscv.cpu1 tap/device found: 0xdeb14001 (mfg: 0x000 (), part: 0xeb14, ver: 0xd)
    Info : JTAG tap: riscv.cpu2 tap/device found: 0xdeb14001 (mfg: 0x000 (), part: 0xeb14, ver: 0xd)
    Info : JTAG tap: riscv.cpu3 tap/device found: 0xdeb14001 (mfg: 0x000 (), 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
  3. Откройте второй терминал (терминал 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.

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

  1. Введите следующие команды в консоли 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
    > targets riscv.cpu0
    >
    > 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
    > halt
    > load_image dhrystone.bin 0x0 bin
    20564 bytes written at address 0x00000000
    downloaded 20564 bytes in 0.224523s (89.443 KiB/s)

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

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

    > resume 0x0

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