连接UVM与混合信号设计

 

摘要

随着混合信号SoC设计数量的增加以及相应的混合信号验证的需求,UVM作为一种解决方案被提出,即采用用于复杂数字SoC的UVM验证方法。目前存在很多混合信号的UVM验证方法,但是,都没有将UVM环境与混合信号设计连接的标准化方法。由于这些原因,有效的混合信号设计验证正变得充满挑战,并为创新性的验证方案打开了空间。本文将展示使用Verilog-AMS模型将UVM环境与混合信号设计连接的不同方法。

 

一. 引言

混合信号验证还很初级,但是随着设备变得越来越复杂,对混合信号验证的需求也在迅速增加。当前有很多方法,都有其各自的优点和缺点,并且它们都有一个共同的问题:如何对模拟模块进行建模?共有三种主要的方法:

1)非常高级的抽象模型(VHDL, Verilog);

2)实数建模将更多内容带入“模拟”,但在离散时域中,仅使用数字模拟装置引擎;

3)尝试几乎完全模拟的AMS建模。

在第一种情况下,由于没有添加任何新规则,我们可以将UVM环境直接连接到DUT。当使用WREAL模型时,因为WREAL规则允许将实数定义为模块的端口,我们可以直接将UVM环境与DUT连接。而最后一种情况,当使用电端口时,我们不能使用AMS模型直接将UVM环境与DUT连接,我们需要一些组件来使用AMS模型。

本文将坚持把Verilog-AMS作为在混合信号验证中最具挑战性的方法。

 

二. 环境搭建

通常,混合信号DUT有一个很大的数字模块和很多的模拟模块,供内部(如偏置或基准)和外部(如功率调节器、感测等)使用。

当使用数字方法时,我们用VHDL或者Verilog语言来编写模型,这些模型严格遵循高级抽象模型的行为规范。在这种情况下,由于只使用了数字信号,我们可以直接将UVM环境与DUT连接。这种方法很简单,而且仿真非常快速。然而它有一个很大的缺点,即在使用这种模型时,很可能会错过实际的功能错误。此方法对连接检查很有用,并且不需要模型创建者对模拟模块有充分的了解,他只需要了解模型的基本功能即可。模型简单明了,易于理解。如果我们想将某些模块作为TL(晶体管级)原理图,则此方法效果不佳。许多自动转换器将被实例化,调试它们会成为一项非常耗时的任务。主要问题是双向端口、电流端口以及不同的电压等会导致自动转换器出现故障。在混合模式仿真的情况下,为VHDL模型编写的大多数测试用例都无法重用,因此需要创建新的测试用例。例如,对于LDO(Low Drop Out,低压降),我们在禁用时将输出设置为0V,在启用时将输出设置为5V,在发生某些错误(例如电源错误或控制信号组合错误)时将输出可设置为其他任何值(0.01V等)。清单1显示了VHDL的LDO模型示例。随后,我们将创建与该模型对齐的检查器。当我们将此LDO包括在内作为TL(晶体管级)原理图时,我们的检查器注定会失败!因此,我们需要创建不同的测试用例和检查器。

清单1:以VHDL建模的LDO模型输出电压示例

我们可以通过使用WREAL模型来改善这一点。与VHDL模型相比,WREAL模型的一个优势是其允许我们使用实数作为端口。因此,我们可以创建模块的类似行为。现在,我们可以模拟模块的确切行为,在离散时域中进行可以实现快速仿真并获得准确的结果。但是,它也有一个很大的缺点,这是由于WREAL模型无法同时对同一端口上的电压和电流进行建模,因此我们需要确定哪个更重要。例如,如果我们有一个带反向电流限制器的LDO输出引脚,那么我们就无法在同一引脚上同时模拟电压输出和电流输入。通常在这种情况下,我们在LDO输出端对电压功能进行建模。另外,我们还创建了另一种机制来驱动模型中表示反向电流的变量,并且通过这种机制,我们可以验证反向电流是否受到限制器块的限制,这种正确的标志也会报告给专用状态寄存器。此外,在某些情况下,无法执行解决方法。例如,如果有几个模块处于某个电流路径上,则我们不能仅使用WREAL模型来正确验证连接性。在这种情况下,我们必须使用TL原理图。尤其是当电流端口在路径中时,WREAL模型也容易出现无意识的转化器错误。图1中可能发生此类问题的常规配置示例。使用此配置,将在这两个模块之间创建E2R转换器。该转换器的输入阻抗通常为几百欧姆,这种低阻抗将导致错误的电流泄露。所有这些转换器都可以手动修复,但是如果我们考虑手动修复每个自动转换器,那么拥有它们的意义何在?调试工程师需要花费大量时间来调试所有可能的转换器和问题,更不用说在每个新项目中,如果我们重复使用相同的模型,则不会跳过调试和配置环境的过程,但是我们需要重新做一遍。

