1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-picorv32

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

.github/workflows/ci.yml

PicoRV32 - Оптимизированный по размеру процессор RISC-V

PicoRV32 представляет собой ядро процессора, реализующее RISC-V RV32IMC Instruction Set. Оно может быть настроено как RV32E, RV32I, RV32IC, RV32IM или RV32IMC ядро, и по желанию может содержать встроенный контроллер прерываний.

Инструменты (gcc, binutils и т.д.) можно получить через сайт RISC-V. Примеры, включенные в PicoRV32, ожидают установки различных RV32 инструментальных цепочек в /opt/riscv32i[m][c]. Подробности см. в инструкциях по сборке ниже. Многие дистрибутивы Linux теперь включают инструменты для RISC-V (например, Ubuntu 20.04 имеет gcc-riscv64-unknown-elf). Чтобы собрать с помощью этих инструментов, установите TOOLCHAIN_PREFIX соответственно (например, make TOOLCHAIN_PREFIX=riscv64-unknown-elf-).

PicoRV32 является свободным и открытым аппаратным обеспечением, лицензированным под лицензией ISC (лицензия, схожая с лицензией MIT или двусловной лицензией BSD).

Содержание- Особенности и типичные применения


  • Малый размер (750-2000 LUTs в архитектуре Yö.Series Xilinx)
  • Высокая fmax (250-450 МГц на 7-Series Xilinx FPGAs)
  • Выбор между нативным интерфейсом памяти или AXI4-Lite мастером
  • Опциональная поддержка IRQ (с использованием простого пользовательского ISA)
  • Опциональный интерфейс ко-процессора

Этот процессор CPU предназначен для использования в качестве вспомогательного процессора в FPGA-проектах и ASIC. Благодаря высокой fmax он может быть интегрирован в большинство существующих проектов без перехода через домены часов. При работе на более низкой частоте, он будет иметь большое количество свободного времени и, следовательно, может быть добавлен в проект без ущерба для закрытия времени.

Для еще более компактного размера возможно отключить поддержку регистров x16..x31 а также инструкций RDCYCLE[H], RDTIME[H], и RDINSTRET[H], превращая процессор в ядро RV32E.

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

*Примечание: В архитектурах, которые реализуют файл регистров в отдельных памятных ресурсах, таких как многие FPGA, отключение 16 верхних регистров и/или отключение двухпортового файла регистров может не привести к дальнейшему уменьшению размера ядра.*Ядро существует в трех вариациях: picorv32, picorv32_axi и picorv32_wb. Первое предоставляет простой нативный интерфейс памяти, который легко использовать в простых средах. picorv32_axi предоставляет интерфейс мастера AXI-4 Lite, который легко интегрировать с существующими системами, уже использующими стандарт AXI. picorv32_wb предоставляет интерфейс мастера Wishbone.

Отдельное ядро picorv32_axi_adapter предоставляется для моста между нативным интерфейсом памяти и AXI4. Это ядро может быть использовано для создания пользовательских ядер, которые включают одно или несколько ядер PicoRV32 вместе с локальной RAM, ROM и периферией, отображенной в память, которые общаются друг с другом через нативный интерфейс, и общаются с внешним миром через AXI4.

Необязательная функцияIRQ может быть использована для реакции на события извне, реализации обработчиков ошибок или перехвата инструкций из более крупного ISA и эмуляции их в программном обеспечении.

Необязательный интерфейс Pico Co-Processor (PCPI) может быть использован для реализации инструкций без ветвления в внешнем ко-процессоре. Реализации ядер PCPI, которые реализуют инструкции расширения стандартного модуля MUL[H[SU|U]] и DIV[U]/REM[U], включены в этот пакет.

Файлы в этом репозитории

README.md

Вы читаете его прямо сейчас.#### picorv32.v

Этот файл Verilog содержит следующие модули Verilog:| Модуль | Описание | | ------------------------ | --------------------------------------------------------------------- | | picorv32 | ЦПУ PicoRV32 | | picorv32_axi | Версия ЦПУ с интерфейсом AXI4-Lite | | picorv32_axi_adapter | Адаптер от интерфейса памяти PicoRV32 к AXI4-Lite | | picorv32_wb | Версия ЦПУ с интерфейсом Wishbone Master | | picorv32_pcpi_mul | Ядро PCPI, реализующее инструкции MUL[H[SU\|U]] | | picorv32_pcpi_fast_mul | Версия picorv32_pcpi_fast_mul с умножителем за один цикл | | picorv32_pcpi_div | Ядро PCPI, реализующее инструкции DIV[U]/REM[U] |

