Процессорное ядро уровня приложений SCR5 с набором команд RISC-V и поддержкой многоядерных конфигураций

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

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

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

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

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

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

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

Программа обеспечивает выполнение арифметических и логических операций с целочисленными операндами и вычислений с плавающей точкой одинарной и двойной точности; поддержку 16- и 32- битных инструкций и 64/32/16/8-битных операндов; идентификацию ядер в многоядерных конфигурациях СнК;

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

  • Гарвардская архитектура (раздельные шины команд и данных);
  • Поддержка симметричной многопроцессорности (SMP) и межъядерного взаимодействия с настраиваемой конфигурацией от 1 до 4-х процессорных ядер в кластере;
  • Набор команд: RV32/64IMСAFD
    • базовые наборы с целочисленными операциями, 32 или 64-битный (RV32/64I);
    • команды операций целочисленное умножения и деления (М расширение);
    • команды компактного формата для увеличения плотности кода (16-битовые, С расширение);
    • атомарные операции (А расширение);
    • арифметические операции с плавающей точкой над числами одинарной точности (Single-Precision Floating-Point, F расширение);
    • арифметические операции с плавающей точкой над числами двойной точности (Double-Precision Floating-Point, D расширение);
  • Три уровня привилегированности и соответствующих им режимов исполнения команд: машинный уровень (режим M-mode), пользовательский уровень (режим U-mode), уровень супервизора (режим - S-mode);
  • Многоуровневый конвейер с последовательным исполнением команд;
  • Высокопроизоводительный модуль операций с плавающей запятой одинарной и двойной точности (Floating-Point Unit);
  • Конфигурируемая подсистема памяти:
    • поддержка виртуальной памяти с помощью модуля управления памятью (MMU);
    • контроль доступа к физической памяти с помощью модуля защиты памяти (MPU - Memory Protection Unit);
    • опциональная поддержка памяти быстрого доступа (ТСМ, Tightly-Coupled Memory) до 256 Кб;
    • поддержка кэш-памяти (с опцией коррекции ошибок) с когерентностью памяти:
      • кэш команд уровня L1 размером от 8 до 64 Кб;
      • кэш данных уровня L1 размером от 8 до 64 Кб;
      • кэш данных уровня L2 размером до 2 Мб на кластер;
  • Интегрированный программируемый контроллер прерываний (IPIC) с поддержкой до 32-х источников прерываний;
  • Опциональная замена IPIC на конфигурируемый контроллер прерываний уровня платформы (PLIC) с возможностью приема большого количества внешних запросов прерываний (до 1023) и с динамическим заданием (изменением) приоритета прерываний;
  • Встроенный 64-битовый таймер часов реального времени (Real Time Clock) с настраиваемым коэффициентом деления;
  • Встроенный контроллер отладки с поддержкой аппаратных точек останова, совместимый со стандартом IEЕЕ 1149.1-2001 (JTAG);
  • Конфигурируемый внешний интерфейс, совместимый с шиной AXI (Advanced extensible Interface).

Состав ПО

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

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

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

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

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

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

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

  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 адаптера).
  7. Кабель Ethernet cat.5E (в комплекте VCU118 Evaluation Kit).

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

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

Установка ПО

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

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

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

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

  1. Распакуйте архив, находящийся в дереве каталогов ПО SCR5 в папке SDK:<SDK_HOME>/images/vcu118_scr5.tar.gz. В архиве находятся два файла: vcu118_scr5.mcs, vcu118_scr5.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_scr5.mcs, vcu118_scr5.prm)
  5. Нажмите “OK” для запуска процесса программирования конфигурационной микросхемы flash (процесс программирования может занять несколько минут).

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

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

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

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

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