通过使用AMS模型,我们能够非常精确地对模拟行为进行建模。因为电子学科所使用的模拟引脚可以直接连接到TL原理图端口,所有我们可以非常轻松地在模型与TL原理图之间切换。当电子端口连接到TL原理图时,我们不需要转换元件。但是,在这种情况下,我们无法直接连接到UVM,我们需要某种连接模块才能实现这一点。例如,Cadence提供了可用于实现此目的的自动连接模块(L2E,E2L等)。如果仅使用这种类型的连接,则需要具有非常复杂的UVM监视器,可以处理来自DUT的数据。即使对于非常简单的任务,例如检查LDO输出引脚上的有效电压,此类监视器也需要时钟和复杂的离散处理过程。当提到驱动模拟引脚时,我们需要在考虑上升时间和下降时间时注意这些连接模块。为了模拟这一点,我们需要构造一个UVM驱动器,以考虑步长,上升时间和下降时间,以及所有其他模拟参数来逐步驱动电压。这种方法使验证工程师的工作更加困难。

不是所有这些,我们可以创建Verilog-AMS适配器来为我们完成大部分工作,避免使用自动转换器,从而使顶级验证工程师在UVM方面比在模拟方面花费的时间更多。

UVM环境的一个示例如图2所示,它具有所有常见的UVM组件,并为每个专用于模拟模块的UVC添加了Verilog-AMS适配器。在这种特殊情况下,LDO和SMPS(开关模式电源)作为电源管理设备的一部分。在这种情况下,我们区分了设备的模拟引脚和数字引脚,这意味着我们将所有的数字引脚直接连接到UVM虚拟接口,并通过Verilog-AMS适配器连接模拟引脚。该图并未显示所有组件(例如uVC的电源组件),而仅显示了主要组件。

验证过程分为两个阶段:

1)数字验证,我们将数字部分实例化为测试平台内部的DUT,并将其当作顶级进行验证。最大的挑战是检查器,因为我们不得不以一种允许在顶级验证中重用它们的方式来编写它们。该阶段与建模并行完成。

2)顶层验证,我们整合了所有模型,并从第一阶段开始就尽可能的重复使用。在完成模型验证之后,我们在混合模式仿真中运行了所有测试,其中关键信号路径用作TL原理图。

 

三. Verilog-AMS适配器

Verilog-AMS适配器是UVM环境和AMS DUT之间的自定义连接模块。每个适配器要包含的任何模块都需要包含几个基本元素。适配器的一个重要方面是它们是可重用的,并且可以视为创建适配器的uVC的一部分,因此需要以结构化的方式对其进行编码。任何Verilog-AMS适配器的主要元素是静态配置、动态配置、驱动器、监视器和线束。即使在将端口建模为逻辑的情况下,这也是使用适配器作为接口的最佳方法。这样,如果我们包括TL原理图而不是具有逻辑端口的模型,则可以在适配器内实例化所需的驱动器和监视器,以避免使用自动转换器。连接和框图如图3所示。

静态配置用于在仿真开始时配置适配器的所有参数,线束中外部组件的所有初始值,监视比较器的阈值的所有初始值,以及所有动态配置。静态配置仅在仿真开始时使用。

动态配置用于动态更改适配器参数。使用动态配置,我们可以更改电阻器的值以模拟负载变化,我们可以更新监控器的阈值以使其与硬件内部的寄存器的值对齐。