Просто скопируйте этот файл в ваш проект.

Makefile и тестовые среды

Базовая тестовая среда. Выполните make test для запуска стандартного тестового бенча (testbench.v) в стандартных конфигурациях. Есть другие тестовые бенчи и конфигурации. См. цели test_* в файле Makefile для подробностей.

Выполните make test_ez для запуска testbench_ez.v, очень простого тестового бенча, который не требует внешнего файла firmware.hex. Это может быть полезно в средах, где компиляторная цепочка инструментов RISC-V недоступна.

Примечание: Тестовый бенч использует Icarus Verilog. Однако Icarus Verilog 0.9.7 (последняя версия на момент написания) имеет несколько ошибок, препятствующих запуску тестового бенча. Обновите до последней версии из github master Icarus Verilog для запуска тестового бенча.#### firmware/

Простое тестовое firmware. Это выполняет базовые тесты из tests/, некоторые C-коды, тесты обработки прерываний и умножительного ядра PCPI.

Все коды в firmware/ находятся в общественном достоянии. Просто скопируйте то, что вам нужно.

tests/

Простые инструкционные тесты из riscv-tests.

dhrystone/

Еще одно простое тестовое firmware, которое выполняет тест Dhrystone.

picosoc/

Простой пример SoC с использованием PicoRV32, который может выполнять код напрямую из памяти, отображенной в SPI-флэш.

scripts/

Различные скрипты и примеры для различных (синтезируемых) инструментов и архитектур аппаратуры.

Параметры модуля Verilog

Следующие параметры модуля Verilog могут быть использованы для настройки ядра PicoRV32.

ENABLE_COUNTERS (по умолчанию = 1)

Этот параметр включает поддержку инструкций RDCYCLE[H], RDTIME[H] и RDINSTRET[H]. Если параметр ENABLE_COUNTERS установлен в ноль, эти инструкции вызовут аппаратный трэп (как и любая другая не поддерживаемая инструкция).

Примечание: строго говоря, инструкции RDCYCLE[H], RDTIME[H] и RDINSTRET[H] не являются опциональными для ядра RV32I. Однако, вероятно, их отсутствие не будет замечено после отладки и профилирования приложения. Эти инструкции являются опциональными для ядра RV32E.

ENABLE_COUNTERS64 (по умолчанию = 1)Этот параметр включает поддержку инструкций RDCYCLEH, RDTIMEH и RDINSTRETH. Если этот параметр установлен в ноль, а параметр ENABLE_COUNTERS установлен в единицу, будут доступны только инструкции RDCYCLE, RDTIME и RDINSTRET.#### ENABLE_REGS_16_31 (по умолчанию = 1)

Этот параметр включает поддержку регистров x16..x31. Язык программирования RV32E исключает эти регистры. Однако спецификация языка RV32E требует аппаратного трэпа при попытке доступа к этим регистрам. Это не реализовано в PicoRV32.

ENABLE_REGS_DUALPORT (по умолчанию = 1)

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

LATCHED_MEM_RDATA (по умолчанию = 0)

Установите это значение в единицу, если mem_rdata сохраняется стабильным внешними цепями после транзакции. В конфигурации по умолчанию ядро PicoRV32 ожидает, что вход mem_rdata будет действителен в цикле с mem_valid && mem_ready и внутренне латчит значение.

Этот параметр доступен только для ядра picorv32. В ядрах picorv32_axi и picorv32_wb этот параметр неявно установлен в ноль.

TWO_STAGE_SHIFT (по умолчанию = 1)

По умолчанию операции сдвига выполняются в два этапа: сначала сдвигается на 4 бита, а затем на 1 бит. Это ускоряет операции сдвига, но добавляет дополнительное аппаратное обеспечение. Установите этот параметр в ноль, чтобы отключить двухэтапный сдвиг и еще больше уменьшить размер ядра.

BARREL_SHIFTER (по умолчанию = 0)По умолчанию операции сдвига выполняются последовательным сдвигом на небольшое количество бит (см. параметр TWO_STAGE_SHIFT выше). При установке этого параметра используется сдвигатель Бауэра.

