Перейти к содержанию

Регистры TRNG RP2350

Регистры генератора истинно случайных чисел RP2350 на IP-блоке Arm TrustZone TRNG: запуск, 192 бита энтропии за один цикл генерации, три встроенные проверки качества, прерывания и настройка кольцевого генератора.

TRNG собирает случайные биты, периодически считывая собственный кольцевой генератор, который работает асинхронно с системной частотой. Блок соответствует FIPS 140-2, BSI AIS-31 и NIST SP 800-90B и при 150 МГц даёт около 7,5 кбит/с энтропии; за один цикл генерации получается 192 бита в регистрах EHR_DATA0–EHR_DATA5 (даташит RP2350, раздел 12.12).

Генерацию запускает бит RND_SRC_EN в RND_SOURCE_ENABLE. Она идёт до готового результата или до отказа одной из трёх проверок — фон Неймана (32 одинаковых бита подряд), CRNGT (два одинаковых 16-битных блока подряд) или автокорреляции; итог показывает RNG_ISR. Пока результата нет, EHR_DATA читаются как 0; чтение EHR_DATA5 очищает все шесть регистров. После генерации RND_SRC_EN сбрасывают.

Длину цепочки кольцевого генератора выбирает TRNG_CONFIG, период выборки — SAMPLE_CNT1. Для среднего времени генерации около 2 мс даташит советует длину цепочки 0 или 1 и период 20–25. Загрузочное ПЗУ работает иначе: отключает проверки и передаёт сырые выборки кольцевого генератора в ускоритель SHA-256.

ЭкземплярБазовый адрес
TRNG0x400F 0000

Регистры блока

РегистрСмещениеНазначениеПосле сброса
TRNG_RNG_IMR0x0100Маски прерываний0x0000 000F
TRNG_RNG_ISR0x0104Состояние: готовность и ошибки проверок0x0000 0000
TRNG_RNG_ICR0x0108Сброс флагов состояния0x0000 0000
TRNG_TRNG_CONFIG0x010CДлина цепочки кольцевого генератора0x0000 0000
TRNG_TRNG_VALID0x0110Готовность 192 бит0x0000 0000
TRNG_EHR_DATA00x0114Собранная энтропия, биты 31:00x0000 0000
TRNG_EHR_DATA10x0118Собранная энтропия, биты 63:320x0000 0000
TRNG_EHR_DATA20x011CСобранная энтропия, биты 95:640x0000 0000
TRNG_EHR_DATA30x0120Собранная энтропия, биты 127:960x0000 0000
TRNG_EHR_DATA40x0124Собранная энтропия, биты 159:1280x0000 0000
TRNG_EHR_DATA50x0128Собранная энтропия, биты 191:1600x0000 0000
TRNG_RND_SOURCE_ENABLE0x012CВключение источника энтропии0x0000 0000
TRNG_SAMPLE_CNT10x0130Период выборки кольцевого генератора0x0000 FFFF
TRNG_AUTOCORR_STATISTIC0x0134Статистика теста автокорреляции0x0000 0000
TRNG_TRNG_DEBUG_CONTROL0x0138Обход проверок0x0000 0000
TRNG_TRNG_SW_RESET0x0140Программный сброс генератора0x0000 0000
TRNG_RNG_DEBUG_EN_INPUT0x01B4Отладочный режим0x0000 0000
TRNG_TRNG_BUSY0x01B8Генератор занят0x0000 0000
TRNG_RST_BITS_COUNTER0x01BCСброс счётчика собранных битов0x0000 0000
TRNG_RNG_VERSION0x01C0Конфигурация IP-блока0x0000 0000
TRNG_RNG_BIST_CNTR_00x01E0Результат самопроверки 00x0000 0000
TRNG_RNG_BIST_CNTR_10x01E4Результат самопроверки 10x0000 0000
TRNG_RNG_BIST_CNTR_20x01E8Результат самопроверки 20x0000 0000

TRNG_RNG_IMR — маски прерываний