在清单2的示例中,我们可以看到简单的动态配置,该配置反映了从规范中获取的寄存器的过压阈值。在此示例中,UVM序列会将所需阈值写入DUT内部的配置寄存器。同时,它将向example_adapter发送相同的值,以便适配器本身可以设置相同的配置。现在,我们只需等待过压事件即可。

清单2:过压阈值动态配置示例

驱动器通常是电压或电流源,具体取决于引脚的性质。通常的驱动器参数是要驱动到引脚的电压/电流值、上升和下降时间、延迟、输出阻抗等。在某些情况下,驱动器可能会更复杂,即当需要从电压切换到电流驱动时。驱动器也可以用来模拟引脚上的故障。这种驱动器的一个例子是,如果我们有一个能够检测过压情况的引脚,在这种情况下,我们可以创建这样的优化,该优化将允许我们使用驱动器来驱动过压条件。通过虚拟接口从UVM的驱动器发送要驱动到DUT的值。这种外部电路优化即使使用无需做任何更改的TL原理图,也能使我们测试DUT外部端口上的实际过压事件。

清单3给出了简单驱动器的一个示例,该驱动器仅仅是具有可配置电压和过渡时间的电压源。通过将v_set值发送到Verilog-AMS适配器,UVC现在可以轻松更改电压值。根据验证需求,Verilog-AMS适配器的驱动器可能要复杂得多。

清单3:Verilog-AMS适配器中的驱动器代码示例

监视器通常是具有可配置阈值的简单比较器。比较器用于将错误标志返回到UVM环境,以便能够轻松检查信号是否达到了所需的电平或发生了一些错误。如前所述,我们可以在连接监视器的同一引脚上驱动过压事件,并将比较器阈值配置为与DUT中寄存器的值对齐。监视器将捕获是否发生了过压,并将信息发送到uVC。uVC将捕获该信息并进行必要检查。

清单4显示了监视器块的示例代码,其中显示了简单的过压检测。OV_THR变量与清单2中的变量相同,其中显示了动态配置块的工作方式。在此示例中,我们将该配置用于比较器。当VOUT超过OV_THR时,比较器的输出将被置为有效,并且该标志将由我们的uVC监视器收集。检测到的过压情况如图4所示。

清单4:监视器块代码示例和比较器简图

线束是一个模块,其包含模拟模块工作所需的所有外部组件,即电阻器、电容器、电感器、外部晶体管等。线束优化无法动态更改,因此需要具有提供错误注入方式(例如过压、过流等)的机制。这个错误注入是创建线束最具挑战性的部分。在某些情况下,这也许根本不可能,但是将需要其他类型的错误注入。例如,如果由于功能的性质和复杂性而无法从线束中注入错误,则可以通过在DUT中强制使用内部值来完成。

按照这种结构,我们现在能够触发引脚上的故障,而且由于适配器将仅返回错误标志,它允许我们创建非常简单易用的uVC和监视器,使其与数字方法几乎相同。这意味着uVC将捕获错误标志并检查是否是预期的。另外,适配器为我们提供了轻松驱动信号的方法,而无需进行复杂的uVC驱动器编码。如果需要,适配器则能够将电压或电流值返回给uVC,例如清单5所示,显示了我们想打印的带有电压信息的错误消息。如果不期望发生(测试序列所期望的)OV事件,则将通过一条包含Vout电压值的消息来报告UVM_ERROR。

清单5:uVC监视器断言示例

采样方法将从专用的Verilog-AMS适配器读取当前的电压值,这意味着适配器需要具有冻结帧机制。在这种情况下,适配器需要在发生过压错误时对电压进行采样,并将其存储在如清单6所示的变量中。当uVC监视器调用sample()函数方法时,它实际上将从适配器冻结帧中收集值。适配器的基本功能不需要冻结帧,但是它们对于消息报告和简化调试很有用。

清单6:冻结帧示例

 

 

四. 优点和缺点

