相比于高度自动化的验证方法在数字领域的广泛应用,验证在模拟领域却意味着大量的手工工作和计算量。因为对于顶层验证,高精度的SPICE模型通常是不必要的,因此,它们经常被替换为适当的行为模型。这一调整显著加快了仿真,然而,整个设计过程中必须确保行为模型不从相应的模拟分量发散,这种模型验证必须手工完成,因此也是一个费时且容易出错的过程。
为了自动化验证,我们提出了一个新的借助UVM 的方法来比较SPICE模型和行为模型,并会展示这种方法如何在UVM环境中有效的使用。
要详述我们的方法,首先介绍扩展的UVM环境,它是用来验证模拟行为的,我们称之为A-UVM。
A. 模拟事务(Transactions)
与数字信号相比,模拟信号具有没有限制的co范围,可以将它们 假设成特定的形状,比如线性,谐波,甚至是随机的。显然数字信号很容易从位级转到事务级,而模拟信号就要额外的加上一些参数。比如,为了描述一个线性信号,那么在某一特定时间点,它的斜率和值必须给出。
在A-UVM里,我们从纯粹的数字接口将term形状和term已知的协议等同起来,此外,term事务代表一个数据结构,其包含了指定一个模拟信号所需的参数。
B.随机约束的模拟仿真
在UVM为基础的环境中,drivers是用来将事务(transactions)转化为数字信号的,为了传输模拟事务,我们在通用driver和交换算法之间实现了一个接口,这个接口允许在仿真中插入新的算法,算法决定被driver使用的传输类型。并且不局限于使用SystemVerilog编程,也可以是C,Matlab或者其它语言。
每个模拟事务都包含元数据,元数据又包含算法名称和其它信息,这些信息能被driver读取,然后这些事务(transaction)通过算法转化为信号。
C. 监视模拟行为
一个模拟监视器有任务从给点的形状提取信号参数,为了实现这个目的,监视器通过一个专用的接口使用一个特定算法。
因为一个特定的算法的选择可能依赖于我们将部署监控算法与 monitor分离,这使得这使我们能够管理自己的库中的所有监控功能。除此之外,它允许在运行时交换监控算法,这非常有用。
为了使监视器初始化时产生事务(transactions),我们给A-UVM添加了触发器的概念。我们实现了一个覆盖频繁发生活动的触发器的选择;此外,用户定义的触发器可以通过回调插入机制;它还可以在逻辑上连接几个启动事件,从而创建触发器的组合;最后,利用相同的概念以终止产生transactions。
实际的特征提取是由通用监视器完成的,监控算法的选择主要取决于验证工程师和项目的需求。在相似性分析上,所采用的算法定义了如何在积分板里比较信号。所描述的概念如图2所示:
下面是最重要的类的实现,以及EMD功能的实现。首先,一个sv的class定义如下,这个类用来在记分板(scoreboard)里初始化度量标准:
下一步是声明一个单独的C函数,以求得Xi和Yi之间投影到水平面距离。因篇幅有限,函数代码见原文。
最后,要实现约束条件5,6,7:
在本文中,我们提出了一种新的方法比较模拟模型和其输出行为,其主要思想是量化一定程度的相似性,这项措施使我们能够进行递归测试,因此,手动检查模拟信号的波形工作可以大大减少。由于这种方法不依赖于电路的类型,因此,它具有普遍适用性和高度复用性。
我们的最终目标是提供一个基于UVM的模型,专门针对于模拟电路设计和验证。这个模型基本上应该包含通用的驱动技术,监测和检查模拟信号,以及覆盖率的收集和参考建模等。