4. 基于环形振荡器的PUF:RO PUF的设计原理、频率偏差的提取与量化、RO PUF的优缺点分析

各位同学,咱们今天聊点实在的——环形振荡器PUF,圈内人通常叫它RO PUF。

这东西在芯片防伪领域里,算是个老牌明星了。我入行那会儿,第一个接触的PUF结构就是它。为什么?因为它结构简单,逻辑上也好理解。说白了,就是利用芯片制造过程中,每根反相器链的延迟天然不一样这个物理特性,来生成独一无二的“芯片指纹”。

你想想看,同一片晶圆上,相邻两个Die的RO频率都可能差出几个百分点。这个偏差,就是我们做身份认证的底气。

4.1 RO PUF的设计原理

RO PUF的核心思想,一句话就能讲清楚:用环形振荡器的频率差异来编码信息。

一个基本的环形振荡器,就是奇数个反相器首尾相接。我习惯用3级或5级反相器,级数太多反而容易引入噪声。当电源一上电,这个环就会自己振荡起来,输出一个方波信号。振荡频率由反相器的传播延迟决定。

但问题是,同一批芯片上,每个反相器的延迟都不一样——这就是工艺偏差在作祟。所以,即使你设计了完全相同的两个RO,它们的输出频率也会有细微差别。

设计时,我们通常会在芯片上布置一个RO阵列。比如16×16,总共256个RO。然后通过一个多路选择器,依次选通两个RO,用计数器去数它们的振荡周期数。

核心设计要点:

  • 每个RO必须结构完全对称,版图也要尽量一致
  • 反相器级数建议选奇数,3~7级比较常见
  • RO之间要加隔离,防止相互耦合干扰
  • 计数器的位宽要够,我一般用16位以上

下面这张图,是我当年做项目时画的RO PUF核心架构。你可以看到,两个RO通过多路选择器,轮流接入计数器。控制逻辑负责选通和复位。

RO PUF 核心架构图 RO 阵列 RO_1 RO_2 ... RO_N (N x M 个环形振荡器) 多路选择器 选通两个RO 计数器 计数振荡周期 控制逻辑 选通/复位/使能 比较器 比较频率大小 响应输出 0 或 1 工作原理简述 1. 选通两个RO 2. 分别计数振荡次数 3. 比较频率大小输出1/0

4.2 频率偏差的提取与量化

有了RO阵列,下一步就是怎么把频率偏差变成可用的二进制响应。这个过程,我把它拆成三步:测量、比较、量化。

4.2.1 频率测量

测量频率的方法有很多。我个人最常用的是计数法:给定一个固定的时间窗口,让计数器去数RO在这个窗口内振荡了多少个周期。

举个例子,我设一个1微秒的使能窗口。如果RO振荡频率是100MHz,那计数器就会数到100。如果另一个RO是101MHz,那它就会数到101。这个差值虽然小,但足够我们做比较了。

我的经验:测量时间窗口不能太短,否则计数误差会很大。但也不能太长,否则功耗和延迟都受不了。我一般取1~10微秒,具体看你的RO频率和系统时钟。

4.2.2 比较与响应生成

最经典的比较方式,就是两两比较。从阵列里选两个RO,分别计数,然后比较计数值的大小。如果RO_A的计数值大于RO_B,就输出1;否则输出0。

这样,一个比较就能产生1比特的响应。如果你有256个RO,理论上可以产生C(256,2) = 32640个比较对。但实际不会用这么多,因为相邻RO的偏差太小,容易出错。

我一般会隔开选,比如选RO_1和RO_128,或者RO_1和RO_200。距离越远,工艺偏差的差异越大,响应越稳定。

// 伪代码:RO PUF 响应生成
for i = 0 to N-1 step 2:
    count_A = measure_frequency(RO[i])
    count_B = measure_frequency(RO[i+1])
    if count_A > count_B:
        response_bit = 1
    else:
        response_bit = 0
    store(response_bit)

4.2.3 量化与纠错

这里有个坑,我得提醒你。频率偏差不是一成不变的。温度一变,电压一变,频率就会漂。原本RO_A比RO_B快,换个环境可能就反过来了。

避坑指南:我曾经在一个项目中,室温下测得好好的响应,拿到高低温箱里一跑,30%的比特都翻了个个儿。后来加了纠错码和温度补偿才搞定。

常用的量化策略包括:

  • 差分比较:用两个RO的差值做比较,而不是绝对值
  • 多次采样取平均:每个RO测10次,取平均值再比较
  • 纠错码:用BCH码或Reed-Muller码纠正翻转的比特
  • 辅助数据:在注册阶段生成helper data,辅助恢复

4.3 RO PUF的优缺点分析

聊完了原理和实现,咱们来客观评价一下RO PUF。这东西不是万能的,它有它的长处,也有它的短板。

维度 优点 缺点
实现难度 结构简单,标准单元就能搭 需要大量RO,面积开销大
稳定性 频率偏差相对稳定 受温度和电压影响大
安全性 难以物理克隆 易受侧信道攻击
可扩展性 增加RO数量即可增加比特数 响应比特数受限于RO数量
功耗 测量时功耗可控 RO一直振荡,静态功耗高

4.3.1 优点

  • 设计门槛低:用标准数字单元库就能实现,不需要模拟电路。我当年在FPGA上验证RO PUF,只用了LUT和进位链,两天就跑通了。
  • 唯一性好:不同芯片之间的频率分布差异明显,碰撞概率极低。
  • 抗物理克隆:即使拿到版图,也无法复制出完全相同的延迟特性。

4.3.2 缺点

  • 面积开销大:每个RO都需要独立的使能控制和计数通路。256个RO,光布线就能占掉一大块面积。
  • 环境敏感性:温度从-40°C到85°C,频率能漂移10%以上。不加纠错的话,响应可靠性堪忧。
  • 侧信道风险:攻击者可以通过测量功耗或电磁辐射,反推出频率信息。我记得有篇论文,用简单的功耗分析就恢复了RO PUF的响应。

我的总结:RO PUF适合对安全性要求不是极端苛刻,但对成本敏感的场景。比如物联网设备的身份认证、耗材防伪。如果你要做银行卡级别的安全芯片,我建议你考虑更复杂的PUF结构,比如SRAM PUF或蝴蝶型PUF。

嗯,关于RO PUF,今天就聊到这儿。核心就是:用工艺偏差造差异,用频率比较出响应。设计时注意环境补偿,量产时做好纠错,这东西就能用得很稳。