Подключение инструментального ПК к отладочной плате остается прежним, см. Рисунок 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

     

  3. Инициируйте процесс перезагрузки ПЛИС, нажав кнопку “PROG” на отладочной плате, или подачей сигнала reset на ПЛИС, нажав кнопку “CPU_RESET” на плате (см. Рисунок 2).
  4. При включении платы или перезагрузке ПЛИС по аппаратному сбросу, в терминал выдается начальное приглашение загрузчика, после чего загрузчик переходит в режим ожидания команды пользователя:
    SCR loader v1.3-gdf04d45 SMP
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV64IMAFDC [800000000014112D] IMPID: 0000000021061753
    BLDID: 21070800
    Platform: vcu118_scr5t, 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 Linux
    1: xload @addr
    v: int flash load
    u: int flash update
    g: start @addr
    d: mem dump
    m: mem modify
    t: mem test
    :
  5. При нажатии клавиши "SPACE" и затем комбинации клавиш "SHIFT+1" можно вывести в терминал дополнительную информацию о процессорной платформе:
    SCR loader v1.3-gdf04d45 SMP (Jul  9 2021 12:47:23)
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV64IMAFDC [800000000014112D] IMPID: 0000000021061753
    BLDID: 21070800
    Platform: vcu118_scr5t, 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  4G    000003FE  DDR
    00000000FFC00000  4M    00010186  DMA RAM
    FFFFFFFFF0000000  256K  000003FE  TCM
    FFFFFFFFF0040000  8K    00030006  MMCFG
    FFFFFFFFFE000000  16M   00010186  PLIC
    FFFFFFFFFF000000  8M    00010186  MMIO
    FFFFFFFFFFFF0000  64K   0000008E  On-Chip RAM
    MPU regions (16):
    01 000003FF 0000000000000000 000000FF00000000
    02 00010187 00000000FFC00000 000000FFFFC00000
    03 000003FF FFFFFFFFF0000000 000000FFFFFC0000
    04 00030007 FFFFFFFFF0040000 000000FFFFFFE000
    05 00010187 FFFFFFFFFE000000 000000FFFF000000
    06 00010187 FFFFFFFFFF000000 000000FFFF800000
    07 0000008F FFFFFFFFFFFF0000 000000FFFFFF0000
    !
  6. Для загрузки прикладной программы (например, теста поизводительности Dhrystone benchmark) в локальную память процессора SCR5, в терминальном окне в меню загрузчика нужно выбрать "1".
  7. Далее необходимо ввести стартовый адрес (в шестнадцатеричном формате) для загрузки исполняемого файла в локальную память процессора SCR5, и нажать “Enter”. В терминальном окне начнут периодически выводиться символы “C”, сигнализируя готовность загрузчика принимать бинарный образ по протоколу x-modem:
    xload @addr
    addr: 0
    CCCCCCCC

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

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

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

  12. В терминальном окне в меню загрузчика выберите “g”, затем введите начальный адрес запуска программы 0. После этого начнется выполнение программы:
    start @addr
    addr: 0
    
    
    Dhrystone Benchmark, Version 2.1 (Language: C)
    ...
  13. После выполнения теста на процессоре SCR5, выводятся результаты:

    Microseconds for one run through Dhrystone:  15.3
    Dhrystones per Second:        65056.7

Загрузка и запуск образа ОС Linux на платформе SCR5 SDK с использованием OpenOCD

В качестве теста работоспособности ПО SCR5 в составе проекта СнК используется запуск ОС Linux на платформе SCR5 SDK.
Open On-Chip Debugger (открытый отладчик для чипов) является программой с открытым исходным кодом. OpenOCD предоставляет доступ к адаптеру для отладки (JTAG debug adapter) и обеспечивает инструментарий отладки (debugging) и внутрисхемного программирования для встраиваемых систем.

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

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

Примечание: Перед первым подключением платы XM105, необходимо настроить необходимый уровень напряжения питания на разъеме FMC платы VCU118 с помощью утилиты VCU118 System Controller GUI tool, работающей под управлением ОС Windows (Win7 / Win8 / Win10)
Полное руководство для утилиты доступно по ссылке: VCU118 System Controller Tutorial.
Утилита и руководство к ней скачиваются бесплатно после авторизации на сайте https://www.xilinx.com

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

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

