POR是所有SoC设计的关键功能序列,其作用是将系统从任意状态恢复至正常状态。任何未被检测到的POR缺陷都可能导致实际芯片中的灾难性后果。复杂数量的重置逻辑给验证工程师带来了更大挑战——他们需要在RTL仿真过程中捕捉这些设计缺陷。随着SoC规模和复杂度的持续增长,其上电复位逻辑的复杂程度也在不断攀升。当前,电源管理逻辑的引入进一步加剧了这一问题。导致复位逻辑复杂度增加的因素可归纳如下:
- 全局复位通常有多种触发源,例如上电复位、硬件复位、软件复位和看门狗定时器复位。
- 系统级芯片(SoC)集成的IP模块数量持续增加。
- 不同IP模块的复位策略可能存在差异(包括同步复位、异步复位、扫描复位、部分复位、完全复位或不可复位的触发器)。
- 系统级芯片的复位控制器逻辑需满足所有数字模块、模拟模块及不同锁相环(PLL)的复位需求。
- 支持由SoC焊盘参数配置的多种工作模式会进一步增加复杂度。
- 复杂的电源模式及其对应的应用场景转换也会带来设计复杂性。
- 当引入保持寄存器时,复位方案的复杂程度可能更上一层楼。
SoC复位逻辑的复杂性给有限资源和有限SoC执行时间下的验证带来了各种新挑战。主要验证挑战如下:
- 系统级芯片(SoC)复位序列会为不同模块生成特定的复位指令。必须严格遵循该序列以确保所有模块都能恢复正常工作状态。因此需要通过验证来覆盖并检查不同模块的各种工作模式组合。
- 在POR采样逻辑中使用的不可复位触发器,可能因RTL和GLS仿真过程中未初始化的触发器导致X传播现象。为验证此类触发器,需在复位时刻用预设/随机值对它们进行强制置位/沉积操作,以确保仿真顺利进行。
- 基于焊盘参数支持的各种SoC功能配置需要进行全面验证。必须在SoC层面运行涵盖所有可能工作模式的功能场景,确保所有配置都能按预期运行。
- 设计中的所有可复位触发器都应连接到顶层复位信号,即当全局复位信号被激活时,所有可复位触发器都应被复位。实际上,若存在复位连接缺失或不同电源域间传播阻断的情况,很容易被忽略。
目前,针对复位验证的大多数研究工作都集中在连接性检查上。然而,在低功耗设计中,电源丢失(POR)故障的根本原因可能多种多样:有些是“静态”故障,可以通过检查设计结构来发现;而有些则是“动态”故障,只有在功耗感知仿真过程中才能被捕捉。为此,我们提出了一种自动提取POR断言的解决方案,用于识别功耗感知仿真中的所有非复位寄存器。通过该方案,我们可以在早期RTL仿真阶段利用提取的POR断言筛选出大量真实的POR故障案例。
与先前重置验证方法的比较
在联发科的前期研究[3]中,我们曾阐述如何运用形式化技术验证全局复位方案。全局复位故障可能由多种原因导致:例如复位连接缺失或错误、存储元件复位源与复位引脚之间的逻辑设计缺陷等。相较于为所有可能场景编写基于仿真的测试来验证全局复位能否有效传递至目标存储元件并完成复位功能,更高效的做法是在目标存储元件的复位引脚上添加SVA(存储验证地址),通过形式化引擎证明当满足设计复位条件时,这些复位引脚将被正确激活。下文将展示一个示例SVA的具体实现。
global_reset_check: assert property
(@(global_clock) `GLOBAL_RESET |-> ##`DELAY _rst);
`GLOBAL_RESET由全局复位条件定义,该条件由任意合法的SVA表达式构成,用于形成此全局复位验证SVA的前件部分。`delay由全局复位条件满足与复位信号有效之间实际周期延迟决定。为消除不必要的误触发,可采用最大延迟值。_rst是直接连接目标存储元件复位引脚的信号。本方法旨在验证全局复位与目标存储元件复位引脚之间的连接逻辑。`GLOBAL_RESET部分同样遵循这一设计理念。除构成全局复位条件所需的逻辑外,应尽可能保留其他逻辑以供形式化引擎验证。
但使用全局复位断言的正式技术仍存在一些缺点,因此我们开发了具有POR断言的功耗感知仿真来克服这些缺点。这两种方法的对比总结在表I中。
Feature/Method |
Global Reset Assertions + Formal Techniques |
Power-on Reset Assertions + Power-aware Simulation |
Checking mechanism |
Static, structural |
With dynamic power control sequences |
Power aware |
No |
Yes, with UPF |
Clocking event |
Must |
Not necessary, use user specified time interval |
Coverage |
Exhaustive |
Pattern dependant |
Tool capacity |
Limited by design complexity, abstraction techniques are needed for whole chip |
Able to run whole chip simulation ( limited by machine memory) |
Software included |
No |
Yes |
形式化验证技术的优势在于能够全面探索SoC复位方案的所有可能条件,而基于仿真的技术则受限于预设的测试模式。然而,现有的复位验证形式化技术主要侧重静态和结构检查,难以描述动态功耗控制序列,也无法将软件或固件纳入验证范围。此外,当前大多数形式化工具不具备“功耗感知”功能,即未考虑功耗感知功能(UPF)。另一个局限是形式化验证需要时钟事件作为基础,但异步复位通常不依赖时钟信号。在形式化技术诸多缺陷中,设计复杂度限制是最突出的问题。这种复杂性要求工程师采用多种简化技术来适配设计需求,这给实际应用带来了障碍。因此,为克服形式化技术的这些缺陷,我们提出的解决方案是在基于UPF的功耗仿真中实现自动POR断言。
工具流程和结果
图1展示了我们提出的解决方案流程图。该流程需要的输入包括可选的软件/固件、测试平台、RTL代码和UPF代码。测试平台与软件/固件配合使用,用于通过不同源和条件对POR进行刺激测试;RTL代码用于提取POR断言;UPF代码则用于开启功耗感知仿真,并提供电源开启触发事件以供POR断言验证。流程的第一步是解析并编译输入源代码。在此阶段,系统会自动识别图2中的预定义编码风格,从而提取并限定寄存器的异步置位、复位或同时进行这两种操作。需要说明的是,本研究仅考虑异步置位/复位寄存器,因为我们的大多数设计都采用此类寄存器实现。流程的第二步是基于提取的POR断言进行功耗感知仿真。在此步骤中,软件/固件与测试平台将通过不同的低功耗和复位场景对设计进行刺激测试,因此仿真器会生成电源开启触发事件以供POR断言验证。最后,当仿真完成后,断言失败情况将显示在仿真日志中供审查。
图1:基于功耗感知仿真技术的上电复位断言验证流程
在VCS NLP[5]1209SP1-7版本及后续版本中实现了该解决方案,用于捕捉功耗感知仿真中的POR问题。通过解析并识别图2中的编码风格,系统自动生成POR断言并绑定寄存器,以检查在重新供电时能否正确复位这些寄存器。目前这些断言仅适用于Verilog模块中具有异步复位功能的触发器,而不适用于设计VHDL部分或当前使用的同步触发器。简而言之,这些断言是在Verilog模块中实现的,每个符合标准的触发器都会实例化对应的Verilog模块,并将功耗域状态、时钟和复位信号值、复位感知(复位极性)等信息作为端口连接参数。断言消息中呈现的时钟和复位信号名称被封装为字符串常量,通过初始块填充。UPF功耗域名称和触发器的层级路径则通过模拟器DPI调用进行标记。
图2:在重置断言时绑定电源的编码样式
经过与设计验证团队的讨论,我们确定了如图3所示的三种复位场景。这三种复位场景能够覆盖设计中所有可能的复位行为。图3中Tmax和Twidth的定义如下:1) Tmax:复位信号应在上电后Tmax时间内被激活;2) Twidth:复位信号在上电后至少需持续Twidth时间单位。其中时间单位由Verilog代码或仿真器选项指定的时间尺度定义。对于图3中的案例1,由于复位信号在整个断电期间保持有效,因此仅需检查Twidth时间单位;对于案例2和3,由于复位信号在上电后被激活,需同时检查Tmax和Twidth时间单位。需要特别说明的是,这种检查基于用户指定的仿真时间间隔而非时钟周期,因为在上电后复位信号被激活时,可能不会触发时钟事件。
图3:通过上电复位断言检查的3种复位场景。
要启用POR断言,用户需要在VCS中添加编译时选项(如图4所示),并通过set_design_attributes在UPF中设置Tmax(SNPS_active_reset_duration)和Twidth(SNPS_inactive_reset_duration)参数(如图5所示)。这两个延迟值将作为全局参数传递给整个设计触发器的所有断言。当功率感知仿真过程中违反Tmax或Twidth时,系统会显示如图6和图7所示的警告信息。SNPS_active_reset_duration和SNPS_inactive_reset_duration的数值以绝对值形式出现在断言信息中,应理解为该次仿真运行中VCS的已解决时间单位。LP_RESET_ASSERT_FAIL断言被推迟到仿真队列的响应区,以避免在复位操作与上电时间+SNPS_inactive_reset_duration延迟值重合时触发。
通过本方案,我们在SoC设计中发现了先前形式化解决方案已验证的真实漏洞,这证明了该方案能够克服形式化技术的局限性。
图4:用于打开上电复位断言的编译时选项
图5:设置活动和非活动复位持续时间的UPF命令
图6:违反Tmax时的警告消息
图7:违反Twidth时的警告消息
工具的实施挑战
由于大多数复位技术都采用图3所示的“复位案例1”模式,因此在低功耗验证中,上电时的复位断言成为一大挑战。若采用同步复位方案,则可假设其仅在上电时停止时钟门控并触发复位后才生效。但与同步复位方案相比,“复位案例1”定义的异步复位方案问题更为复杂。假设复位在关机周期前被触发,相关逻辑将同时被复位。此时由于电源域进入关机状态,所有逻辑都会被仿真器置为未知状态。当系统唤醒时(假设复位由开启域驱动且不存在复位负边沿),再次复位逻辑就变得困难重重。类似地,若复位在关机期间被触发,由于设计被置为未知状态且无法复位,仿真器会丢失复位的负边沿信号。因此,工具必须对每个时序模块进行复位推断。完成复位检测后,需检查其唤醒状态下的电平,并通过感应边沿重置对应逻辑。
为满足复位断言需求,工具需要识别设计中每个时序模块的本地时钟和复位信号,并在上电时触发Tmax和Twidth的必要验证。若复位在上电时已处于激活状态,则仅需启动Twidth检查。若复位在上电时处于未激活状态,则应先启动Tmax检查,待复位激活后再进行Twidth检查。因此,为确保正确实现POR断言机制,我们特别设计了在关机时重新初始化断言序列的方案,从而在整个仿真过程中,每次域上电时都能验证这些断言的有效性。
官方描述见vc nlp user guide: Power-on Reset Assertions Support章节