簡介
國產車規微控制器原廠云途半導體設計和發售的YTM32ME
微控制器上集成的真隨機數生成器TRNG
(True Random Number Generator)外設模塊,是一個可生成256位隨機數的硬件模塊,生成的隨機數將用于數據加解密等應用場景。在功能安全相關的系統中,隨機數也可以作為生成加密算法的種子數據的生成器。
原理與機制
TRNG
包含了一個回環振蕩器(Ring Oscillator)、一個隨機比特流搜集器(Random Bits Collector)、一個時鐘監測器(Clock Monitor)和一個錯誤檢測器(Fault Detector)。有內部結構系統框圖,如圖x所示。
圖x TRNG系統框圖
其中,回環振蕩器是隨機噪聲的高速時鐘信號源,它對環境狀況非常敏感,例如溫度、電壓、電磁干擾,以及別的潛在的噪聲源。
這些噪聲可以引起回環振蕩器輸出時鐘頻率產生微弱的、連續的和隨機的變化,每個振蕩時鐘周期會產生非常微小的變化,因此,使用功能時鐘信號(的上升沿)對回環振蕩器時鐘信號進行采樣,得到的邏輯電平值,每次都是隨機不確定的。這就是隨機特性的最初來源。
隨機比特位流搜集器的核心是一個定時器和一個計數器。其中,定時器的計數時鐘源來自于外部的功能時鐘,計時周期數量可由軟件配置(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所示。
表x TRNG外設模塊的中斷源
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
。
bool TRNG_Init(TRNG_Type * base, trng_config_t *config);
bool TRNG_GetEntropyValues(TRNG_Type * base, uint32_t * values);
uint32_t TRNG_GetStatus(TRNG_Type * base);
void TRNG_ClearStatus(TRNG_Type * base, uint32_t flags);
-
微控制器
+關注
關注
48文章
7542瀏覽量
151321 -
振蕩器
+關注
關注
28文章
3832瀏覽量
139041 -
定時器
+關注
關注
23文章
3246瀏覽量
114725 -
生成器
+關注
關注
7文章
315瀏覽量
21003 -
時鐘源
+關注
關注
0文章
93瀏覽量
15956
發布評論請先 登錄
相關推薦
評論