- PVSM.RU - https://www.pvsm.ru -
Идея написания собственного ядра появилась после прохождения школы-семинара по цифровой схемотехнике в городе Томске [1]. На данном мероприятии проводилось знакомство с текущими языками описания аппаратуры (Verilog HDL и VHDL), а также с небольшим процессорным ядром schoolMIPS [2]. Для понимания устройства ядер было принято решение изобрести собственный велосипед, следуя по пути развития schoolMIPS, но взяв за основу другую систему команд. Вследствие роста популярности RISC-V и открытости его системы команд (MIPS на момент начала написания ядра не имел открытую систему команд) для осуществления разработки будущего ядра был выбран набор инструкций RISC-V, а именно RV32I. RV32I имеет небольшой набор базовых инструкций (37 без учёта специальных) и при желании его можно расширить, например, добавив инструкции целочисленного умножения и деления (RV32M) или поддержку сокращённых инструкций (compressed instructions) (RV32C). Также данный проект задумывался как образовательный, поэтому было решено по максимуму увеличить наглядность работы ядра для эффективной демонстрации его работы.
По аналогии с schoolMIPS были реализованы следующие версии ядра:
На текущий момент описывается следующая версия ядра (03_pipe_risc_v_cpu_fc) с полным набором команд RV32I (без учёта некоторых специальных).
В ходе описания ядра продумывались пути повышения наглядности работы, отладки и верификации. На данный момент реализованы следующие методы:
Добавление отладочного текстового VGA модуля (для двух однотактных веток ядра). Включение данного модуля позволяет одновременно отслеживать значение 32 регистров на экране монитора, что не возможно при использовании вывода информации на семисегментные индикаторы. На рисунках представленных снизу ядро выполняет подсчёт чисел Леонардо и производится вывод информации на соответствующий отладочный модуль;
Добавление вывода сообщений в терминал симулятора о состоянии регистрового файла и исполняемых на текущий момент инструкциях. Данный метод позволяет лучше анализировать работу ядра на первых стадиях разработки, но не всегда является удобным;
Добавление строковых переменных на waveform с отображением исполняемых инструкций. При помощи этих строковых переменных разработчик может отслеживать правильное выставление управляющих сигналов на всех стадиях конвейера;
Добавление возможности записи отладочной информации о состоянии ядра в текстовый файл. Состояние регистрового файла представляется в табличном виде, а также обозначается инструкция/инструкции, выполняемые на текущий момент ядром. Является аналогом 2 пункта, но позволяет производить больше манипуляций с полученной информацией;
Добавление возможности записи отладочной информации о состоянии ядра в HTML файл. Состояние регистрового файла представляется в табличном виде с пометками об изменении значений ячеек, а также выводятся инструкции, выполняемые на текущий момент ядром. Является аналогом пунктов 2 и 4, но в дополнении к ним позволяет удобно указывать на изменение данных. Как можно видеть на картинках снизу в случае, если значение регистра было не определено, то подсветка регистров осуществляется красным цветом ( регистры s0/fp — t6 ). На 17 цикле значение регистра s0/fp изменяется и ячейка подсвечивается зелёным цветом.
На 41 цикле в регистр sp загружается значение 0x00010000.
Поддерживаемые инструкции ядра на текущий момент для разных веток:
Инструкция | 00_simple_risc_v_cpu | 01_simple_risc_v_cpu_lwsw | 02_pipe_risc_v_cpu |
---|---|---|---|
add | + | + | + |
and | - | - | + |
sll | - | - | + |
or | + | + | + |
addi | + | + | + |
ori | - | - | + |
slli | + | + | + |
lw | - | + | + |
jalr | - | - | + |
lui | + | + | + |
beq | + | + | + |
bne | - | - | + |
sw | - | + | + |
jal | - | - | + |
sub | + | + | - |
Поддерживаемая периферия:
Периферия | 00_simple_risc_v_cpu | 01_simple_risc_v_cpu_lwsw | 02_pipe_risc_v_cpu |
---|---|---|---|
RAM | - | + | + |
PWM | - | + | + |
GPIO | - | + | + |
UART | - | - | + |
Поддерживаемые языки для написания программ:
Язык | 00_simple_risc_v_cpu | 01_simple_risc_v_cpu_lwsw | 02_pipe_risc_v_cpu |
---|---|---|---|
Assembler | + | + | + |
C | - | - | + |
Что планируется сделать в будущем:
Также принимаются рекомендации и предложения по развитию ядра.
Ссылка на репозиторий: nanoFOX [14].
Автор: Dmitriy0111
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/318376
Ссылки в тексте:
[1] школы-семинара по цифровой схемотехнике в городе Томске: https://habr.com/ru/post/345286/
[2] schoolMIPS: https://github.com/MIPSfpga/schoolMIPS
[3] Image: https://habrastorage.org/webt/7r/at/zo/7ratzo8oi49q1f_ek3jt-ruzds4.gif
[4] Image: https://habrastorage.org/webt/_z/bf/ya/_zbfyafwvt-iiqcyldocwdejy9u.gif
[5] Image: https://habrastorage.org/webt/od/27/en/od27enfo2ibej0nvimcacjcdrco.png
[6] Image: https://habrastorage.org/webt/dx/5v/mo/dx5vmozlintg2jroatbavwu5vm4.png
[7] Image: https://habrastorage.org/webt/4f/u2/qt/4fu2qtvi_h4om4jam78ly4zk-vg.png
[8] Image: https://habrastorage.org/webt/fm/di/fk/fmdifk9sfizk1tdf1rkcwpf_7yu.png
[9] Image: https://habrastorage.org/webt/ob/wp/i_/obwpi_h38heumilss3rumhiau8i.png
[10] Image: https://habrastorage.org/webt/ua/wa/qb/uawaqbhqgb3v_rsn0i9re3hkaas.png
[11] Image: https://habrastorage.org/webt/d7/96/v4/d796v4kj0t_pcfhbepzqndka8ny.png
[12] Image: https://habrastorage.org/webt/dc/dd/9c/dcdd9c7vu-rd8tkzfjggwffwhe0.png
[13] zephyr: https://www.zephyrproject.org
[14] nanoFOX: https://github.com/Dmitriy0111/nanoFOX
[15] Источник: https://habr.com/ru/post/451388/?utm_campaign=451388
Нажмите здесь для печати.