像任何其他方法一样,将Verilog-AMS适配器用作接口既有优势也有劣势。值得一提的是,从我们的经验来看,其被证明是适用于各种类型的DUT(包括电源管理、传感器应用等)的最佳方法

这种方法之所以好,主要是因为UVM验证工程师将有更多时间花在实际的验证任务上,而不是对复杂的驱动器和监视器进行编码。无需编写可以在某个飞行时钟上工作并且需要采样电压值并将其存储到阵列中的监视器,然后对该阵列进行一些处理,以便您可以简单地检测某个引脚上的错误事件,使用这种方法,只需要编写一个简单的检查器,该检查器由适配器的返回标志触发。而缺点是编写Verilog-AMS模型的模拟工程师将需要编写适配器。尽管适配器通常非常简单,但是根据要涵盖的所需功能,此任务可能相当耗时。

另一个好处是,使用这种方法,我们在运行混合模式仿真时无需更改任何内容。选择TL原理图而不是AMS模型时,将使用完全相同的测试平台设置。因为自动连接规则具有默认参数,其有时会导致错误的结果。使用它们时,尤其是在使用双向端口时,我们需要非常小心。而使用Verilog-AMS适配器时,我们不再需要照顾它们,因为适配器本身实际上就是一个连接模块。

如果我们需要使用WREAL模型,则只需进行一些小改动即可完成此工作。

最大的陷阱在于如正弦波等信号。像适配器一样,以简单的方式监视和检查此类信号非常困难。这样做的主要原因是很难编写能够跟踪正弦波的监视器。通过使用零交叉和最大值函数,可以很容易地监视幅度和频率,但是这里的问题是我们不能轻易知道该信号是否是实际的正弦波。图5显示了两种不同的波,一种是正弦波,另一种是锯波。适配器可以监视信号是否在适当范围内或着是否过压,可以监视频率是否正确,但是无法区分这两个信号。如果我们运行具有相同幅度、相同频率的正弦波和锯波,则适配器将无法分辨出它们是什么波。这是需要使用FFT(检测最高谐波)或者类似技术在UVC监视器内部实现的功能。这可能会为方法学的最大改进创造空间。

另一个很大的缺点是,要想在顶层运行第一个仿真,可能需要花费大量的时间。这是因为我们需要一起模拟模拟模块和适配器。默认情况下,此任务非常耗时,并且其对于验证至关重要。如果正确完成了模型和适配器,则顶层验证任务将非常容易,从而为所有设备功能的详尽验证留出了空间。

 

 

 

五. 总结

这种方法还不够成熟,还有很大的改进空间。如第四部分所示,存在许多缺点,所有这些缺点都需要付出额外的努力才能解决。尽管付出了额外的努力,但事实证明,这是查找错误的好方法,不仅可以查找设备的数字部分的错误,还可以查找设备的模拟部分的错误。众所周知,使用数字方法,我们能够很大程度上地验证模拟和数字部分之间的连通性。这种方法使我们可以对设备的所有功能进行建模,包括模拟循环和反馈。当我们需要在模拟模块集成到顶层时验证其行为的时候,该方法被证明是最佳的。我们还能够找到很多很难在实验室的硅片上找到的错误,例如模拟模块中的泄漏、阻抗不兼容等类似的这些错误。发现这种错误非常重要,因为它可以显著改善实验结果,并且当然会增加对同一芯片重新流片的次数减少的机会

 

 

原文来自:DVCon2017_USA, 点击阅读原文去路科官网下载DVCon2017论文合集,还有更多资料等你来哦!

 

 

扫描上图二维码可直达课程页面,马上试听

 

 

往期精彩:

路科发布| 稳中带涨!25w成芯片校招薪资平均底!2020应届秋招数据全面分析!

V2Pro 2020秋M1 我对你的迷惑和选择都深以为然

V2Pro 2020秋M2 秋招即将结束,而你还在徘徊吗

V2Pro春季班普遍学撑了,秋季班7月报名你还敢来么

UVM RAL模型:用法和应用

我们准备做第二期线下培训,依旧认真且严肃

如果你突然被裁员了,你的Plan B是什么?

[彩虹糖带你入门UVM]

理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够

 

SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值