TWO_CYCLE_COMPARE (по умолчанию = 0)Это немного ослабляет самую длинную путь данных, добавляя дополнительную стадию FF за счёт добавления дополнительного цикла задержки к условным инструкциям перехода.

Примечание: Включение этого параметра будет наиболее эффективным при включении ретайминга (также известного как "балансировка регистров") в потоке синтеза.

TWO_CYCLE_ALU (по умолчанию = 0)

Этот параметр добавляет дополнительную стадию FF в путь данных ALU, улучшая временные характеристики за счёт добавления дополнительного цикла задержки для всех инструкций, использующих ALU.

Примечание: Включение этого параметра будет наиболее эффективным при включении ретайминга (также известного как "балансировка регистров") в потоке синтеза.

COMPRESSED_ISA (по умолчанию = 0)

Этот параметр включает поддержку сжатого набора инструкций RISC-V.

CATCH_MISALIGN (по умолчанию = 1)

Установите это значение в 0, чтобы отключить схему для обнаружения несогласованных доступов к памяти.

CATCH_ILLINSN (по умолчанию = 1)

Установите это значение в 0, чтобы отключить схему для обнаружения нелегальных инструкций.

Ядро всё равно будет перехватывать инструкции EBREAK с этим параметром, установленным в 0. При включённых прерываниях (IRQs) инструкция EBREAK обычно вызывает прерывание IRQ 1. При этом параметре, установленном в 0, инструкция EBREAK перехватит процессор без вызова прерывания.#### ENABLE_PCPI (по умолчанию = 0)

Установите это значение в 1, чтобы включить внешний интерфейс Pico Co-Processor Interface (PCPI). Внешний интерфейс не требуется для внутренних ядер PCPI, таких как picorv32_pcpi_mul.

ENABLE_MUL (по умолчанию = 0)

Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_mul, которое реализует инструкции MUL[H[SU|U]]. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.

ENABLE_FAST_MUL (по умолчанию = 0)

Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_fast_mul, которое реализует инструкции MUL[H[SU|U]]. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.

Если ENABLE_MUL и ENABLE_FAST_MUL оба установлены, то значение ENABLE_MUL будет проигнорировано, и будет создан экземпляр ядра быстрого умножителя.

ENABLE_DIV (по умолчанию = 0)

Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_div, которое реализует инструкции DIV[U]/REM[U]. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.

ENABLE_IRQ (по умолчанию = 0)

Установите это значение в 1 для включения ИРК. (см. "Пользовательские инструкции для обработки ИРК" ниже для обсуждения ИРК)

ENABLE_IRQ_REG (по умолчанию = 1)Установите это значение в 0 для отключения поддержки инструкций getq и setq. Без q-регистров адрес возврата ИРК будет храниться в x3 (gp), а маска ИРК — в x4 (tp), глобальном и поточном указателях согласно ABI RISC-V. Код, сгенерированный из обычного C-кода, не будет взаимодействовать с этими регистрами.Поддержка q-регистров всегда отключена, когда ENABLE_IRQ установлено в 0.

ENABLE_TRACE (по умолчанию = 0)

Установите это значение в 1 для включения трассировки выполнения с помощью выходных портов trace_valid и trace_data. Для демонстрации этой функции выполните make test_vcd для создания файла трассировки, а затем выполните python3 showtrace.py testbench.trace firmware/firmware.elf для декодирования.

INIT_REGS_TO_ZERO (по умолчанию = 0)

Установите это значение в 1 для инициализации всех регистров нулями (используя блок initial Verilog). Это может быть полезно для симуляции или формальной верификации.

