真随机数生成器TRNG外设模块详解
文章目录
- 真随机数生成器TRNG外设模块详解
- 简介
- 原理与机制
- 应用要点
- 时钟源
- 中断源
- 初始化
- 数据
- 软件支持
简介
国产车规微控制器原厂云途半导体设计和发售的YTM32ME
微控制器上集成的真随机数生成器TRNG
(True Random Number Generator)外设模块,是一个可生成256位随机数的硬件模块,生成的随机数将用于数据加解密等应用场景。在功能安全相关的系统中,随机数也可以作为生成加密算法的种子数据的生成器。
原理与机制
TRNG
包含了一个回环振荡器(Ring Oscillator)、一个随机比特流搜集器(Random Bits Collector)、一个时钟监测器(Clock Monitor)和一个错误检测器(Fault Detector)。有内部结构系统框图,如图x所示。
其中,回环振荡器是随机噪声的高速时钟信号源,它对环境状况非常敏感,例如温度、电压、电磁干扰,以及别的潜在的噪声源。这些噪声可以引起回环振荡器输出时钟频率产生微弱的、连续的和随机的变化,每个振荡时钟周期会产生非常微小的变化,因此,使用功能时钟信号(的上升沿)对回环振荡器时钟信号进行采样,得到的逻辑电平值,每次都是随机不确定的。这就是随机特性的最初来源。
随机比特位流搜集器的核心是一个定时器和一个计数器。其中,定时器的计数时钟源来自于外部的功能时钟,计时周期数量可由软件配置(TRNG_SDCTL[ENT_DLY]
)。在定时器启动的同时,计数器也复位并开始启动,当定时器的周期数达到软件预先配置的数量时,使用功能时钟的上升沿对回环振荡器产生的高速时钟信号进行采样得到一个比特的逻辑值,会被送到随机数数据移位寄存器中并参与移位过程,如此周而复始,后续送入足够多的随机比特,形成比特流。
时钟监测器主要用于监测回环振荡器的频率的变化范围,软件可以读取回环振荡器频率的当前值(TRNG_FRQCNT
),并可设定允许范围的上限(TRNG_FRQMAX
)和下限(TRNG_FRQMIN
),一旦频率的当前值超出设定允许的范围,TRNG就会设定一个标志位TRNG_STAT[FRQ_CT_IF]
,对应也可以触发中断。时钟检测器相当于实现了一个对回环振荡器频率的硬件比较机制。
错误检测器通过一些测试,以对产生随机数的过程进行统计分析。其中:
- 长期运行测试(Long Run Test)可以限制在生成随机比特流中连续产生全0或全1的长度(
TRNG_CTRL[LRUN_MAX]
,并称之为“长期运行”事件。当检测到长期运行事件时,TRNG将会自动清空当前缓存的比特流,重新开始新的随机比特流的生成过程。 - 单边位约束(Monobit Limitation)限制了产生随机比特流过程中,输出0或者1的总数(
TRNG_SCML[MONO_RNG]
和TRNG_SCML[MONO_MAX]
),如果产生的随机比特流中破坏了配置好的单边位约束,TRNG将会自动清空当前缓存的比特流,重新开始新的随机比特流的生成过程。 - 重试次数约束(Retry Count Limitation)限定了因上述原因产生重置的合法次数(
TRNG_CTRL[RTY_CT]
),当重置次数超过配置数量,将被视为产生错误(TRNG_STAT[HW_ERR_IF]
)
需要注意的是,这里产生的“错误”并不是因为硬件运行出现故障而产生的错误,而是表示产生随机数过程中超出了某些预设的约束条件,因为产生的数据是随机的,用户不能预判生成数据的内容,所以,当这些所谓的“错误”发生后,TRNG硬件上激活了一些标志位,可以当做是一些状态的提示,用户可以简单地忽略,或者为了适配某些使用随机数的算法,以某些处理方法,适当地重置随机过程并记录统计信息。
应用要点
时钟源
TRNG外设相关的时钟源有3个:外设模块的访问时钟(总线时钟)、功能时钟,以及自己内部的回环振荡器。
- TRNG挂在APB总线上,当AHB总线主机(CPU)访问TRNG的寄存器时,通过AHB总线到APB总线的外设桥转接到低速设备,此时用到的是系统时钟(System Clock)。
- 功能时钟(function clock)在手册中描述TRNG的章节中出现多次,通过查阅IPC中的可配置信息可知,
YTM32ME
微控制器上,固定使用SLOW_BUS_CLK
作为时钟源。而SLOW_BUS_CLK
是从系统时钟经过两次分频后得到的。 - 回环振荡器是TRNG内部实现的一个高速时钟源,频率高(300MHz左右),但不准,作为获取随机数据的信号源。
中断源
TRNG模块设计的中断源如表x所示。
标志位 | 开关控制 | 触发条件 | 清零标志位条件 |
---|---|---|---|
TRNG_STAT[REQ_CT_IF] | TRNG_CTRL[FRQ_CT_IE] | 内部的回环振荡器产生的时钟频率超出预设的范围,可触发本中断事件。 | 写1清零 |
TRNG_STAT[ENT_VAL_IF] | TRNG_CTRL[ENT_VAL_IE] | 每次成功产生一次有效的随机数,可触发本中断事件。 | 读TRNG_ENT[7] 寄存器的数 |
TRNG_STAT[HW_ERR_IF] | TRNG_CTRL[HW_ERR_IE] | TRNG内部的硬件错误(长期运行测试、单边位约束、重试次数约束三种错误发生其中任何一种) | 写1清零 |
TRNG的中断源未连接到DMA触发源,因此不能触发DMA搬运过程。
初始化
对TRNG外设模块的配置,包括各种参数、功能开关,均可在初始化过程中完成。
TRNG外设模块设计了一个锁定机制(TRNG_CTRL[UNLOCK]
):只有当TRNG_CTRL[UNLOCK]
寄存器的值为1
时,才能向各配置寄存器中写数;配置完毕后,将TRNG_CTRL[UNLOCK]
寄存器写0
,以防止各配置参数被意外篡改。
TRNG外设模块包含一个自动复位硬件配置到复位状态的控制位TRNG_CTRL[SWR]
,每次向该位写1
,都将复位多个配置寄存器的值至初始状态。当然,这个控制位,也需要再解锁状态下(TRNG_CTRL[UNLOCK]=1
)操作。
TRNG外设模块设计了一个使能控制位TRNG_CTRL[TRNG_EN]
,这个控制位实际启用随机数生成器是否开始启动生成过程。其开关与否不影响修改其它配置。
数据
顾名思义,TRNG是一个数据生成器,仅输出数据。TRNG生成器每次执行过程,将生成1个256位的随机数,存放在TRNG_ENT0
- TRNG_ENT7
的8个32位寄存器中。每当TRNG_STAT[ENT_VAL_IF]
标志位置1时,表示这256个比特的随机数据流已经填充完毕,可供软件读走。在软件读走生成数据之前,TRNG将暂停工作。特别注意,读TRNG_ENT7
寄存器的操作,将会触发TRNG继续启动工作,因此,为了读到一个完整一致性的256位随机数,应该先从TRNG_ENT0
寄存器开始读数,读到TRNG_ENT7
时,软件可以拿已经读到的8个32位数进行后续计算,而硬件也将会重新生成新的随机数填充这8个寄存器。
软件支持
SDK为TRNG设计了驱动程序,供开发者使用。这里列写TRNG驱动程序的API,读者可以一窥TRNG驱动程序的用法。至于具体用法,读者可以体验一下ytmicro-sdk
。
void TRNG_Init(TRNG_Type * base, trng_config_t *config);
void TRNG_GetEntropyValues(TRNG_Type * base, uint32_t * values);
uint32_t TRNG_GetStatus(TRNG_Type * base);
void TRNG_ClearStatus(TRNG_Type * base, uint32_t flags);
- END