Смещение 0x0100, адрес 0x400F 0100, после сброса 0x0000 000F. Макросы pico-sdk: TRNG_RNG_IMR_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDVN_ERR_INT_MASKCRNGT_ERR_INT_MASKAUTOCORR_ERR_INT_MASKEHR_VALID_INT_MASK
  • RESERVED (биты 31:4, только чтение, после сброса 0x0000000) — Зарезервировано.
  • VN_ERR_INT_MASK (бит 3, чтение и запись, после сброса 0x1) — Маска прерывания по ошибке фон Неймана: 1 — прерывания нет.
  • CRNGT_ERR_INT_MASK (бит 2, чтение и запись, после сброса 0x1) — Маска прерывания по ошибке CRNGT: 1 — прерывания нет.
  • AUTOCORR_ERR_INT_MASK (бит 1, чтение и запись, после сброса 0x1) — Маска прерывания по ошибке автокорреляции: 1 — прерывания нет.
  • EHR_VALID_INT_MASK (бит 0, чтение и запись, после сброса 0x1) — Маска прерывания по готовности 192 бит: 1 — прерывания нет.

TRNG_RNG_ISR — состояние: готовность и ошибки проверок

Смещение 0x0104, адрес 0x400F 0104, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_ISR_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDVN_ERRCRNGT_ERRAUTOCORR_ERREHR_VALID
  • RESERVED (биты 31:4, только чтение, после сброса 0x0000000) — Зарезервировано.
  • VN_ERR (бит 3, только чтение, после сброса 0x0) — Ошибка фон Неймана: 32 одинаковых бита подряд.
  • CRNGT_ERR (бит 2, только чтение, после сброса 0x0) — Ошибка CRNGT: два одинаковых 16-битных блока подряд.
  • AUTOCORR_ERR (бит 1, только чтение, после сброса 0x0) — Тест автокорреляции не прошёл четыре раза подряд — генератор не работает до сброса.
  • EHR_VALID (бит 0, только чтение, после сброса 0x0) — Собрано 192 бита, их можно читать.

TRNG_RNG_ICR — сброс флагов состояния

Смещение 0x0108, адрес 0x400F 0108, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_ICR_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDVN_ERRCRNGT_ERRAUTOCORR_ERREHR_VALID
  • RESERVED (биты 31:4, только чтение, после сброса 0x0000000) — Зарезервировано.
  • VN_ERR (бит 3, чтение и запись, после сброса 0x0) — Запись 1 сбрасывает VN_ERR в RNG_ISR.
  • CRNGT_ERR (бит 2, чтение и запись, после сброса 0x0) — Запись 1 сбрасывает CRNGT_ERR в RNG_ISR.
  • AUTOCORR_ERR (бит 1, чтение и запись, после сброса 0x0) — Программно не сбрасывается — только сбросом генератора.
  • EHR_VALID (бит 0, чтение и запись, после сброса 0x0) — Запись 1 сбрасывает EHR_VALID в RNG_ISR.

TRNG_TRNG_CONFIG — длина цепочки кольцевого генератора

Смещение 0x010C, адрес 0x400F 010C, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_TRNG_CONFIG_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDRND_SRC_SEL
  • RESERVED (биты 31:2, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • RND_SRC_SEL (биты 1:0, чтение и запись, после сброса 0x0) — Длина цепочки инверторов кольцевого генератора — один из четырёх вариантов.

TRNG_TRNG_VALID — готовность 192 бит

Смещение 0x0110, адрес 0x400F 0110, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_TRNG_VALID_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDEHR_VALID
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • EHR_VALID (бит 0, только чтение, после сброса 0x0) — Сбор битов завершён, EHR_DATA можно читать.

TRNG_EHR_DATA0 — собранная энтропия, биты 31:0

Смещение 0x0114, адрес 0x400F 0114, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA0_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_EHR_DATA1 — собранная энтропия, биты 63:32

Смещение 0x0118, адрес 0x400F 0118, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA1_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_EHR_DATA2 — собранная энтропия, биты 95:64

Смещение 0x011C, адрес 0x400F 011C, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA2_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_EHR_DATA3 — собранная энтропия, биты 127:96

Смещение 0x0120, адрес 0x400F 0120, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA3_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_EHR_DATA4 — собранная энтропия, биты 159:128

Смещение 0x0124, адрес 0x400F 0124, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA4_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_EHR_DATA5 — собранная энтропия, биты 191:160

Смещение 0x0128, адрес 0x400F 0128, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: TRNG_EHR_DATA5_…

Значение занимает регистр целиком, отдельных полей нет.

TRNG_RND_SOURCE_ENABLE — включение источника энтропии

Смещение 0x012C, адрес 0x400F 012C, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RND_SOURCE_ENABLE_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDRND_SRC_EN
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • RND_SRC_EN (бит 0, чтение и запись, после сброса 0x0) — Включение источника энтропии — запуск генерации.

TRNG_SAMPLE_CNT1 — период выборки кольцевого генератора

Смещение 0x0130, адрес 0x400F 0130, после сброса 0x0000 FFFF. Макросы pico-sdk: TRNG_SAMPLE_CNT1_…

  • SAMPLE_CNTR1 (биты 31:0, чтение и запись, после сброса 0x0000 FFFF) — Тактов между двумя выборками кольцевого генератора; при обходе балансировщика фон Неймана — не меньше 17.

TRNG_AUTOCORR_STATISTIC — статистика теста автокорреляции

Смещение 0x0134, адрес 0x400F 0134, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_AUTOCORR_STATISTIC_…

31302928272625242322212019181716
RESERVEDAUTOCORR_FAILS
1514131211109876543210
AUTOCORR_FAILSAUTOCORR_TRYS
  • RESERVED (биты 31:22, только чтение, после сброса 0x000) — Зарезервировано.
  • AUTOCORR_FAILS (биты 21:14, чтение и запись, после сброса 0x00) — Число отказов теста автокорреляции; любая запись в регистр обнуляет счётчики.
  • AUTOCORR_TRYS (биты 13:0, чтение и запись, после сброса 0x0000) — Число запусков теста автокорреляции.

TRNG_TRNG_DEBUG_CONTROL — обход проверок

Смещение 0x0138, адрес 0x400F 0138, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_TRNG_DEBUG_CONTROL_…

1514131211109876543210
—AUTO_CORRELATE_BYPASSTRNG_CRNGT_BYPASSVNC_BYPASSRESERVED
  • AUTO_CORRELATE_BYPASS (бит 3, чтение и запись, после сброса 0x0) — Обход теста автокорреляции.
  • TRNG_CRNGT_BYPASS (бит 2, чтение и запись, после сброса 0x0) — Обход теста CRNGT.
  • VNC_BYPASS (бит 1, чтение и запись, после сброса 0x0) — Обход балансировщика фон Неймана вместе с проверкой 32 одинаковых битов.
  • RESERVED (бит 0, только чтение, после сброса 0x0) — Зарезервировано.

TRNG_TRNG_SW_RESET — программный сброс генератора

Смещение 0x0140, адрес 0x400F 0140, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_TRNG_SW_RESET_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDTRNG_SW_RESET
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • TRNG_SW_RESET (бит 0, чтение и запись, после сброса 0x0) — Запись 1 сбрасывает генератор.

TRNG_RNG_DEBUG_EN_INPUT — отладочный режим

Смещение 0x01B4, адрес 0x400F 01B4, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_DEBUG_EN_INPUT_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDRNG_DEBUG_EN
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • RNG_DEBUG_EN (бит 0, чтение и запись, после сброса 0x0) — Отладочный режим генератора.

TRNG_TRNG_BUSY — генератор занят

Смещение 0x01B8, адрес 0x400F 01B8, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_TRNG_BUSY_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDTRNG_BUSY
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • TRNG_BUSY (бит 0, только чтение, после сброса 0x0) — Генератор занят.

TRNG_RST_BITS_COUNTER — сброс счётчика собранных битов

Смещение 0x01BC, адрес 0x400F 01BC, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RST_BITS_COUNTER_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDRST_BITS_COUNTER
  • RESERVED (биты 31:1, только чтение, после сброса 0x0000 0000) — Зарезервировано.
  • RST_BITS_COUNTER (бит 0, чтение и запись, после сброса 0x0) — Любая запись сбрасывает счётчик собранных битов и готовность; RND_SRC_EN при этом должен быть сброшен.

TRNG_RNG_VERSION — конфигурация IP-блока

Смещение 0x01C0, адрес 0x400F 01C0, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_VERSION_…

31302928272625242322212019181716
RESERVED
1514131211109876543210
RESERVEDRNG_USE_5_SBOXESRESEEDING_EXISTSKAT_EXISTSPRNG_EXISTSTRNG_TESTS_BYPASS_ENAUTOCORR_EXISTSCRNGT_EXISTSEHR_WIDTH_192
  • RESERVED (биты 31:8, только чтение, после сброса 0x000000) — Зарезервировано.
  • RNG_USE_5_SBOXES (бит 7, только чтение, после сброса 0x0) — AES с 5 S-блоками (1) или с 20 (0).
  • RESEEDING_EXISTS (бит 6, только чтение, после сброса 0x0) — Есть повторная инициализация (reseeding).
  • KAT_EXISTS (бит 5, только чтение, после сброса 0x0) — Есть самопроверка на известных ответах (KAT).
  • PRNG_EXISTS (бит 4, только чтение, после сброса 0x0) — Есть генератор псевдослучайных чисел.
  • TRNG_TESTS_BYPASS_EN (бит 3, только чтение, после сброса 0x0) — Тесты можно обходить.
  • AUTOCORR_EXISTS (бит 2, только чтение, после сброса 0x0) — Есть тест автокорреляции.
  • CRNGT_EXISTS (бит 1, только чтение, после сброса 0x0) — Есть тест CRNGT.
  • EHR_WIDTH_192 (бит 0, только чтение, после сброса 0x0) — Ширина EHR: 1 — 192 бита, 0 — 128.

TRNG_RNG_BIST_CNTR_0 — результат самопроверки 0

Смещение 0x01E0, адрес 0x400F 01E0, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_BIST_CNTR_0_…

31302928272625242322212019181716
RESERVEDROSC_CNTR_VAL
1514131211109876543210
ROSC_CNTR_VAL
  • RESERVED (биты 31:22, только чтение, после сброса 0x000) — Зарезервировано.
  • ROSC_CNTR_VAL (биты 21:0, только чтение, после сброса 0x000000) — Счётчик встроенной самопроверки (BIST) генератора.

TRNG_RNG_BIST_CNTR_1 — результат самопроверки 1

Смещение 0x01E4, адрес 0x400F 01E4, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_BIST_CNTR_1_…

31302928272625242322212019181716
RESERVEDROSC_CNTR_VAL
1514131211109876543210
ROSC_CNTR_VAL
  • RESERVED (биты 31:22, только чтение, после сброса 0x000) — Зарезервировано.
  • ROSC_CNTR_VAL (биты 21:0, только чтение, после сброса 0x000000) — Счётчик встроенной самопроверки (BIST) генератора.

TRNG_RNG_BIST_CNTR_2 — результат самопроверки 2

Смещение 0x01E8, адрес 0x400F 01E8, после сброса 0x0000 0000. Макросы pico-sdk: TRNG_RNG_BIST_CNTR_2_…

31302928272625242322212019181716
RESERVEDROSC_CNTR_VAL
1514131211109876543210
ROSC_CNTR_VAL
  • RESERVED (биты 31:22, только чтение, после сброса 0x000) — Зарезервировано.
  • ROSC_CNTR_VAL (биты 21:0, только чтение, после сброса 0x000000) — Счётчик встроенной самопроверки (BIST) генератора.

Частые вопросы

Как получить случайное число от TRNG RP2350?

Установите RND_SRC_EN в RND_SOURCE_ENABLE и дождитесь EHR_VALID в RNG_ISR — или прерывания, если оно разрешено в RNG_IMR. Прочитайте 192 бита из EHR_DATA0–EHR_DATA5 и сбросьте RND_SRC_EN; если проверка не прошла, результата нет и генерацию запускают снова.

Почему TRNG RP2350 иногда отвечает очень долго?

Генерация недетерминирована: обычно она занимает примерно одинаковое время, но иногда дольше среднего более чем в 100 раз, а результат, не прошедший проверку энтропии, отбрасывается. Даташит советует держать небольшой запас случайных чисел и пополнять его заранее.

Источники

  1. Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.12.5: список регистров, назначение полей, тип доступа и значения после сброса
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?

Другие регистры RP2350

Статьи и термины