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).
Этот процессор 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]
, включены в этот пакет.
Вы читаете его прямо сейчас.#### 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]
|
Просто скопируйте этот файл в ваш проект.
Базовая тестовая среда. Выполните 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/
находятся в общественном достоянии. Просто скопируйте то, что вам нужно.
Простые инструкционные тесты из riscv-tests.
Еще одно простое тестовое firmware, которое выполняет тест Dhrystone.
Простой пример SoC с использованием PicoRV32, который может выполнять код напрямую из памяти, отображенной в SPI-флэш.
Различные скрипты и примеры для различных (синтезируемых) инструментов и архитектур аппаратуры.
Следующие параметры модуля Verilog могут быть использованы для настройки ядра PicoRV32.
Этот параметр включает поддержку инструкций RDCYCLE[H]
, RDTIME[H]
и RDINSTRET[H]
. Если параметр ENABLE_COUNTERS
установлен в ноль, эти инструкции вызовут аппаратный трэп (как и любая другая не поддерживаемая инструкция).
Примечание: строго говоря, инструкции RDCYCLE[H]
, RDTIME[H]
и RDINSTRET[H]
не являются опциональными для ядра RV32I. Однако, вероятно, их отсутствие не будет замечено после отладки и профилирования приложения. Эти инструкции являются опциональными для ядра RV32E.
RDCYCLEH
, RDTIMEH
и RDINSTRETH
. Если этот параметр установлен в ноль, а параметр ENABLE_COUNTERS
установлен в единицу, будут доступны только инструкции RDCYCLE
, RDTIME
и RDINSTRET
.#### ENABLE_REGS_16_31 (по умолчанию = 1)Этот параметр включает поддержку регистров x16
..x31
. Язык программирования RV32E исключает эти регистры. Однако спецификация языка RV32E требует аппаратного трэпа при попытке доступа к этим регистрам. Это не реализовано в PicoRV32.
Файловая система регистров может быть реализована с двумя или одним входом для чтения. Двухпортовая файловая система регистров улучшает производительность, но может увеличить размер ядра.
Установите это значение в единицу, если mem_rdata
сохраняется стабильным внешними цепями после транзакции. В конфигурации по умолчанию ядро PicoRV32 ожидает, что вход mem_rdata
будет действителен в цикле с mem_valid && mem_ready
и внутренне латчит значение.
Этот параметр доступен только для ядра picorv32
. В ядрах picorv32_axi
и picorv32_wb
этот параметр неявно установлен в ноль.
По умолчанию операции сдвига выполняются в два этапа: сначала сдвигается на 4 бита, а затем на 1 бит. Это ускоряет операции сдвига, но добавляет дополнительное аппаратное обеспечение. Установите этот параметр в ноль, чтобы отключить двухэтапный сдвиг и еще больше уменьшить размер ядра.
TWO_STAGE_SHIFT
выше). При установке этого параметра используется сдвигатель Бауэра.Примечание: Включение этого параметра будет наиболее эффективным при включении ретайминга (также известного как "балансировка регистров") в потоке синтеза.
Этот параметр добавляет дополнительную стадию FF в путь данных ALU, улучшая временные характеристики за счёт добавления дополнительного цикла задержки для всех инструкций, использующих ALU.
Примечание: Включение этого параметра будет наиболее эффективным при включении ретайминга (также известного как "балансировка регистров") в потоке синтеза.
Этот параметр включает поддержку сжатого набора инструкций RISC-V.
Установите это значение в 0, чтобы отключить схему для обнаружения несогласованных доступов к памяти.
Установите это значение в 0, чтобы отключить схему для обнаружения нелегальных инструкций.
Ядро всё равно будет перехватывать инструкции EBREAK
с этим параметром, установленным в 0. При включённых прерываниях (IRQs) инструкция EBREAK
обычно вызывает прерывание IRQ 1. При этом параметре, установленном в 0, инструкция EBREAK
перехватит процессор без вызова прерывания.#### ENABLE_PCPI (по умолчанию = 0)
Установите это значение в 1, чтобы включить внешний интерфейс Pico Co-Processor Interface (PCPI). Внешний интерфейс не требуется для внутренних ядер PCPI, таких как picorv32_pcpi_mul
.
Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_mul
, которое реализует инструкции MUL[H[SU|U]]
. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.
Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_fast_mul
, которое реализует инструкции MUL[H[SU|U]]
. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.
Если ENABLE_MUL и ENABLE_FAST_MUL оба установлены, то значение ENABLE_MUL будет проигнорировано, и будет создан экземпляр ядра быстрого умножителя.
Этот параметр включает внутренний PCPI и создаёт экземпляр ядра picorv32_pcpi_div
, которое реализует инструкции DIV[U]/REM[U]
. Внешний интерфейс PCPI становится функциональным только при включении ENABLE_PCPI.
Установите это значение в 1 для включения ИРК. (см. "Пользовательские инструкции для обработки ИРК" ниже для обсуждения ИРК)
getq
и setq
. Без q-регистров адрес возврата ИРК будет храниться в x3 (gp), а маска ИРК — в x4 (tp), глобальном и поточном указателях согласно ABI RISC-V. Код, сгенерированный из обычного C-кода, не будет взаимодействовать с этими регистрами.Поддержка q-регистров всегда отключена, когда ENABLE_IRQ установлено в 0.Установите это значение в 1 для включения трассировки выполнения с помощью выходных портов trace_valid
и trace_data
. Для демонстрации этой функции выполните make test_vcd
для создания файла трассировки, а затем выполните python3 showtrace.py testbench.trace firmware/firmware.elf
для декодирования.
Установите это значение в 1 для инициализации всех регистров нулями (используя блок initial
Verilog). Это может быть полезно для симуляции или формальной верификации.
1 в этой маске соответствует постоянно отключенному ИРК.
1 в этой маске указывает, что соответствующий ИРК "запомнен", то есть когда линия ИРК высока только за один цикл, прерывание будет помечено как ожидающее и останется ожидающим до тех пор, пока обработчик прерывания не будет вызван (также известно как "пульсные прерывания" или "граничные прерывания").
Установите бит в этой маске в 0 для преобразования линии прерывания в работу как "уровневого чувствительного" прерывания.#### АДРЕС_СБРОСА_ПРОГ (по умолчанию = 32'h 0000_0000)
Начальный адрес программы.
Начальный адрес обработчика прерывания.
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 представляет собой простой интерфейс с сигналами 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) может быть использован для реализации неетапных инструкций в внешних ядрах:
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 для реального обработчика прерываний.
Эта инструкция копирует значение из регистра q в общий регистр.
0000000 ----- 000XX --- XXXXX 0001011
f7 rs2 qs f3 rd opcode
Пример:
getq x5, q2
Эта инструкция копирует значение из общего регистра в регистр q.
0000001 ----- XXXXX --- 000XX 0001011
f7 rs2 rs f3 qd opcode
Пример:
setq q2, x5
Возврат из обработчика прерываний. Эта инструкция копирует значение из q0
в счетчик программ и включает прерывания.
0000010 ----- 00000 --- 00000 0001011
f7 rs2 rs f3 rd opcode
Пример:
retirq
Регистр "IRQ Mask" содержит маску битов отключенных прерываний. Эта инструкция записывает новое значение в регистр маски прерываний и читает старое значение.
0000011 ----- XXXXX --- XXXXX 0001011
f7 rs2 rs f3 rd opcode
Пример:
maskirq x1, x2
Процессор начинает работу с отключенным режимом прерываний.
Нарушение инструкции или ошибка шины при отключенных прерываниях "illegal instruction" или "bus error" приведет к остановке процессора.
Приостановить выполнение до тех пор, пока не станет ожидающим прерывание. Маска ожидающих прерываний записывается в 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
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 C стандартной библиотеки.Используйте скрипт линковщика firmware/riscv.ld для связывания бинарных файлов с библиотекой newlib. Использование этого скрипта линковщика создаст бинарный файл, у которого точка входа находится по адресу 0x10000. (По умолчанию скрипт линковщика не имеет статической точки входа, поэтому нужен правильный ELF-загрузчик, который может определить точку входа в реальном времени при загрузке программы.)
Newlib включает несколько stub-функций системных вызовов. Вам нужно предоставить собственную реализацию этих системных вызовов и связать вашу программу с этой реализацией, перезаписывая стандартные stub-функции из newlib. См. syscalls.c
в scripts/cxxdemo/ для примера того, как это сделать.
Следующие оценки выполнены с использованием Vivado 2017.3.
Модуль 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 )