Хабрахабр

nanoFOX — простое RISC-V совместимое ядро

вчера в 17:19

  • Программирование,
  • FPGA

Небольшое вступление:

На данном мероприятии проводилось знакомство с текущими языками описания аппаратуры (Verilog HDL и VHDL), а также с небольшим процессорным ядром schoolMIPS. Идея написания собственного ядра появилась после прохождения школы-семинара по цифровой схемотехнике в городе Томске. Вследствие роста популярности RISC-V и открытости его системы команд (MIPS на момент начала написания ядра не имел открытую систему команд) для осуществления разработки будущего ядра был выбран набор инструкций RISC-V, а именно RV32I. Для понимания устройства ядер было принято решение изобрести собственный велосипед, следуя по пути развития schoolMIPS, но взяв за основу другую систему команд. Также данный проект задумывался как образовательный, поэтому было решено по максимуму увеличить наглядность работы ядра для эффективной демонстрации его работы. RV32I имеет небольшой набор базовых инструкций (37 без учёта специальных) и при желании его можно расширить, например, добавив инструкции целочисленного умножения и деления (RV32M) или поддержку сокращённых инструкций (compressed instructions) (RV32C).

По аналогии с schoolMIPS были реализованы следующие версии ядра:

  1. Однотактная версия (00_simple_risc_v_cpu).
  2. Однотактная версия с поддержкой инструкций lw/sw (load word/store word) (01_simple_risc_v_cpu_lwsw).
  3. Конвейерная версия (5-ти стадийный конвейер) (02_pipe_risc_v_cpu).

На текущий момент описывается следующая версия ядра (03_pipe_risc_v_cpu_fc) с полным набором команд RV32I (без учёта некоторых специальных).

Краткая информация:

На данный момент реализованы следующие методы: В ходе описания ядра продумывались пути повышения наглядности работы, отладки и верификации.

  1. Включение данного модуля позволяет одновременно отслеживать значение 32 регистров на экране монитора, что не возможно при использовании вывода информации на семисегментные индикаторы. Добавление отладочного текстового VGA модуля (для двух однотактных веток ядра). На рисунках представленных снизу ядро выполняет подсчёт чисел Леонардо и производится вывод информации на соответствующий отладочный модуль;

    hex_display and DebugScreenCore

    Вывод информации на семисегментные индикаторы:image
    Вывод информации на VGA дисплей:image

  2. Данный метод позволяет лучше анализировать работу ядра на первых стадиях разработки, но не всегда является удобным; Добавление вывода сообщений в терминал симулятора о состоянии регистрового файла и исполняемых на текущий момент инструкциях.

    Терминал

    Инициализация регистрового файла:image
    Изменение значение sp:image

  3. При помощи этих строковых переменных разработчик может отслеживать правильное выставление управляющих сигналов на всех стадиях конвейера; Добавление строковых переменных на waveform с отображением исполняемых инструкций.

    Waveform

    Инициализация регистрового файла:image
    Изменение значения sp:image

  4. Состояние регистрового файла представляется в табличном виде, а также обозначается инструкция/инструкции, выполняемые на текущий момент ядром. Добавление возможности записи отладочной информации о состоянии ядра в текстовый файл. Является аналогом 2 пункта, но позволяет производить больше манипуляций с полученной информацией;

    Текстовый файл

    Инициализация регистрового файла:image
    Изменение значения sp:image

  5. Состояние регистрового файла представляется в табличном виде с пометками об изменении значений ячеек, а также выводятся инструкции, выполняемые на текущий момент ядром. Добавление возможности записи отладочной информации о состоянии ядра в HTML файл. Как можно видеть на картинках снизу в случае, если значение регистра было не определено, то подсветка регистров осуществляется красным цветом ( регистры s0/fp — t6 ). Является аналогом пунктов 2 и 4, но в дополнении к ним позволяет удобно указывать на изменение данных. На 17 цикле значение регистра s0/fp изменяется и ячейка подсвечивается зелёным цветом.
    На 41 цикле в регистр sp загружается значение 0x00010000.

    HTML файл

    Инициализация регистрового файла: image
    Изменение значения sp:image

Сравнение веток ядра:

Поддерживаемые инструкции ядра на текущий момент для разных веток:

Поддерживаемая периферия:

Поддерживаемые языки для написания программ:

Развитие проекта.

Что планируется сделать в будущем:

  1. добавить все инструкции RV32I (на стадии описания);
  2. реализовать отладку;
  3. добавить DMA (ПДП) контроллер;
  4. добавить поддержка других шин AXI, Avalon, Wishbone;
  5. добавить cache (КЭШ) память;
  6. интегрировать различную периферию (SPI, TWI (I2C), Ethernet(10 base-t));
  7. добавить контроллер прерываний;
  8. портировать разные версии на другие отладочные платы;
  9. добавить другие методы повышения наглядности работы ядра;
  10. запуск RTOS, например zephyr.

Также принимаются рекомендации и предложения по развитию ядра.

Ссылка на репозиторий: nanoFOX.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Теги:

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть