介绍用MATLAB和Simulink进行FPGA验证
概述
2018年的一项研究显示,84%的FPGA设计项目(包括一些安全关键型设计)遭受了重大bug泄漏到生产中,10%的项目有四个或更多bug泄漏到生产中。
在本次网络研讨会上,MathWorks工程师将演示一系列FPGA设计团队目前正在使用MATLAB和Simulink验证FPGA设计的正确性能的技术。
- 使用MATLAB和Simulink测试台验证RTL实现符合规范模型,然后使用这些测试台在FPGA和SoC板上进行硬件测试验证实现。
- 通过在设计中插入探针和触发器,在硬件测试和MATLAB分析结果期间捕获内部信号,从MATLAB和Simulink调试FPGA实现。
- 使用Simulink中的测试工具来实现具有高水平功能覆盖的Simulink测试工作台,然后自动生成SystemVerilog或UVM测试工作台组件,用于生产验证环境。
MathWorks工程师将使用示例设计演示这些技术。
的主持人
Mark Lin是支持ASIC/FPGA工作流程的高级应用工程师,擅长数字设计验证。Mark在Broadcom做了8年的验证工程师,在那里他开发了全芯片测试环境。他获得了加州州立大学洛杉矶分校的电气工程学士学位。
Eric Cigan是MathWorks负责ASIC和FPGA验证的主要产品营销经理。在加入MathWorks之前,他在MathStar、AccelChip和Mentor Graphics担任技术营销职务。Eric在麻省理工学院获得机械工程学士和硕士学位。
记录:2020年8月25日
大家好,欢迎大家。我叫埃里克·萨根。我是MathWorks的一员,在美国马萨诸塞州的纳蒂克,我今天要做的演讲,还有我在西海岸的同事马克·林。今天,Mark和我在这里讨论FPGA验证的话题。这是及时而重要的信息,因为FPGA设计项目越来越大,设计团队正在寻找更好的工具和方法,以帮助确保FPGA实现满足规格和质量要求。
在这次研讨会,我们将使用一个图像处理的例子展示了如何利用MATLAB和Simulink黄金参考FPGA实现,如何使用你的内部HDL模拟器以及MATLAB和Simulink,如何采取下一步,使用FPGA或SOC发展委员会,以及MATLAB和Simulink仿真,然后从MATLAB如何生成组件或仿真软件系统testbench下游生产的硬件设计和验证团队。
但首先,让我们看看一些数据,这些数据显示FPGA验证的问题究竟有多严重。在过去的十年里,Mentor Graphics一直与Wilson Research Group合作,通过他们每年两次的调查来跟踪功能验证领域的问题和趋势,定期从世界各地的设计团队中获得1000到2000个回复。
我发现第一张图表非常令人担忧。它展示了重要的错误逃逸到生产FPGA设计中的频率。想想看,在投入生产的七个FPGA项目中,有六个已经部署了一些重要的错误。更糟糕的是,每10个项目中就有一个存在4个或更多的重要bug。如果你比较2016年和2018年的结果,在这里,你会看到趋势正在朝着错误的方向发展。实际上,我来这里是为了看看Mentor即将发布的下一份报告,看看这种趋势是否会继续下去。
如果我们深入挖掘并查看功能缺陷的根本原因,我们将看到前三个原因是设计错误、更改和规范,以及不正确或不完整的规范。这三个原因都表明,主要问题不在于硬件设计。硬件设计人员依赖的是编码系统级别的规范。使用MATLAB或Simulink来评估设计并创建可执行的规范是避免这类问题的好方法。
这就是我们接下来要讲的内容。我们将用MATLAB和Simulink演示FPGA验证工作流程。我们将演示使用HDL模拟器和Simulink之间的代码模拟进行交互式验证。然后,我们将进行下一步,使用FPGA开发板以Simulink作为系统测试台执行基于硬件的验证。
现在,我把话筒交给马克。Mark在设计验证方面有丰富的经验。因此,他将介绍如何从MATLAB和Simulink中生成验证组件,然后在RTL仿真中使用它们,这是您在生产验证环境中看到的典型情况。然后我们做一个简短的总结。让我们来看看其中一个工作流程。我们将从更传统的典型工作流开始。
所以,在这里,我们看到在FPGA项目中有两个团队,一个专注于研发,另一个专注于硬件设计验证和实现。通常情况下,这些团队是分开的,只有通过手工编写的规范进行真正的沟通。硬件设计人员根据这些编写的规范手动编写RTL。
然后,验证工程师手动创建测试台环境,以确保设计符合规范。这些可能包括验证体系结构、刺激、用于检查的黄金参考模型,以及外部的模型——以及外部于被测设计的系统模型。通常,他们把所有的时间都花在验证上。最后,他们发现设计在系统环境中甚至不起作用。这可能需要很长的迭代周期来修复。
现在,通过使用MathWorks的产品H2O Verifier,它将系统上下文和硬件设计结合在一起。HDL Cosimulation在HDL模拟器中模拟设计。它连接到MATLAB或Simulink中的系统级测试环境。fpga在环做同样的事情,除了设计加载到实际硬件的高保真模拟,通常带有加速。
SystemVerilog DPI组件生成导出MATLAB和Simulink的黄金参考模型、刺激和系统模型,以加快验证环境的创建,前提是MATLAB代码或Simulink代码是兼容的C代码生成,这是所有这一切的基础。
最后,我们支持的最新方法实际上是直接从Simulink生成UVM测试台和UVM组件。这加快了在使用越来越受欢迎的普遍核查方法中使用核查的速度。
让我们开始演示吧。本演示设计是一个简单的视频处理设计,一个枯燥的滤镜。因为它有大量的数据处理,我们将把分辨率从1080p降到240p。这样在低分辨率下模拟速度会更快。一旦经过验证,我们就可以将设计扩大到1080p。
现在?让我们打开Simulink中的模型。但在我们开始之前,我们可能应该看一下我们马上要看的视频。这段视频只有两秒钟。但我们应该看看它是什么样的,以供参考。
好的,明白了。让我们继续演示。这是Simulink中的模型。240p视频源在最左边,它输入横跨画布中间的行为规范模型和横跨画布底部的面向硬件的实现模型。
在行为模型内部是一个2D FIR滤波器,它将进行图像模糊处理。我们看蒙版内部,我们可以在MATLAB语法中看到照片系数。接下来,在实现模型中,让我们看看将作为测试或DUT下设计的过滤器。该子系统还使用2D FIR滤波器,在本例中,来自Vision HDL工具箱。这两者之间的区别是,Vision HDL工具箱中的块使用流像素接口。
串行处理对于硬件设计是有效的,因为较少的片上和DDR内存需要存储用于计算的像素数据。零接口允许块独立于图像大小,格式运行,并使设计更有弹性的视频计时错误。然后在DUT的输出上,我们用它来阻止反序列化设计的输出,这将允许我们查看视频输出并将其与行为规范模型视频输出进行比较。
我们点击Run按钮开始模拟。如您所见,我们有视频输入、行为模型和实现模型的查看器。你可以看到右边的图片已经经过了无聊滤镜。是啊,我几天前在后院拍的这段视频。照片上是我的狗,米洛,在乞讨食物。
我们的第一个验证步骤将是HDL联合仿真。用这张图来回顾一下,这里,我们真的很关注这部分。让我们开始吧。我们实际上启动了Questa Sim模拟器。我们提出[听不清]。我们可以把它做成我们想要的形状。我们可以在波窗口上做一些工作,缩短名称,把通讯都设置好,这样我们就能很容易地查看。
我们可以在这里启动模拟。如你所见,我们得到了和以前一样的观点。但要记住的关键是这里会有一些不同,因为现在我们扩展了端口。现在我们也能看到所有的细节控制信号。
好处是我们可以比较它们在初始参考和协同仿真模型之间的表现。你们可以看到下面的图表每个都向我们展示了参考模型和联合仿真模型之间的区别。你可以看到它们趋于0。因此,这给了我们信心,我们拥有的模型——或者RTL的实现正在跟踪规范模型和Simulink。
我们先把这些放在一边。如你所见,这里,我们只有9%好,当它运行的时候,让我们继续,回顾一下我们用HDL Cosimulation做了什么。您正在用MATLAB和Simulink测试环境验证您的HDL。通常情况下,此时您正在验证的是RTL级别。
通常情况下,如果你是系统研发团队中的一员,而你又不能很好地访问硬件团队,你就会使用这种方法。您希望自己进行交互式早期验证。在其他情况下,你的系统团队和硬件设计团队之间有紧密的合作,在这种情况下,这真的给了你一种通用的方法来验证在系统级别设计和硬件实现之间的交互级别。
只需要在上面加一点颜色。当你与商业HDL模拟器进行联合仿真时,你所做的就是重用你现有的MATLAB或Simulink测试台,正如我们在这里看到的。你在这个移植的模拟器中运行所有的HDL代码。我们已经列出了支持的模拟器,Mentor Graphics、ModelSim或Questa模拟器,以及Cadence、Incisive和Xcelium模拟器。
HDL验证器所做的是它真的生成整个协同模拟基础设施与握手。这里要强调的一点是你可以在一台机器上运行这个,模拟器,HDL模拟器和Simulink一起运行。也可能是——而且通常是通过网络进行的。比如说,如果你有一个服务器群,在Linux下运行,你在那里使用你的HDL模拟器,你可以通过使用HDL验证器连接到它。
现在让我们回过头来看看这个模拟是如何进行的。好了,现在我们可以看到我们快要完成了。我们现在达到了95% 96%我们看到最后几帧点击购买。当我们结束的时候,我们要看的是,我们可以得到更详细的结果通过观察针上的单个信号。
这里我们看的是来自DUT的像素输出,以及来自其中一个控制信号的输出。再一次,我们在这里看到的是与参考模型对比的协同模拟结果。你可以在每幅图的底部看到它们的差异。结果是0。这就是我们刚刚完成的整个模拟过程。
好了,这让我们对HDL协同模拟有了一些了解。这个过程的下一部分我们要做的是查看fpga在循环中的验证。我现在就告诉你怎么做。
好了,我们准备好使用fpga -in- loop。这是我们的模型设置fpga在环Xilinx VC707板。这是一个7号判决板。在这个模型中,我们有和之前一样的行为模型。现在,我们可以看到fpga在循环块。我们可以看到这个块实际上是由HDL验证器创建的。并提供了Simulink会话与FPGA板之间的通信通道。我们使用HDL验证器通过以太网来设置这种通信。
我现在就给你们看黑板在我的办公室里。但考虑到我们的工作情况,我实际上是在一个VC707板上运行这个测试,在我们位于纳蒂克的湖滨校区的实验室里。因此,正如我们在HDL的Cosimulation中看到的,fpga -in- loop块使用像素流。带有视频控制信号的总线已经被分解成它的组件,在它的输入处序列化,在它的输出处反序列化,再一次,输出到那里的查看器,所以我们可以看到它和参考是如何比较的。
然而,在我真正运行fpga在循环之前,我仍然需要首先用比特流对电路板进行编程。我已经提前生成了比特流。因此,我们可以使用掩码的FPGA在环块,并在板上编程FPGA。
好了,一旦加载完毕,我们就可以运行模拟或运行fpga -in- loop。所以我要开始运行fpga在循环。我们会看到它在底部开始计数。我们会看到,非常缓慢,当然,Milo在这里的移动,当他在完成他的步伐。
所以,就像以前一样。这得花点时间。所以为什么我们不停下来,让我们来看看这个fpga -in- loop的概述。那么总体用例是什么?它是一种在与MATLAB或Simulink会话相连的FPGA上构建算法原型的方法。
这一点很重要,也很微妙。因为它确实要求,fpga在循环中,所有进入你的电路板的输入必须来自MATLAB或Simulink会话。你不能让其他视频流从其他地方进入电路板。这些都来自于MATLAB或Simulink中的资源。
好的,也就是说,它确实很好地解决了一些用例。当然,在硬件上运行它,而不是在逻辑模拟器上运行它,在许多情况下,在真正将整个设计部署到FPGA板之前,是最接近实际执行的事情。
它还为算法提供了概念证明。想象一下向你的管理层和客户展示一个算法。这确实提供了一种很好的方式来交互式地显示,并为您提供了一种将结果可视化的方法。这是一个很好的展示算法的例子。而且,在很多情况下,相对于HDL协同仿真,它实际上可以加速这些计算密集型算法。
在这个特殊的设计中,情况并非如此。它实际上在FPGA循环中比在协同仿真中运行得稍慢一些。但这总是设计类型的一个功能。如果您有兴趣了解更多,请与我或您当地的MathWorks HDL AE联系。它们可以为您的特定设计提供更多的见解。
我们再详细讲一下。这样做的主要好处是可以重用现有的MATLAB或Simulink测试台,从最初的Simulink仿真一直到现在的HDL协同仿真,一直到fpga在循环,都是相同的测试台。
我们提供自动化帮助您将比特流编程到Xilinx Intel和Microsemi板。为此,我们支持各种各样的商用现成板。我们有一个硬件支持包,很棒的显示验证器,实际上,有三个硬件支持包,很棒的显示验证器,Xilinx Intel和Microsemi各一个。它们有一些预先定义好的板。我们会在稍后的网络研讨会上给你们列一个清单。
通信可以通过千兆以太网或JTAG或PCI Express实现。由于涉及到开发工作,我们支持的PCIe板相对较少。但它的运行速度确实比其他两种机制快得多,千兆以太网位于中间,JTAG是速度最低的。
说到这个,让我们回到我们的fpga在循环的例子,看看它是如何执行的。如你所见,我们已经到了最后时刻,到了模拟运行的最后几帧。我们在往上数,看到狗的动作了吗。实际上,现在它完成了。
现在的好处是我们可以,就像我们用FPGA做的一样,或者像我们用HDL Cosimulation做的一样,HDL Verifier提供了这些很好的比较图表,所以你可以看到参考和FPGA在环中的数据在这一点上对于像素和一个控制信号。
再说一次,这真的是在建立你的信心。现在你已经通过了协同模拟,通过了fpga -in- loop。你得到了很好的结果。
现在,我们要做的就是把这个交给Mark Lin。Mark Lin是一位经验丰富的设计验证工程师。他今天在这里的作用是带我们进入下一步,也就是一旦你从算法的角度验证了这个设计,一旦你完成了这个交互验证——现在,在某个时刻它将被转移到设计验证团队。他们将使用一个完全不同的验证环境。马克会告诉你的。接手吧,马克。
谢谢你,埃里克。随着设计和FPGA的复杂度和规模不断增加,RTL级验证的需求变得更加重要。拥有完整的设计可视性使我们能够捕捉到那些用传统探测技术很难捕捉到的bug。然而,就创建测试台架、测试用例、检查机制和测试用例本身的执行所需要的努力而言,这种可见性确实是有代价的。
正如Eric所提到的,重要bug的根本原因来自于设计和规范错误。然而,通过使用Simulink,我们可以轻松地创建测试和检查机制来捕获这些错误并验证它们的修复。然后可以将此工作导出到RTL级别的模拟,以进行验证并减少此特定测试所需的工作。
DV或验证,设计验证,在任何设计项目中都是第一次投票。对于ASIC,你可以看到——你可以预计大约50%的时间花在设计验证和fpga上,大约47%,46%的时间花在DV上。然而,在实际经验中,我发现这个数字要高得多。我经历过75%到80%的项目时间都花在做DV上。
我的DV工作就这样瓦解了。37%的时间花在调试上。24%的时间花在创建测试和运行模拟上。我22%的时间花在创建测试台和调试测试环境上,以确保它按我期望的方式工作。14%,我将花在与我的同事和项目中的其他人一起进行测试计划上。
模拟希望提供帮助的方式是贡献或加速您的测试台开发过程,使您的测试创建更容易一些,并使您的测试用例运行更快一些。我们想要做到这一点的方法是通过左移的概念。这个想法是这样的,当你从高级抽象到低级实现,从规范到建模再到RTL级捕获,一直到网络列表,你会发现你的设计空间会变得越来越大。
您在空间中机动、捕捉bug和对问题做出反应的能力变得越来越慢。这个想法是这样的。我们希望能够在模型级别进行设计或调试验证,并一直向左移动到尽可能高的抽象级别。
因此,我们将利用HDL Verifier的能力生成C语言作为直接编程接口,这是一个很好的系统导入外语到RTL模拟和HDL Verifier的年龄测试的标准。但是HDL验证UVM测试生成能力。
好的,继续我们的图像[听不清]模型。我已经做了一些补充和额外的更改,所以我可以为DPIC热电联产做好准备。我做这个模型的时候,米洛不在。所以我不得不在后院给我自己的宠物犀牛录音。你可以看到,在视觉上,我们可以很容易地检测到犀牛已经被我们的模糊滤镜足够模糊了,在这里的红色部分。
然而,如果您想用SystemVerilog以编程的方式完成,这实际上是相当困难的。现在,MATLAB和Simulink有很多分析工具的功能和子系统,让我们可以做图像质量检查或其他各种形式的分析,我们可以利用。
在这种情况下,我碰巧选择峰值信噪比的简单形式作为我的决定因素。现在,我随意选择17来表示我的图像是否足够模糊。这里的重点是我不需要手写峰值信噪比函数。我只是将此功能导出到我的RTL级别环境中,然后就可以开始了。
另外,因为我从MATLAB和Simulink中获得了大量的函数和功能,所以以一种适合RTL级别验证的方式构建我的模型也是很重要的。举个例子,在我的左手边,我有三个块它们构成了模糊滤波器的输入。我想把它们归到一个子系统中命名为序列块。
剩下的,在这里,消耗过滤器输出的,我会把它们分组到一个子系统中命名为,命名为记分板。这是C或E4。好的。
现在我已经准备好生成——我已经准备好生成C代码了。例如,我想为序列本生成DPIC。我想在这里做的是确保我的热电联产引擎已经被选择系统Verilog DPI。进入热电联产系统目标文件,选择SystemVerilog DPIGRT。一旦完成了这些,就需要右键单击我的代码块,并向下到C代码,然后为子系统构建。
任何在序列块中使用的变量,我们都会自动生成,我们会检测它们,或者使用它们,或者将它们硬编码到,汽车编码,将值放入C代码中。或者您有一种模式,我们将生成一个函数,您可以在模拟中执行DPIC代码期间调优这些值。因此,通过单击Build,该工具将继续生成C代码。
C代码生成后,你会得到一组函数它们代表序列块的功能。我们生成的第一个函数是初始化函数。这个函数充当模拟器中所有空间和位置的内存分配,我将需要在模拟模型中建模您的行为。
reset函数在设计的重置阶段被调用。每当断言reset时,此函数将重置CMO的所有输出。然后输出将交付——当调用时,将交付CMO的实际计算。然后,在更新函数之后立即调用。然后,我们对C模型的输入采样,然后让它准备好进行下一个卖出计算,下一个输出计算。
Terminate是初始化的反转。它基本上释放了模拟器中我们到目前为止使用过的任何内存位置。当您一遍又一遍地运行一系列的测试时,这是很有用的,然后您想在句子后面加上一个句号,以便您可以开始重新测试。
下面是一个示例,说明这些函数通常如何集成到SystemVerilog模块中。在初始化块期间,我们会调用初始化函数,设置内存位置和空间。在我们的最后一个阶段,我们的测试已经准备好退出,我们继续并清理我们的内存位置。
在重置期间,我们将调用重置函数。因此,我们的DPIC模型的所有输出都被清除为其默认值。当时钟运行时,一旦系统被启用,我们将调用输出来交付计算,就像在C模型中所做的那样,然后立即调用更新函数,这样我们就可以为即将到来的计算采样下一个事件。
仅从这个模型中,我们可以看到,我们可以生成DPIC代码,作为我们设计中的刺激生成部分。因此,用它来刺激我们的RTL。但除此之外,您还可以从过滤器本身生成DPIC模型。例如,如果你可以——从模糊过滤器的C模型生成器可以作为你的参考模型,也许,一个遗留的RTL或你的武器库中手工涂布的RTL,对吗?您可以使用它来检查由其他人编写的RTL在功能上是否正确。
最后,这里的记分牌是你可以利用检查机制,峰值信噪比来检查你的模糊滤波器功能的有效性,这都是通过热电联产来实现的这样可以节省你在环境中手动编码这些功能的时间?
一分钟前,我提到了通用验证方法UVM的使用。这是典型的ASIC形式的验证。它实际上是为进行健壮性测试而设计的。它的设计确实考虑到了重用,这意味着该特性的任何部分,这种编写验证测试的方式,都可以在项目之间重用,无论这些项目之间有多大差异,只要它们被正确地编写。
现在,使用UVM的另一个好处是它可以通过利用SystemVerilog的随机约束特性来自动创建测试用例,这样您就可以进入这些测试空间并设计特性,而不必实际自己编写代码,对吗?然而,有了所有这些好处,工程师要正确地构建这些类型的测试台,然后执行和调试它们,初始成本非常非常高,对吗?
测试用例的创建也非常繁重。通常情况下,工程师,DV工程师,在建立他们的测试台架之后花大部分时间来创建测试序列和创建记分牌来验证他们的设计。此外,环境本身也会变得非常非常复杂。因为它是用SystemVerilog编写的面向对象的东西。
您有许多活动的部分一起工作来测试您的环境。如果你——特别是当你的设计很大的时候,你可能有很多很多的环境,很多很多的组件和部件以及移动部件一起工作来进行测试。
有了这个,我们在这里要做的是通过自动生成-通过自动生成这些组件给你一个可执行的UVM测试用例来减轻一些复杂性。因此,您不必担心从头开始构建测试用例和环境。
就在RTL删除时,你可以交付一个可执行的UVM环境,你可以自己使用,也可以交给你的设计验证工程师。然后他们可以从那个测试用例扩展到做比你已经做的更多的事情,对吧?
这里的积分方法是,还记得我之前生成DPIC代码的序列块吗?我们生成UVM的方式,在底层,我们都只是利用DPIC。所以我为它生成DPIC的序列块,我要把它埋在我们称之为UVM序列的东西里。序列本质上是,它将被使用的刺激,一系列刺激将被驱动到你的设计或测试中的DUT中。
我用的记分板块,你们看到的,我们可以为它生成dpi,我们会在那里使用dpi并将它嵌入UVM记分板,这是另一个名字,用于检查机制,DUT的响应,对吧?
现在,仅仅这两个模块,还不足以进行UVM测试。在典型的UVM测试中还涉及到其他块。有一个序列器,所有类型的刺激的仲裁者进入你的DUT,驱动程序,然后是监视器,机制,它实际上驱动事务进入你的设计,然后采样响应,把它带回环境,封装在UVM环境中,本身。
我们生成这个环境的方法和我们之前展示的图像处理模型非常相似。再一次,像图像处理模型,比如说,我们有一个计数器,你必须告诉我我们做了什么,你的刺激产生组件是什么,你的验证组件是什么。将它们分组到一个子系统中,就像我们对图像处理模型所做的一样。从那里,我可以为你生成UVM组件,好吗?这就是它在演示中的样子。
让我用图像处理模型演示一下。你会得到一个可执行的UVM环境,看起来像这样。你提供被测试的设计。我将自动生成一个接口文件,一个SystemVerilog接口文件,用于测试设计。
我会根据你的Simulink模型自动创建驱动程序,序列,自动创建将对你的DUT的响应进行采样的监视器,自动将它们包装在一个老化的组件中以实现可重用性,根据你的Simulink模型生成记分牌组件,将它们包装在一个环境组件中以实现可重用性。因为项目的环境可能在不同的项目或不同的修订版本之间有所不同。
最后,交付一个完全可执行的UVM测试用例,同样,你可以自己执行,或者交给你的验证工程师去做工作,去做实际的验证工作量。
让我们看看这是什么样子的,并使用我们的图像处理模型进行练习。回到我们的图像处理模型,我们将利用HDL Verify作为UVM构建命令来生成UVM测试台。要使用这个命令,我们必须告诉它我们的设计测试块在哪里,序列块在哪里,以及我们的记分板在哪里。
在这里,我从我们的DUT序列和记分牌的模型中捕获了层次路径,并将其传递给UVM构建命令。一旦我们执行了这个,系统就会建立我之前描述过的UVM架构。
好了,现在它已经完成了,让我们看看我们从生成的东西中得到了什么。您将在UVM账单中找到所有UVM构件,在带有UVM构建的testbench下的目录后缀中。这是计分板,这个计分板的目录层次结构。
让我们来看看这个序列里面有什么。在序列内部,我们将看到这是一个功能齐全的UVM组件,其中实际的繁重工作是由这两个DPIC函数完成的。这些DPIC函数是从您的SystemVerilog Simulink模型生成的,完全与您在图像处理模型中写入的一样。
我们只需要利用C代码,将事务的顺序退化到驱动程序。我们调用DPI,发送事务,然后等待驱动程序将该事务交付到测试设计中。
在记分牌中,事情现在是反向进行的。事务是从监视器组件中提取的。然后,这些事务被发送到计分板的DPIC模型。记分板然后返回一个错误消息——返回由这些行中的case语句确定的通过/失败标准,并向模拟器指示什么地方失败了或通过了。
默认情况下,这里的行为是,没有消息就是好消息。如果DPIC没有检测到任何错误,那么就不会发送任何消息,因此,消除-减少锁内部的混乱数量[听不清],这将是调试的主要模式。但这是通过在你的锁中寻找这些通过和失败的消息。
现在我们在UVM热生成中做了一件事,除了创建这些DPIC函数,将它们嵌入到UVM环境中,我们处理了很多事务的定时同步,比较了参考模型和设计。因为有时候序列出来的速度会比RTL代码快很多。
例如,你可能有一个设计,其中有一定的延迟,而功能模型的行为可能没有那个延迟。我们解决这个问题的方法是在UVM中自动创建FIFO的表示。因此,我们只在FIFO中有内容时进行比较,有效地删除了测试的计时元素。
简而言之,我们生成的任何UVM测试用例都是时间无关的,因此,你可以从不同的项目中重用它,在不同的项目中你可能有不同的时钟需求。
在生成UVM测试台环境之后,我们还自动生成测试用例——在它们特定的模拟器中实例化这些测试用例或运行这些测试用例所需的命令行。我们支持Cadence Incisive, Cadence Xcelium, Mentor Graphics, Questa, Sim和VCS。在这里,我将展示一个在Cadence Incisive工具中如何调用生成器UVM测试用例的例子。
我们简单地说,这是我的测试单元,由您的系统模型自动生成。我们将库(由模拟自动创建、生成和编译的DPIC库)传递给模拟器,以及它们对应的SystemVerilog文件,并按照我们的方式进行。从这一点开始,[听不清]现在将以UVM的形式精确地模拟你在模拟中捕获的东西。
让我们回过头来看看我们生成的UVM测试用例的架构。有人可能想到的第一个问题是,您为我生成UVM代码很好,但您如何知道我的设计使用了哪些接口?现在,有时您可能有一个AXI接口、一个PCIe接口或一个SPI接口。
好,让我们回到我们从你的系统中生成的UVM架构。好吧,让我们——好吧,让我们——
好的,让我们再看一看我们从Simulink模型生成的UVM体系结构。现在,通过看这个,一个问题可能会是,Mark,你为我生成UVM很好,但你怎么知道我的设计使用的是什么接口?它可能是AXI, PCIe, AHB,或者其他任何一个
让我们回顾一下
一个,两个,三个。
让我们再看一下UVM测试用例的架构。通过观察这些,人们可能会有一个问题,你如何知道设计使用的是什么界面?它可以是AXI、AHB、PCIe或SPI。从Simulink的角度来看,我们怎么知道呢?答案是,我们不知道。我们实际上不知道用户界面会是什么样子。所以我们完全期望用户用他们自己创造的东西来代替那个驱动程序。
驱动程序和监视器是我们生成的惟一UVM组件,我们希望用户用特定于自己的东西替换它们。您可以使用AXI。您将编写一个理解通过管道传入的事务的AXI驱动程序。或者,如果你去不同的项目,你可能会重写那个驱动程序,例如,使用一个PCIe接口。试着写一个理解PCIe的驱动程序。生成的其他所有东西保持不变,并完全重用。
现在,说到随机化,我提到过随机化是UVM的一个重要部分,因为它允许DV工程师创建额外的测试来测试设计,鲁棒性测试[听不清]设计。当我们这样做的时候这是你在模拟环境中使用的任何MATLAB变量,我们会自动生成一个函数,后面跟着一个后缀setparam。这个函数可以在你的UVM类的任何地方被调用,以改变你在Simulink模型中放入的变量的值。
具体来说,如果你在设计中有一个这样的随机约束,DV工程师已经创建了它说,嘿,我想在值1到1000之间波动或者一组值,一组我想用于这个参数的特定值,你可以在随机约束块中创建它通过它的setparam函数将随机化值按到那个变量上。现在,自动生成的测试用例将采用新的参数,拥有一组完全不同的行为来测试您的设计。
这就是我们如何加速和简化UVM环境的设计过程和开发过程。
好了,今天要讲的都讲完了。我们讨论了使用HDL验证器的fpga的验证工作流程。我们开始考虑与我的导师Questa合作。我们展示了用Xilinx开发板进行fpga在环测试。然后我把它交给Mark,他涵盖了如何使用系统测试台的各个方面,现在你可以在下游验证环境中利用它进行各种形式的验证。
那么现在你从哪里能学到更多呢?最好的单身去处是MathWorks.com/verify。那是HDL验证器的产品页面。在那里,您将看到视频,示例,支持的FPGA和SOC开发板的列表,以及接触销售和请求试用的能力。
让我们看一下产品页面。在上面这里,你会看到,这是它不同部分的索引。但是你会看到关于每个HDL Cosimulation的信息。您将看到关于生成UVM和SystemVerilog验证组件的信息。这里有更多关于fpga在环和其他形式的硬件测试。你可以看到如何使用HDL验证器和HDL编码器,这是我们今天做的。还有更多关于其他特性的信息我们到目前为止还没有机会真正深入了解。
但是在最下面这里,你会看到一个文档的链接。让我们继续看一下。这是HDL验证器文档集。任何人都可以随时去查看。这真的涉及到我们今天讨论的所有不同形式的验证。
我特别想指出的一点是“入门”页面。显然,这将带您了解一些基本的教程和示例。但这里有一个重要的东西,是支持的EDA工具、验证工具以及FPGA板的列表。如果你能一直向下滚动到这里,你会看到所有这些信息都非常清晰地呈现出来,有来自Xilinx, Intel, Avnet,以及Microsemi的一长串电路板。
谢谢你们今天的时间。再次访问MathWorks.com/verify,希望您能够解决所有验证需求。非常感谢。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。