ESP-RISC-VCPU это 32-битное ядро, основанное на стандартных расширениях RISC-V ISA base integer (I), multiplication/division (M) и compressed (C). У ядра есть скалярный 4-стадийный конвейер (4-stage, in-order, scalar pipeline), оптимизированный для энергопотребления и производительности. Ядро CPU снабжено контроллером прерываний (INTC), модулем отладки (DM) и системной шиной (SYS BUS), осуществляющие интерфейс с памятью и периферийными устройствами.
Рис. 1-1. Блок-схема CPU.
AHB Advanced Hardware Bus, шина доступа к периферийным устройствам. DBUS шина доступа к данным. DM Debug Module, модуль отладки. DRAM доступ к памяти данных. IBUS шина доступа к инструкциям. INTC контроллер прерываний. IRAM доступ к памяти программ (инструкций). JTAG интерфейс для подключения отладчика. SBA System Bus Access, доступ к системной шине.
Функции CPU:
• Рабочая тактовая частота до 160 МГц. • Доступ к внутренней встроенной SRAM и кэшу с нулевыми циклами ожидания для доступа к программе и данным через интерфейс IRAM/DRAM. • Контроллер прерываний (INTC), у которого до 31 векторов прерываний с программируемым приоритетом и уровнями порога. • Модуль отладки (DM), совместимый со спецификацией RISC-V v0.13, поддерживающий внешний отладчик через стандартный порт JTAG/USB. • Прямой доступ отладчика к системной шине (SBA) для памяти и периферийных устройств. • Аппаратный триггер, совместимый со спецификацией отладки RISC-V v0.13, обеспечивающий до 8 точек останова и изменения ячеек памяти (breakpoints/watchpoints). • Физическая защита памяти (PMP), с возможностью конфигурации до 16 регионов. • 32-битная системная шина AHB для доступа к периферийным устройствам. • Конфигурируемые события для метрик производительности ядра.
[Карта адресов памяти]
В таблице 1-1 показано распределение адресного пространства для различных регионов, доступных со стороны CPU, предназначенных для инструкций, данных, системной шины периферийных устройств и отладки.
Таблица 1-1. CPU Address Map.
Регион
Описание
Начальный адрес
Конечный адрес
Доступ
DM
Debug Address Map
0x20000000
0x27FFFFFF
R/W
DRAM
Data Address Map
0x38000000
0x3FFFFFFF
R/W
IRAM
Instruction Address Map
0x40000000
0x47FFFFFF
R/W
AHB
AHB Address Map
*default
*default
R/W
Примечание *default: к адресу, не соответствующему любому из указанных регионов (IRAM, DRAM, DM), доступ осуществляется через шину AHB.
[Регистры конфигурации и состояния (CSR)]
Ниже в таблице перечислены регистры состояния и статуса CPU (Configuration and Status Registers, CSR). Кроме пользовательского счетчика производительности CSR, все реализованные регистры CSR придерживаются стандартному распределению полей бит, как это описано в руководстве "RISC-V Instruction Set Manual, Volume II: Privileged Architecture, Version 1.10". Следует отметить, что даже среди стандартных регистров CSR реализованы не все битовые поля, ограниченные подмножеством функций, реализованных в CPU. См. следующую секцию для подробного описания подмножества полей, реализованных в каждом из этих CSR.
Регистр
Описание
Адрес
Доступ
Machine Information CSR
mvendorid
Machine Vendor ID
0xF11
RO
marchid
Machine Architecture ID
0xF12
RO
mimpid
Machine Implementation ID
0xF13
RO
mhartid
Machine Hart ID
0xF14
RO
Machine Trap Setup CSR
mstatus
Machine Mode Status
0x300
R/W
misa(1)
Machine ISA
0x301
R/W
mtvec(2)
Machine Trap Vector
0x305
R/W
Machine Trap Handling CSR
mscratch
Machine Scratch
0x340
R/W
mepc
Machine Trap Program Counter
0x341
R/W
mcause(3)
Machine Trap Cause
0x342
R/W
mtval
Machine Trap Value
0x343
R/W
Physical Memory Protection (PMP) CSR
pmpcfg0
Конфигурация физической защиты памяти
0x3A0
R/W
pmpcfg1
0x3A1
R/W
pmpcfg2
0x3A2
R/W
pmpcfg3
0x3A3
R/W
pmpaddr0
Регистр адреса физической защиты памяти
0x3B0
R/W
pmpaddr1
0x3B1
R/W
..
..
..
pmpaddr15
0x3BF
R/W
Trigger Module CSRs (shared with Debug Mode)
tselect
Trigger Select Register
0x7A0
R/W
tdata1
Trigger Abstract Data 1
0x7A1
R/W
tdata2
Trigger Abstract Data 2
0x7A2
R/W
tcontrol
Global Trigger Control
0x7A5
R/W
Debug Mode CSR
dcsr
Debug Control and Status
0x7B0
R/W
dpc
Debug PC
0x7B1
R/W
dscratch0
Debug Scratch Register 0
0x7B2
R/W
dscratch1
Debug Scratch Register 1
0x7B3
R/W
Performance Counter CSRs (Custom)(4)
mpcer
Machine Performance Counter Event
0x7E0
R/W
mpcmr
Machine Performance Counter Mode
0x7E1
R/W
mpccr
Machine Performance Counter Count
0x7E2
R/W
GPIO Access CSRs (Custom)
cpu_gpio_oen
GPIO Output Enable
0x803
R/W
cpu_gpio_in
GPIO Input Value
0x804
RO
cpu_gpio_out
GPIO Output Value
0x805
R/W
Примечания:
(1) Хотя для misa указано, что для него реализован доступ и на чтение, и на запись (R/W), его поля жестко ограничены аппаратурой, и запись не дает никакого эффекта. Это то, что можно было назвать WARL (Write Any Read Legal) в терминологии RISC-V. (2) Регистр mtvec предоставляет только конфигурацию за перехват прерываний (trap handling) в режиме vectored, с базовым адресом, выровненным на 256 байт. (3) Идентификаторы внешних прерываний (External interrupt ID), отраженные в mcause, включают даже те ID, которые зарезервированы стандартом RISC-V для внутренних источников прерываний ядра. (4) Эти пользовательские CSR были реализованы в адресном пространстве, зарезервированном стандартом RISC-V для использования в программах пользователя.
Обратите внимание, что если делается попытка выполнения операции write/set/clear для любого из этих CSR, которые помечены "только для чтения" (read-only, RO), как показано в таблице выше, то CPU сгенерирует исключение недопустимой инструкции (illegal instruction exception).
Примечание: записать можно только младший бит. Запись в старший бит игнорируется, поскольку он напрямую привязан к младшему биту.
TW Timeout wait (таймаут ожидания) (R/W). Если этот бит установлен, выполнение инструкции WFI (Wait-for-Interrupt) в User приведет к исключению недопустимой инструкции (illegal instruction exception).
Exception Code Это поле автоматически обновляется уникальным ID последнего возникшего исключения или прерывания, из-за которого CPU вошел в (R/W). Возможны следующие значения ID исключений:
0x1: PMP Instruction access fault 0x2: Illegal Instruction 0x3: Hardware Breakpoint/Watchpoint or EBREAK 0x5: PMP Load access fault 0x7: PMP Store access fault 0x8: ECALL from U mode 0xb: ECALL from M mode
Примечание: Exception ID 0x0 (instruction access misaligned) не представлено, потому что CPU всегда маскирует младший бит адреса во время выборки инструкции.
Interrupt Flag Этот флаг автоматически обновляется, когда CPU входит в trap (R/W). Если флаг установлен, то это указывает, что произошел вход в trap из-за прерывания. Для исключений этот флаг остается не установленным.
Примечание: контроллер прерываний использует значения ID в диапазоне 1 .. 31 для всех внешних источников прерывания. Это отличается от стандарта RISC-V, где имеются зарезервированные ID в диапазоне 0 .. 15 для внутренних источников прерывания ядра.
MTVAL Machine trap value (значение ловушки прерывания) (R/W). Этот регистр автоматически обновится данными, зависящими от исключения, что может быть полезно для обработки исключений. Данные интерпретируются в зависимости от идентификаторов исключений (exception ID):
0x1: Faulting virtual address of instruction 0x2: Faulting instruction opcode 0x5: Faulting data address of load operation 0x7: Faulting data address of store operation
Примечание: значение в этом регистре недостоверно для других exception ID и для прерываний.
Примечание: каждый бит выбирает определенное события для инкремента счетчика. Если выбрано больше одного события, и они произошли одновременно, то счетчик прирастет только на единицу.
CPU_GPIO_IN GPIOn (n=0 .. 21) Input Value (входное значение). Это CPU CSR для чтения входного значения (1 = лог. 1, 0 = лог. 0) с ножки SoC GPIO. CPU_GPIO_IN[7:0] соответствует входным сигналам cpu_gpio_in[7:0] в таблице 5-1 Peripheral Signals via GPIO Matrix [1]. CPU_GPIO_IN[7:0] могут быть отображены на ножки GPIO только через GPIO matrix. Подробности см. в секции 5.4 главы "IO MUX and GPIO Matrix (GPIO, IO MUX)" [1] (RO).
CPU_GPIO_OUT GPIOn (n=0 .. 21) Output Value (выходное значение). Это CPU CSR для записи значения уровня (1 = лог. 1, 0 = лог. 0) на ножку SoC GPIO. Значение вступает в действие только когда установлен CPU_GPIO_OEN. CPU_GPIO_OUT[7:0] соответствуют выходным сигналам cpu_gpio_out[7:0] в таблице 5-1 Peripheral Signals via GPIO Matrix [1]. CPU_GPIO_OUT[7:0] можно отобразить на ножки GPIO только через GPIO matrix. Подробности см. в секции 5.5 главы "IO MUX and GPIO Matrix (GPIO, IO MUX)" [1] (R/W).