IRQ_MASK (по умолчанию = 32'h 0000_0000)

1 в этой маске соответствует постоянно отключенному ИРК.

LATCH_IRQ (по умолчанию = 32'h ffff_ffff)

1 в этой маске указывает, что соответствующий ИРК "запомнен", то есть когда линия ИРК высока только за один цикл, прерывание будет помечено как ожидающее и останется ожидающим до тех пор, пока обработчик прерывания не будет вызван (также известно как "пульсные прерывания" или "граничные прерывания").

Установите бит в этой маске в 0 для преобразования линии прерывания в работу как "уровневого чувствительного" прерывания.#### АДРЕС_СБРОСА_ПРОГ (по умолчанию = 32'h 0000_0000)

Начальный адрес программы.

АДРЕС_СБРОСА_ИРК (по умолчанию = 32'h 0000_0010)

Начальный адрес обработчика прерывания.

АДРЕС_СТЕК (по умолчанию = 32'h ffff_ffff)

Когда это значение параметра отличается от 0xffffffff, регистр x2 (указатель стека) инициализируется этим значением при сбросе. (Все остальные регистры остаются неинициализированными.) Обратите внимание, что RISC-V вызовная конвенция требует, чтобы указатель стека был выровнен на границы 16 байт (4 байта для вызовной конвенции soft float RV32I). Производительность по количеству тактов на инструкцию

Краткий напоминание: Это ядро оптимизировано по размеру и fmax, а не по производительности.

Если не указано иное, следующие числа относятся к PicoRV32 с активным ENABLE_REGS_DUALPORT и подключенным к памяти, которое может обслуживать запросы за один такт.

Среднее количество тактов на инструкцию (CPI) составляет примерно 4, в зависимости от соотношения инструкций в коде. Числа CPI для отдельных инструкций можно найти в таблице ниже. Столбец "CPI (SP)" содержит значения CPI для ядра, построенного без ENABLE_REGS_DUALPORT.| Инструкция | CPI | CPI (SP) | | ---------------------| ----:| --------:| | прямой переход (jal) | 3 | 3 | | ALU reg + немедленное значение | 3 | 3 | | ALU reg + reg | 3 | 4 | | ветвление (не выполнено) | 3 | 4 | | загрузка из памяти | 5 | 5 | | запись в память | 5 | 6 | | ветвление (выполнено) | 5 | 6 | | косвенный переход (jalr) | 6 | 6 | | операции сдвига | 4-14 | 4-15 |При активации ENABLE_MUL инструкция MUL выполнится за 40 тактов, а инструкция MULH[SU|U] выполнится за 72 такта.

При активации ENABLE_DIV инструкция DIV[U]/REM[U] выполнится за 40 тактов.

При активации BARREL_SHIFTER операция сдвига выполняется за тот же период времени, что и любая другая операция ALU.

Результаты тестирования Dhrystone для ядра с активными опциями ENABLE_FAST_MUL, ENABLE_DIV и BARREL_SHIFTER:

Результаты тестирования Dhrystone: 0,516 DMIPS/MHz (908 Dhrystones/Second/MHz)

Для тестирования Dhrystone среднее значение CPI составляет 4,100.

Без использования интерфейса памяти с прогнозированием (обычно требуется для максимальной частоты тактов), результаты уменьшаются до 0,305 DMIPS/MHz и 5,232 CPI.

Нативный интерфейс памяти PicoRV32

Нативный интерфейс памяти PicoRV32 представляет собой простой интерфейс с сигналами valid и ready, который может выполнять одну транзакцию памяти за раз:

output        mem_valid
output        mem_instr
input         mem_ready

output [31:0] mem_addr
output [31:0] mem_wdata
output [ 3:0] mem_wstrb
input  [31:0] mem_rdata

Ядро инициирует транзакцию памяти, устанавливая mem_valid. Сигнал valid остается активным до тех пор, пока противоположная сторона не установит mem_ready. Все выходы ядра стабильны на период mem_valid. Если транзакция памяти представляет собой загрузку инструкции, ядро устанавливает mem_instr.#### Чтение из памятиВ операции чтения значение mem_wstrb равно 0, а mem_wdata не используется.

Память считывает адрес mem_addr и делает считанные данные доступными на mem_rdata в тот цикл, когда mem_ready принимает значение 1.

Не требуется внешний цикл ожидания. Чтение из памяти может быть реализовано асинхронно, с тем чтобы mem_ready становился 1 в том же цикле, что и mem_valid, или mem_ready был привязан к постоянному значению 1.

Запись в память

В операции записи значение mem_wstrb не равно 0, а mem_rdata не используется. Память записывает данные из mem_wdata по адресу mem_addr и подтверждает операцию записи, устанавливая mem_ready.

Четыре бита mem_wstrb являются разрешениями записи для четырёх байт в адресованном слове. Возможны только 8 значений 0000, 1111, 1100, 0011, 1000, 0100, 0010, и 0001, то есть отсутствие записи, запись 32 бит, запись верхних 16 бит, запись нижних 16 бит, или запись одного байта соответственно.

Не требуется внешний цикл ожидания. Память может подтвердить запись немедленно, установив mem_ready в 1 в том же цикле, что и mem_valid, или mem_ready был привязан к постоянному значению 1.

Интерфейс прогнозирования

Ядро PicoRV32 также предоставляет "интерфейс прогнозирования памяти", который обеспечивает всю информацию о следующей операции памяти за один цикл до обычного интерфейса.

output        mem_la_read
output        mem_la_write
output [31:0] mem_la_addr
output [31:0] mem_la_wdata
output [ 3:0] mem_la_wstrbВ цикле перед тем, как `mem_valid` становится 1, этот интерфейс выдаёт импульс на `mem_la_read` или `mem_la_write`, чтобы указать начало операции чтения или записи в следующем цикле.

Примечание: Сигналы mem_la_read, mem_la_write, и mem_la_addr управляются комбинаторными цепочками внутри ядра PicoRV32. Возможно, будет сложнее достичь временной сходимости с интерфейсом прогнозирования, чем с обычным интерфейсом памяти, описанным выше.

Интерфейс ко-процессора Pico (PCPI)

Интерфейс ко-процессора Pico (PCPI) может быть использован для реализации неетапных инструкций в внешних ядрах:

output        pcpi_valid
output [31:0] pcpi_insn
output [31:0] pcpi_rs1
output [31:0] pcpi_rs2
input         pcpi_wr
input  [31:0] pcpi_rd
input         pcpi_wait
input         pcpi_ready

Когда встречается не поддерживаемая инструкция и функция PCPI активирована (см. ENABLE_PCPI выше), то pcpi_valid утверждается, инструкционное слово само по себе выводится на pcpi_insn, поля rs1 и rs2 декодируются, а значения в этих регистрах выводятся на pcpi_rs1 и pcpi_rs2.

Внешний модуль PCPI может затем декодировать инструкцию, выполнить её и утверждать pcpi_ready, когда выполнение инструкции завершено. По желанию значение результата может быть записано в pcpi_rd, а pcpi_wr утверждено. Модуль PicoRV32 декодирует поле rd инструкции и записывает значение из pcpi_rd в соответствующий регистр.Когда внешний модуль PCPI не подтверждает инструкцию в течение 16 тактов, то возникает исключение неподдерживаемой инструкции и вызывается соответствующий обработчик прерываний. Модуль PCPI, который требует более нескольких тактов для выполнения инструкции, должен утверждать pcpi_wait сразу после успешного декодирования инструкции и сохранять утверждение до тех пор, пока не утвердит pcpi_ready. Это предотвратит поднятие исключения неподдерживаемой инструкции модулем PicoRV32.

Пользовательские инструкции для обработки прерываний

Примечание: Функции обработки прерываний в PicoRV32 не соответствуют спецификации привилегированного языка RISC-V. Вместо этого используется небольшое количество очень простых пользовательских инструкций для реализации обработки прерываний с минимальными затратами на аппаратуру.

Следующие пользовательские инструкции поддерживаются только при включении прерываний через параметр ENABLE_IRQ (см. выше).

Модуль PicoRV32 имеет встроенный контроллер прерываний с bcm32 входами прерываний. Прерывание может быть активировано утверждением соответствующего бита в входе irq модуля.

Когда запускается обработчик прерываний, сигналы End Of Interrupt (EOI) для обработанных прерываний становятся высокими. Сигналы EOI снова становятся низкими, когда обработчик прерываний завершает работу.Прерывания 0-2 могут быть активированы внутренними источниками прерываний:

IRQ Источник прерывания
0 Прерывание таймера
1 EBREAK/ECALL или неподдерживаемая инструкция
2 Ошибка BUS (несоответствие доступа к памяти)

Эти прерывания также могут быть активированы внешними источниками, такими как сопроцессоры, подключенные через PCPI. Ядро имеет 4 дополнительных 32-битных регистра q0 .. q3, которые используются для обработки прерываний (IRQ). Когда обработчик прерываний вызывается, регистр q0 содержит адрес возврата, а q1 содержит маску битов всех прерываний, которые нужно обработать. Это означает, что один вызов обработчика прерываний может обслуживать более одного прерывания, если в q1 установлено более одного бита.

Когда поддержка сжатых инструкций включена, младший бит (LSB) регистра q0 устанавливается, если прерванная инструкция является сжатой инструкцией. Это может быть использовано, если обработчик прерываний хочет декодировать прерванную инструкцию.

Регистры q2 и q3 не инициализированы и могут использоваться как временное хранилище при сохранении/восстановлении значений регистров в обработчике прерываний.

Все следующие инструкции закодированы под опкодом custom0. Поля f3 и rs2 игнорируются во всех этих инструкциях.См. firmware/custom_ops.S для макросов GNU ассемблера, реализующих мнемоники для этих инструкций.

См. firmware/start.S для примера реализации обёртки обработчика прерываний на ассемблере, и firmware/irq.c для реального обработчика прерываний.

getq rd, qs

Эта инструкция копирует значение из регистра q в общий регистр.

0000000 ----- 000XX --- XXXXX 0001011
f7      rs2   qs    f3  rd    opcode

Пример:

getq x5, q2

setq qd, rs

Эта инструкция копирует значение из общего регистра в регистр q.

0000001 ----- XXXXX --- 000XX 0001011
f7      rs2   rs    f3  qd    opcode

Пример:

setq q2, x5

retirq

Возврат из обработчика прерываний. Эта инструкция копирует значение из q0 в счетчик программ и включает прерывания.

0000010 ----- 00000 --- 00000 0001011
f7      rs2   rs    f3  rd    opcode

Пример:

retirq

maskirq

Регистр "IRQ Mask" содержит маску битов отключенных прерываний. Эта инструкция записывает новое значение в регистр маски прерываний и читает старое значение.

0000011 ----- XXXXX --- XXXXX 0001011
f7      rs2   rs    f3  rd    opcode

Пример:

maskirq x1, x2

Процессор начинает работу с отключенным режимом прерываний.

Нарушение инструкции или ошибка шины при отключенных прерываниях "illegal instruction" или "bus error" приведет к остановке процессора.

waitirq

Приостановить выполнение до тех пор, пока не станет ожидающим прерывание. Маска ожидающих прерываний записывается в rd. 0000100 ----- 00000 --- XXXXX 0001011 f7 rs2 rs f3 rd opcode

Пример:

waitirq x1

таймер

Сбросить счетчик таймера на новое значение. Счетчик уменьшается на каждый такт и активирует прерывание таймера при переходе от 1 к 0. Установка счетчика в ноль отключает таймер. Старое значение счетчика записывается в rd.

0000101 ----- XXXXX --- XXXXX 0001011
f7      rs2   rs    f3  rd    opcode

Пример:

timer x1, x2

Сборка чистой цепочки инструментов RV32I

TL;DR: Выполните следующие команды для сборки полной цепочки инструментов:

make download-tools
make -j$(nproc) build-tools

По умолчанию скрипты сборки riscv-tools собирают компилятор, ассемблер и связыватель, которые могут быть нацелены на любую ISA RISC-V, но библиотеки собраны для целей RV32G и RV64G. Следуйте инструкциям ниже для сборки полной цепочки инструментов (включая библиотеки), нацеленной на чистый RV32I процессор.

Следующие команды соберут RISC-V GNU цепочку инструментов и библиотеки для чистого RV32I цели и установят их в /opt/riscv32i:

# Необходимые пакеты Ubuntu:
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev \
        libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \
    gperf libtool patchutils bc zlib1g-dev git libexpat1-dev

sudo mkdir /opt/riscv32i
sudo chown $USER /opt/riscv32i

git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i
cd riscv-gnu-toolchain-rv32i
git checkout 411d134
git submodule update --init --recursive    mkdir build; cd build
../configure --with-arch=rv32i --prefix=/opt/riscv32i
make -j$(nproc)

Команды будут названы с префиксом riscv32-unknown-elf-, что делает их легко устанавливаемыми рядом с обычными riscv-tools (те используют префикс riscv64-unknown-elf- по умолчанию).

В качестве альтернативы вы можете просто использовать одну из следующих целей make из Makefile PicoRV32 для сборки RV32I[M][C] цепочки инструментов. Вам все равно потребуется установить все предварительные условия, как описано выше. Затем выполните любую из следующих команд в директории исходного кода PicoRV32:

Команда Директория установки ISA
make -j$(nproc) build-riscv32i-tools /opt/riscv32i/ RV32I
make -j$(nproc) build-riscv32ic-tools /opt/riscv32ic/ RV32IC
make -j$(nproc) build-riscv32im-tools /opt/riscv32im/ RV32IM
make -j$(nproc) build-riscv32imc-tools /opt/riscv32imc/ RV32IMC

Или просто выполните make -j$(nproc) build-tools для сборки и установки всех четырех цепочек инструментов.

По умолчанию вызов любого из этих целей make (re-)скачивает исходные коды инструментов. Выполните make download-tools для предварительного скачивания исходных кодов в /var/cache/distfiles/.

Примечание: Эти инструкции предназначены для ревизии git 411d134 (2018-02-14) riscv-gnu-toolchain.

Связывание бинарных файлов с newlib для PicoRV32

Цепочки инструментов (см. последний раздел для инструкций по установке) включают версию newlib C стандартной библиотеки.Используйте скрипт линковщика firmware/riscv.ld для связывания бинарных файлов с библиотекой newlib. Использование этого скрипта линковщика создаст бинарный файл, у которого точка входа находится по адресу 0x10000. (По умолчанию скрипт линковщика не имеет статической точки входа, поэтому нужен правильный ELF-загрузчик, который может определить точку входа в реальном времени при загрузке программы.)

Newlib включает несколько stub-функций системных вызовов. Вам нужно предоставить собственную реализацию этих системных вызовов и связать вашу программу с этой реализацией, перезаписывая стандартные stub-функции из newlib. См. syscalls.c в scripts/cxxdemo/ для примера того, как это сделать.

Оценка: Время выполнения и использование ресурсов на Xilinx 7-Series FPGAs

Следующие оценки выполнены с использованием Vivado 2017.3.

Время выполнения на Xilinx 7-Series FPGAs

Модуль picorv32_axi с включенным TWO_CYCLE_ALU был размещен и маршрутизирован для устройств Xilinx Artix-7T, Kintex-7T, Virtex-7T, Kintex UltraScale и Virtex UltraScale всех скоростных классов. Используется двоичный поиск для нахождения наименьшего периода тактового сигнала, при котором дизайн соответствует времени выполнения.См. make table.txt в scripts/vivado/.| Устройство | Устройство | Уровень производительности | Период тактового сигнала (частота) | |:------------------------- |:---------------------|:----------:| --------------------:| | Xilinx Kintex-7T | xc7k70t-fbg676-2 | -2 | 2,4 нс (416 МГц) | | Xilinx Kintex-7T | xc7k70t-fbg676-3 | -3 | 2,2 нс (454 МГц) | | Xilinx Virtex-7T | xc7v585t-ffg1761-2 | -2 | 2,3 нс (434 МГц) | | Xilinx Virtex-7T | xc7v585t-ffg1761-3 | -3 | 2,2 нс (454 МГц) | | Xilinx Kintex UltraScale | xcku035-fbva676-2-e | -2 | 2,0 нс (500 МГц) | | Xilinx Kintex UltraScale | xcku035-fbva676-3-e | -3 | 1,8 нс (555 МГц) | | Xilinx Virtex UltraScale | xcvu065-ffvc1517-2-e | -2 | 2,1 нс (476 МГц) | | Xilinx Virtex UltraScale | xcvu065-ffvc1517-3-e | -3 | 2,0 нс (500 МГц) | | Xilinx Kintex UltraScale+ | xcku3p-ffva676-2-e | -2 | 1,4 нс (714 МГц) | | Xilinx Kintex UltraScale+ | xcku3p-ffva676-3-e | -3 | 1,3 нс (769 МГц) | | Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-2-e | -2 | 1,5 нс (666 МГц) | | Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-3-e | -3 | 1,4 нс (714 МГц) |#### Использование ресурсов на Xilinx 7-Series FPGAs

В следующей таблице приведено использование ресурсов в оптимизированном синтезе по площади для следующих трех ядер:

  • PicoRV32 (малое): Модуль picorv32 без инструкций счетчика, без двухэтапных сдвигов, с внешним синхронизацией mem_rdata и без перехвата несогласованных доступов к памяти и нелегальных инструкций.

  • PicoRV32 (обычное): Модуль picorv32 в стандартной конфигурации.

  • PicoRV32 (большое): Модуль picorv32 с включенными функциями PCPI, IRQ, MUL, DIV, BARREL_SHIFTER и COMPRESSED_ISA.

См. make area в scripts/vivado/.

Вариант ядра Slice LUTs LUTs как память Slice Registers
PicoRV32 (малое) 761 48 442
PicoRV32 (обычное) 917 48 583
PicoRV32 (большое) 2019 88 1085

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
ISC
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-picorv32.git
git@api.gitlife.ru:oschina-mirror/mirrors-picorv32.git
oschina-mirror
mirrors-picorv32
mirrors-picorv32
main