在从前端设计阶段到后端实施阶段验证功耗管理SoC的行为时,会出现基于仿真的调试挑战。
我们还想表彰本文的第四位合着者Gabriel Chidolue,他是西门子公司Mentor的Questa功能验证小组的解决方案架构师。
低功耗验证的调试挑战由于低功耗设计中使用的复杂电源管理架构和技术而变得复杂。设计人员使用复杂的功耗感知技术,如电源门控,电压调节和体偏置来节省功耗并最大限度地减少散热。因此,芯片的功耗感知验证是一个相当复杂的过程。
统一功率格式(UPF)标准提供了许多新功能,这些功能已经放宽了功率意图规范流程,并启用了新的功率管理验证流程,以满足当今基于IP的SoC设计的需求。不幸的是,UPF标准的发展并没有降低电源管理验证任务的复杂性。此外,传统的调试技术和方法假定设计是“始终开启”的,因此无法解决与功耗相关的新问题。
让我们来看看六个低功耗调试挑战和常见陷阱,以及如何让它们更容易解决或完全避免的一些想法。虽然这些调试挑战对于那些参与电源管理验证的用户来说都不是什么新鲜事,但我们的意图是根据实际用户体验为非入门用户提供实用指南。
1.不需要的X值
低功耗仿真中的主要调试问题是未知(X)值的根本原因分析。 X值在低功耗模拟中出现在信号上可能有几个原因。这些原因可能是不正确的UPF规范(缺少隔离/电平转换保留单元或不正确的电源域分区)或UPF 1.0到UPF 2.0模拟语义差异(由于初始块的使用)(信号初始化和域加电)。
为了区分信号的正常未知值,大多数仿真工具都能够突出显示波窗中功率域损坏引起的未知值。在正常模拟中,未知X信号值通常使用波形窗口中未知值区域周围的单个中高红线或红色轮廓框来显示。在低功耗模拟中,整个低 - 高区域使用红色,粗粒或细粒交叉影线填充,表明X值是直接功率域腐蚀的结果(图1)。
(1).使用红色,粗粒或细粒交叉影线填充仿真波窗口中的整个低高区域,以指示X值是直接功率域损坏的结果。
通常情况下,腐败突出显示仅在驱动逻辑的直接输出中才可见,并且不会显示在受损网络粉丝支持的后续逻辑的输出中。即使未知的X值信号在波形中未被突出显示,追踪网络连接回到突出显示的信号可见的位置的能力也可以极大地简化确定X值来源的任务。大多数EDA供应商提供波形比较工具来确定这些不需要的X值的根本原因。
如果波形比较不可用,捕获不需要的X值的另一种有用技术是将它们的出现与以下变化相关联:功率域SIM状态或功率状态,功率控制信号(包括功率开关的功率控制信号,隔离启用和保留保存) /恢复信号。大多数功耗感知模拟器可以提供打印低功耗相关消息的功能。这些消息通常是关于供电网/端口,电源开关,各种电源控制信号和电源域的状态变化。断言还有助于检测由于与功率控制序列相关的问题而导致的X值来源。
除了低功耗断言检查以在模拟过程中捕获可能的X值来源外,处理UPF文件时的静态分析还可以确定是否有任何缺失,冗余或无效的隔离/电平转换器,这些也可以帮助捕获它们。当断电时,未隔离的电源域端口显然会向其他电源域传播X值。
在非功耗感知模拟中,信号的驱动通常是一些RTL逻辑。但是,在功耗感知仿真的情况下,它可以是从RTL逻辑到UPF插入单元的任何范围。对于信号出现意外值的情况,可能是该信号的功率感知活动的影响,或者它可能是功率感知活动对其某些驱动信号/逻辑的传播效应。在这些情况下,驱动程序跟踪是查找驱动程序信号及其值的有用方法。
另一个有用的功能是信号的数据流/原理图调试。这有助于追踪远处逻辑驱动的信号的值。在功耗感知调试中,它还在数据流路径中显示UPF插入的单元。图2是来自仿真器的数据流示例,示出了信号“/ tb / out1”'的数据流路径中遇到的隔离单元和电平移位器。
(2).来自模拟器的数据流显示在信号'/ tb / out1'的数据流路径中遇到隔离单元和电平移位器。
2.一些信号没有损坏
当设计的某个部分无法关闭并且该部分内部的逻辑永远不会被破坏时,虽然用户期望它被关闭并显示损坏的值,但是会出现一个非常常见的低功耗调试问题。这种行为可能有多种原因。
由于功率域规范不正确,所关注的设计元素被置于不可切换的电源域。调试此类问题的第一步是确定该区域所属的电源域。这可以通过查看由工具生成的功耗感知文本报告或使用工具的GUI功能来完成。下一步是确定该域的电源是否被关闭。只要电源域更改其状态,就可以使用该工具报告的动态消息进行验证。
当EDA供应商提供机制来跳过设计某些部分的损坏时,可能会排除行为模型;例如通过UPF指定DONT_TOUCH元素,或者使用单独的文件从功耗感知行为中排除元素。在这种情况下,查看工具生成的报告以确定设计元素是否已被该工具排除。
禁用设计元素的模拟语义意味着该工具不会在该元素上传递任何电源切断/损坏。该工具会禁用功耗感知模拟语义,因此不会有工具注入损坏。所有这些区域都可以使用验证工具报告的消息轻松识别,例如:
注意:(vopt-9693)针对chip_top / u_hm_top_0 / u_ip_1禁用了Power Aware模拟语义。
3.非法权力和转轨
当今的低功耗设计有许多操作模式。低功耗设计的主要调试任务之一是验证设计的运行功耗状态。这需要验证每个电源域的每个定义的电源状态已被覆盖并正常工作。它还要求验证组成每个运行电源状态的所有域的所有电源状态组合。随着电源域数量和运行电源状态的设计不断增加,验证过程的复杂性会增加多倍。
UPF通过提供add_power_state和describe_state_transition命令来解决这些挑战。不仅add_power_state支持偏置状态,分层电源状态创建和增量更新功能,还允许将任何命名电源状态声明为合法或非法。使用这两个命令需要低功耗模拟器在发生非法电源状态或发生任何非法电源状态转换时发布运行时错误消息。
UPF还规定,未命名或未定义的电源状态是非法的。如果在从一个定义状态转换到另一个定义状态时出现意外功率状态,则未定义功率状态的检测特别有用。在合法电源状态转换期间发生未定义的电源状态可能是由于通过UPF封装supply_on / supply_off函数更改UPF电源与同时切换电源控制逻辑信号之间的竞争造成的。比赛引起的未定义功率状态可能表示电压上升/下降时间与逻辑开关时间必须考虑的区域,以确保设计的正确操作。
但是,有时候,知识产权的所有基本权力状态都没有确定;这可能会导致仿真期间发生意外的非法状态消息。用户可以使用UPF 3.0语法,该语法允许将给定对象的一组功率状态的指定标记为完整,这表明该对象的所有基本状态已被定义为命名功率状态。
如果一个对象的电源状态集已经完成,那么UNDEFINED电源状态应该是该对象的当前电源状态的错误。如果在电源状态标记完成后定义新的基本电源状态,那也是一个错误。如果给定对象的功率状态未标记为完整,则假定所有基本状态尚未定义,并且不会被标记为错误行为。
类似地,describe_state_transition(UPF 2.0 / 2.1)和add_state_transition(UPF 3.0)命令可以使两个电源状态之间的任何转换被声明为合法或非法。 UPF 3.0还允许定义一组相关的电源状态,然后可以在add_power_state命令中使用这些状态。权力状态组的合法权力状态定义该范围内的其他对象或子孙树的权力状态的合法组合;即在设计的操作期间可以同时活动的对象的状态的那些组合。这个命令可以用来定义非法的电源状态组合。
4.电源意向规格的复杂性
UPF已经解决了低功耗设计电源管理的功率意图规范。但是,UPF标准仍在不断发展,新版本中增加了新功能,概念和说明。它往往会带来与向后兼容性,差异和迁移问题有关的问题,这些问题很难调试。
在UPF 1.0中,UPF默认提供ON状态。参与基于UPF 1.0的功率感知仿真的许多验证和设计工程师在不知不觉中依赖于这一事实,因此,有一种趋势是不使用UPF封装定义的supply_on函数明确地打开它们。因此,在用户切换到基于UPF 2.0的功率感知模拟语义之后,以前通过基于UPF 1.0的仿真可能会失败。
许多这些故障的常见原因是,在UPF 2.0中,UPF将默认设置为OFF状态,导致所有电源域都处于CORRUPT状态。通过使用UPF封装定义的supply_on函数明确设置所有创建的UPF电源的UPF状态和电压值,可以轻松避免此常见迁移问题。
低边界电源域端口的隔离是另一个迁移问题。在UPF 1.0中,set_isolation -applies_to输入/输出端口过滤器仅考虑在模块边界上对齐的电源域端口。换句话说,只有模块的输入和输出端口是隔离的。在UPF 2.0中,这些隔离端口过滤器已经扩展到还包括下边界(不同电源域中的子模块实例)输入和输出电源域端口。下边界电源域端口隔离的概念可能会由于工具推断的意外背靠背隔离单元而导致模拟失败,特别是如果隔离策略包含在任何较低级别的电源域中。
Power-intent规范中的另一个调试挑战是由于在各种UPF命令中使用列表/通配符扩展而产生的。通常会发生一个不正确的信号列表,作为在通配符中使用错误模式的副作用。如果用户依赖UPF命令find_objects创建信号列表并使用tcl命令放置打印元素列表的内容,则可避免此问题。
获取扩展信号列表的另一种方法是使用save_upf命令。使用save_upf UPF命令,验证工具会将解释的命令转储到新的UPF文件中,该文件将包含扩展元素列表。另一个安全的选择是避免使用非LRM通配符使用,并依赖UPF命令find_objects。
在设计中的宏模型的情况下,电源以及功率感知功能存在于模型本身内部。将此宏模型集成到SoC中时,集成商必须将这些HDL电源连接到UPF网络。
由于UPF电源是具有状态和电压值的supply_net_type类型,并且HDL中定义的电源属于线型,因此UPF和HDL网络之间的连接需要一个值转换表(VCT)。 VCT定义UPF网络的状态与HDL端口/网络的值之间的映射。用户可以依靠验证工具来应用默认VCT,或者使用UPF命令connect_supply_net -vct明确指定要使用哪个VCT。请注意,当相同的VCT用于电源/接地/电源/电源网络时会出现问题。这会导致上电失败,因为地面/井口供电网线处于低电平并期望地面特定的电压。
5.提供网络问题
在实施阶段,电力感知设计中的供电网络往往庞大而复杂。有时,它会变得越来越多,并且难以调试供应网络中的不正确连接或任何其他问题(或者仅存在于UPF文件中或已经在设计中实现)。您可以使用静态或动态调试方法调试电源连接。这是一个来自EDA工具的良好用户界面和连接报告帮助很大的问题。
6.通电失败
当低功耗设计在断电期后无法启动时,会出现常见的调试场景。由于丢失或不正确的隔离/电平移位器,不正确的保留行为以及宏单元损坏,可能会出现此问题。
通过在编译时执行静态验证,使用工具生成的断言以及使用UPF绑定检查器,可以调试丢失或不正确的隔离/电平移位器。许多工具静态地确定隔离和电平移位器单元在PST和UPF中描述的功率状态的域边界处的需要。
3.通过在编译时执行静态验证,使用工具生成的断言以及使用UPF绑定检查器,可以调试丢失或不正确的隔离/电平移位器。
PST描述两个域之间的有效交互状态。这些状态清楚地定义了两个域相互作用的电压范围,以及一个域是否与另一个域相关。如果信号从低电压范围到高电压范围,则需要具有“low_to_high”规则的电平移位器。类似地,对于从高电压到低电压的信号,需要“高低”规则。如果没有指定电平转换器策略或指定具有不同规则的电平转换器策略(图3),那么这是一种错误情况。
系统Verilog断言(SVA)是利用工具生成的自动断言来实现低功耗设计的动态验证的一种非常强大的方法,该断言在运行时检查丢失或不正确的隔离和电平转换器。对于域边界上的每个接口信号,插入一个断言来检查是否需要隔离和电平移位器单元。
断言可用于验证功率控制逻辑序列,并确保在功耗模式转换之前和之后满足特定要求。 UPF还提供了使用bind_checker命令添加自定义断言的方法,允许您在模块中编写自己的断言,然后将该模块绑定到边界实例以检查信号是否被隔离。
UPF bind_checker命令还允许您使用bind_checker和UPF泛型转储自定义保留断言,从而提供调试不正确保留行为的最简单方法。 UPF泛型提供了一种自动的方式来为设计的所有顺序元素指定通用的bind_checker语句,因此您不必担心每个顺序元素的时钟/复位条件。仿真工具自动识别每个顺序元素的时钟/复位条件,并相应地应用bind_checker语句。
宏单元的腐败是由使用宏单元的主要供应来定义腐败语义的自由属性来控制的。因此,宏单元的主要电源应该正确连接以实现自由单元的正确功能。电池上电失败的主要原因之一是电源连接不正确,因此有必要验证每个电池的电源连接。大多数EDA供应商转储所有电源连接的连接报告,并且您必须通过检查这些报告来验证电源端口是否正确连接。
结论
调试低功耗设计是当前半导体行业面临的最严峻挑战之一。认识到调试低功耗设计时遇到的各种挑战,可以及早发现或避免低功耗问题,从而节省昂贵的设计周期并显着提高调试过程的生产率。
閱讀更多 芯聯天下 的文章