Установка 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}/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
    none separate
    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: 0xdeb15001 (mfg: 0x000 (<invalid>), part: 0xeb15, ver: 0xd)
    Info : JTAG tap: riscv.cpu1 tap/device found: 0xdeb15001 (mfg: 0x000 (<invalid>), part: 0xeb15, ver: 0xd)
    Info : JTAG tap: riscv.cpu2 tap/device found: 0xdeb15001 (mfg: 0x000 (<invalid>), part: 0xeb15, ver: 0xd)
    Info : JTAG tap: riscv.cpu3 tap/device found: 0xdeb15001 (mfg: 0x000 (<invalid>), part: 0xeb15, 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=0x800000000014112d
    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=0x800000000014112d
    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=0x800000000014112d
    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=0x800000000014112d
    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.

Загрузка и запуск на выполнение бинарного образа ОС Linux на платформе SCR5 SDK

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

  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
    >reset halt; load_image vmlinux.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)
    8682556 bytes written at address 0x00000000
    downloaded 8682556 bytes in 83.540436s (101.496 KiB/s)
    >

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

  2. Сделайте перезапуск начального загрузчика
    > reset
    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)
    SCR loader v1.3-gdf04d45 SMP
    Copyright (C) 2015-2020 Syntacore. All rights reserved.
    ISA: RV64IMAFDC [800000000014112D] IMPID: 0000000021061753
    BLDID: 21070800
    Platform: vcu118_scr5t, 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 Linux
    1: xload @addr
    v: int flash load
    u: int flash update
    g: start @addr
    d: mem dump
    m: mem modify
    t: mem test
    :
  3. В терминальном окне в меню загрузчика нужно выбрать "start Linux" - "0". После ввода команды начнется стандартная загрузка Linux с выводом лога в терминал uart:

    Starting Linux ...
    
    ;;;;;vvvvvvvvv    SSSSSSS
    rrrr;;;vvvvvvv  SS                        s                                 TM
    rrrrrr;;vvvvvv  SS          s   s   sss  ssss  sss    sss   sss    sss  sss
    rrrrrr;;vvvvv;    SSSSSS    s   s  s   s  s       s  s     s   s  s    s   s
    rrrr;;;vvvvv;;          SS  s   s  s   s  s   sssss  s     s   s  s    sssss
    rr;;;vvvvvv;;r          SS   ssss  s   s  s   s   s  s     s   s  s    s
    rrr;;vvvvv;;rr   SSSSSSS        s  s   s   ss  sss    sss   sss   s     sss
    rrrr;;vvv;;rrr               sss
    rrrrr;;v;;rrrr
    rrrrrr;;;rrrrr                                           CUSTOM CORES AND TOOLS
    
    [    0.000000] Linux version 4.19.166-46819-g5ceb3097ff34-dirty (mike@lynx2) (gcc version 10.2.0 (GCC)) #1 SMP Wed Jun 1
    [    0.000000] bootconsole [early0] enabled
    [    0.000000] initrd not found or empty - disabling initrd
    [    0.000000] SCRxDMA: created DMA memory pool at 0x00000000ffc00000, size 4 MiB
    [    0.000000] OF: reserved mem: initialized node scr-dma@fe000000, compatible id scr-sdk-dma-pool
    [    0.000000] Zone ranges:
    [    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffbfffff]
    [    0.000000]   Normal   empty
    [    0.000000] Movable zone start for each node
    [    0.000000] Early memory node ranges
    [    0.000000]   node   0: [mem 0x0000000000000000-0x00000000ffbfffff]
    [    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ffbfffff]
    [    0.000000] On node 0 totalpages: 1047552
    [    0.000000]   DMA32 zone: 14322 pages used for memmap
    [    0.000000]   DMA32 zone: 0 pages reserved
    [    0.000000]   DMA32 zone: 1047552 pages, LIFO batch:63
    [    0.000000] software IO TLB: mapped [mem 0xf800e000-0xfc00e000] (64MB)
    [    0.000000] CPU with hartid=4 is not available
    [    0.000000] CPU with hartid=5 is not available
    [    0.000000] CPU with hartid=6 is not available
    [    0.000000] CPU with hartid=7 is not available
    [    0.000000] elf_hwcap is 0x112d
    [    0.000000] percpu: Embedded 17 pages/cpu s28984 r8192 d32456 u69632
    [    0.000000] pcpu-alloc: s28984 r8192 d32456 u69632 alloc=17*4096
    [    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
    [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1033230
    [    0.000000] Kernel command line: earlyprintk earlycon=sbi console=ttyS0,115200
    [    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes)
    [    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes)
    [    0.000000] Sorting __ex_table...
    [    0.000000] Memory: 4051828K/4190208K available (3682K kernel code, 225K rwdata, 1241K rodata, 2720K init, 794K bss,)
    [    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
    [    0.000000] rcu: Hierarchical RCU implementation.
    [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
    [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
    [    0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
    [    0.000000] CPU with hartid=4 is not available
    [    0.000000] plic: failed to parse hart ID for context 9.
    [    0.000000] CPU with hartid=5 is not available
    [    0.000000] plic: failed to parse hart ID for context 11.
    [    0.000000] CPU with hartid=6 is not available
    [    0.000000] plic: failed to parse hart ID for context 13.
    [    0.000000] CPU with hartid=7 is not available
    [    0.000000] plic: failed to parse hart ID for context 15.
    [    0.000000] plic: mapped 16 interrupts to 4 (out of 16) handlers.
    [    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 352636161s
    [    0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
    [    0.010000] pid_max: default: 32768 minimum: 301
    [    0.020000] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes)
    [    0.030000] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes)
    [    0.050000] rcu: Hierarchical SRCU implementation.
    [    0.060000] smp: Bringing up secondary CPUs ...
    [    0.080000] smp: Brought up 1 node, 4 CPUs
    [    0.090000] devtmpfs: initialized
    [    0.130000] random: get_random_bytes called from setup_net+0x26/0x134 with crng_init=0
    [    0.140000] SCRxDMA: reserved coherent memory PHYS 0xffc00000 - 0xffffffff VA 0xffffffd000380000
    [    0.140000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
    [    0.160000] futex hash table entries: 1024 (order: 3, 32768 bytes)
    [    0.170000] NET: Registered protocol family 16
    [    0.180000] audit: initializing netlink subsys (disabled)
    [    0.190000] audit: type=2000 audit(0.190:1): state=initialized audit_enabled=0 res=1
    [    0.270000] clocksource: Switched to clocksource riscv_clocksource
    [    0.300000] NET: Registered protocol family 2
    [    0.320000] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes)
    [    0.340000] TCP established hash table entries: 32768 (order: 6, 262144 bytes)
    [    0.360000] TCP bind hash table entries: 32768 (order: 7, 524288 bytes)
    [    0.380000] TCP: Hash tables configured (established 32768 bind 32768)
    [    0.400000] UDP hash table entries: 2048 (order: 4, 65536 bytes)
    [    0.410000] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes)
    [    0.430000] NET: Registered protocol family 1
    [    0.450000] RPC: Registered named UNIX socket transport module.
    [    0.450000] RPC: Registered udp transport module.
    [    0.460000] RPC: Registered tcp transport module.
    [    0.470000] RPC: Registered tcp NFSv4.1 backchannel transport module.
    [    3.210000] xilinx_axienet ffffffffff040000.ethernet: SCRxDMA: use platform dma ops
    [    3.220000] libphy: Xilinx Axi Ethernet MDIO: probed
    [    3.240000] xilinx_axienet ffffffffff040000.ethernet: Xilinx Axi Ethernet TEMAC version 9.0 rev0 at 0xffffffffff04002
    [    3.280000] workingset: timestamp_bits=62 max_order=20 bucket_order=0
    [    3.440000] NFS: Registering the id_resolver key type
    [    3.440000] Key type id_resolver registered
    [    3.450000] Key type id_legacy registered
    [    3.460000] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
    [    3.480000] Key type cifs.idmap registered
    [    3.490000] fuse init (API version 7.27)
    [    3.560000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
    [    3.580000] io scheduler noop registered
    [    3.580000] io scheduler deadline registered
    [    3.590000] io scheduler cfq registered (default)
    [    3.600000] io scheduler mq-deadline registered
    [    3.610000] io scheduler kyber registered
    [    3.620000] of_fixed_clk clkc: SCRxDMA: use platform dma ops
    [    3.630000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
    [    3.650000] of_serial ffffffffff010000.serial: SCRxDMA: use platform dma ops
    [    3.670000] console [ttyS0] disabled
    [    3.670000] ffffffffff010000.serial: ttyS0 at MMIO 0xffffffffff010000 (irq = 1, base_baud = 4062500) is a 16550A
    [    3.700000] console [ttyS0] enabled
    [    3.700000] console [ttyS0] enabled
    [    3.710000] bootconsole [early0] disabled
    [    3.710000] bootconsole [early0] disabled
    [    3.860000] loop: module loaded
    [    4.120000] libphy: Fixed MDIO Bus: probed
    [    4.140000] aoe: AoE v85 initialised.
    [    4.150000] ipip: IPv4 and MPLS over IPv4 tunneling driver
    [    4.170000] NET: Registered protocol family 10
    [    4.190000] Segment Routing with IPv6
    [    4.200000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
    [    4.210000] NET: Registered protocol family 17
    [    4.220000] Key type dns_resolver registered
    [    4.270000] Freeing unused kernel memory: 2720K
    [    4.280000] This architecture does not have kernel memory protection.
    [    4.290000] Run /init as init process
    Install BusyBox
    Init Ethernet...
    [    5.530000] vcu118_dp83867_phy_fixup:
    [    5.530000] DP83867 phy: Switch to SGMII 6-wire mode
    [    5.530000] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
    route: ioctl 0x890b failed: Network is unreachable
    [    6.560000] xilinx_axienet ffffffffff040000.ethernet eth0: Link is Down
    [    9.680000] xilinx_axienet ffffffffff040000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
    [    9.690000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
    Mount root fs
    Sync date/time...
    rdate: bad address 'time.nist.gov'
    Mount new root...
    [   13.940000] EXT4-fs (loop0): recovery complete
    [   13.960000] EXT4-fs (loop0): mounted filesystem with ordered data mode. Opts: (null)
    Switch root...
    [   14.360000] random: fast init done
    [   28.970000] systemd[1]: System time before build time, advancing clock.
    [   31.310000] systemd[1]: systemd 244.1-1 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINI)
    [   31.340000] systemd[1]: Detected architecture riscv64.
    
    Welcome to Debian GNU/Linux bullseye/sid!
    
    [   31.420000] systemd[1]: Set hostname to .
    [   38.610000] systemd[1]: /lib/systemd/system/dbus.socket:5: ListenStream= references a path below legacy directory /v.
    [   41.620000] random: systemd: uninitialized urandom read (16 bytes read)
    [   41.630000] systemd[1]: system-getty.slice: unit configures an IP firewall, but the local system does not support BP.
    [   41.640000] systemd[1]: (This warning is only shown for the first unit using IP firewalling.)
    [   41.670000] systemd[1]: Created slice system-getty.slice.
    [  OK  ] Created slice system-getty.slice.
    [   41.720000] random: systemd: uninitialized urandom read (16 bytes read)
    [   41.740000] systemd[1]: Created slice system-serial\x2dgetty.slice.
    [  OK  ] Created slice system-serial\x2dgetty.slice.
    [   41.780000] random: systemd: uninitialized urandom read (16 bytes read)
    [   41.790000] systemd[1]: Created slice User and Session Slice.
    [  OK  ] Created slice User and Session Slice.
    [   41.840000] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
    [  OK  ] Started Dispatch Password …ts to Console Directory Watch.
    [   41.890000] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
    [  OK  ] Started Forward Password R…uests to Wall Directory Watch.
    [   41.940000] systemd[1]: Condition check resulted in Arbitrary Executable File Formats File System Automount Point be.
    [   41.960000] systemd[1]: Reached target Local Encrypted Volumes.
    [  OK  ] Reached target Local Encrypted Volumes.
    [   42.000000] systemd[1]: Reached target Paths.
    [  OK  ] Reached target Paths.
    [   42.040000] systemd[1]: Reached target Slices.
    [  OK  ] Reached target Slices.
    [   42.080000] systemd[1]: Reached target Swap.
    [  OK  ] Reached target Swap.
    [   42.130000] systemd[1]: Listening on RPCbind Server Activation Socket.
    [  OK  ] Listening on RPCbind Server Activation Socket.
    [   42.170000] systemd[1]: Listening on initctl Compatibility Named Pipe.
    [  OK  ] Listening on initctl Compatibility Named Pipe.
    [   42.230000] systemd[1]: Listening on Journal Audit Socket.
    [  OK  ] Listening on Journal Audit Socket.
    [   42.270000] systemd[1]: Listening on Journal Socket (/dev/log).
    [  OK  ] Listening on Journal Socket (/dev/log).
    [   42.330000] systemd[1]: Listening on Journal Socket.
    [  OK  ] Listening on Journal Socket.
    [   42.370000] systemd[1]: Listening on udev Control Socket.
    [  OK  ] Listening on udev Control Socket.
    [   42.420000] systemd[1]: Listening on udev Kernel Socket.
    [  OK  ] Listening on udev Kernel Socket.
    [   42.470000] systemd[1]: Condition check resulted in Huge Pages File System being skipped.
    [   42.530000] systemd[1]: Mounting POSIX Message Queue File System...
             Mounting POSIX Message Queue File System...
    [   42.630000] systemd[1]: Mounting RPC Pipe File System...
             Mounting RPC Pipe File System...
    [   42.740000] systemd[1]: Mounting Kernel Debug File System...
             Mounting Kernel Debug File System...
    [   42.780000] systemd[1]: Condition check resulted in Kernel Module supporting RPCSEC_GSS being skipped.
    [   42.800000] systemd[1]: Condition check resulted in Create list of static device nodes for the current kernel being .
    [   42.930000] systemd[1]: Condition check resulted in Set Up Additional Binary Formats being skipped.
    [   42.990000] systemd[1]: Starting Journal Service...
             Starting Journal Service...
    [   43.330000] systemd[1]: Starting Load Kernel Modules...
             Starting Load Kernel Modules...
    [   43.420000] systemd[1]: Starting Remount Root and Kernel File Systems...
             Starting Remount Root and Kernel File Systems...
    [   43.540000] systemd[1]: Starting udev Coldplug all Devices...
             Starting udev Coldplug all Devices...
    [   43.760000] systemd[1]: Mounted POSIX Message Queue File System.
    [  OK  ] Mounted POSIX Message Queue File System.
    [   43.800000] systemd[1]: Mounted RPC Pipe File System.
    [  OK  ] Mounted RPC Pipe File System.
    [   43.860000] systemd[1]: Mounted Kernel Debug File System.
    [  OK  ] Mounted Kernel Debug File System.
    [   44.300000] systemd[1]: Started Load Kernel Modules.
    [  OK  ] Started Load Kernel Modules.
    [   44.410000] systemd[1]: Mounting FUSE Control File System...
             Mounting FUSE Control File System...
    [   44.450000] systemd[1]: Condition check resulted in Kernel Configuration File System being skipped.
    [   44.520000] systemd[1]: Starting Apply Kernel Variables...
             Starting Apply Kernel Variables...
    [   44.610000] systemd[1]: Started Remount Root and Kernel File Systems.
    [  OK  ] Started Remount Root and Kernel File Systems.
    [   44.690000] systemd[1]: Started Journal Service.
    [  OK  ] Started Journal Service.
    [  OK  ] Mounted FUSE Control File System.
             Starting Flush Journal to Persistent Storage...
             Starting Load/Save Random Seed...
             Starting Create System Users...
    [   46.020000] systemd-journald[127]: Received client request to flush runtime journal.
    [  OK  ] Started Apply Kernel Variables.
    [  OK  ] Started Flush Journal to Persistent Storage.
    [  OK  ] Started udev Coldplug all Devices.
             Starting Helper to synchronize boot up for ifupdown...
    [  OK  ] Started Create System Users.
             Starting Create Static Device Nodes in /dev...
    [  OK  ] Started Helper to synchronize boot up for ifupdown.
    [  OK  ] Started Create Static Device Nodes in /dev.
    [  OK  ] Reached target Local File Systems (Pre).
    [  OK  ] Reached target Local File Systems.
             Starting Raise network interfaces...
             Starting Preprocess NFS configuration...
             Starting Create Volatile Files and Directories...
             Starting udev Kernel Device Manager...
    [  OK  ] Started Preprocess NFS configuration.
    [  OK  ] Reached target NFS client services.
    [  OK  ] Started Raise network interfaces.
    [  OK  ] Reached target Network.
    [  OK  ] Started Create Volatile Files and Directories.
    [  OK  ] Started udev Kernel Device Manager.
    [  OK  ] Started Entropy daemon using the HAVEGE algorithm.
             Starting RPC bind portmap service...
             Starting Network Time Synchronization...
             Starting Update UTMP about System Boot/Shutdown...
    [  OK  ] Started RPC bind portmap service.
    [  OK  ] Found device /dev/ttyS0.
    [  OK  ] Reached target Remote File Systems (Pre).
    [  OK  ] Reached target Remote File Systems.
    [  OK  ] Reached target RPC Port Mapper.
    [  OK  ] Started Update UTMP about System Boot/Shutdown.
    [  OK  ] Started Network Time Synchronization.
    [  OK  ] Reached target System Initialization.
    [  OK  ] Started Daily Cleanup of Temporary Directories.
    [  OK  ] Reached target System Time Set.
    [  OK  ] Reached target System Time Synchronized.
    [  OK  ] Started Daily apt download activities.
    [  OK  ] Started Daily apt upgrade and clean activities.
    [  OK  ] Started Periodic ext4 Onli…ata Check for All Filesystems.
    [  OK  ] Started Daily rotation of log files.
    [  OK  ] Reached target Timers.
    [  OK  ] Listening on D-Bus System Message Bus Socket.
    [  OK  ] Reached target Sockets.
    [  OK  ] Reached target Basic System.
    [  OK  ] Started Regular background program processing daemon.
    [  OK  ] Started D-Bus System Message Bus.
             Starting Remove Stale Onli…t4 Metadata Check Snapshots...
             Starting OpenBSD Secure Shell server...
             Starting Login Service...
             Starting Permit User Sessions...
    [  OK  ] Started Permit User Sessions.
    [  OK  ] Started Serial Getty on ttyS0.
    [  OK  ] Reached target Login Prompts.
    [  OK  ] Started Remove Stale Onlin…ext4 Metadata Check Snapshots.
    [   63.500000] random: crng init done
    [   63.500000] random: 7 urandom warning(s) missed due to ratelimiting
    [  OK  ] Started Load/Save Random Seed.
    [  OK  ] Started Login Service.
    
    Debian GNU/Linux bullseye/sid scr-debian ttyS0
    
    scr-debian login: sdk
    Password: sdk
    Linux scr-debian 4.19.166-46819-g5ceb3097ff34-dirty #1 SMP Wed Jun 2 16:52:27 MSK 2021 riscv64
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    Last login: Wed Jun  2 12:39:40 MSK 2021 on ttyS0
    sdk@scr-debian:~$
  4. Linux загружен и готов для использования.