精华内容
下载资源
问答
  • 一种连接UVM验证平台的搭建方法与流程
    2020-12-18 19:18:47

    技术领域本发明涉及芯片设计验证领域,具体地说是一种实用性强、连接UVM验证平台的搭建方法。

    背景技术:

    伴随着芯片集成度增加,各种通信与信号处理算法被集成到系统芯片中,这些算法通常需要先利用Matlab或Simulink进性算法层的建模,然后利用Matlab自带的转换器转换成RTL代码,或者人工将Matlab代码转换为RTL代码,供系统芯片集成,仿真综合使用。这种转换过程,尤其是人工转换,需要确保其功能的正确性,也就是算法层与逻辑层的功能相一致。这就需要进性一些验证与测试。UVM验证方法是芯片验证业界最新研发的一种验证方法学。工程师用它可创建坚实、可重用、具互操作性的验证组件和验证平台。UVM提供基于SystemVerilog语言开发的一套库函数,工程师通过调用库可以省去自己从零开始开发验证环境的麻烦。此套方法已经在芯片开发的行业得到较广泛应用,它的受控随机数产生机制能大大提高验证效率,对于算法实现类的模块的验证尤其适用。UVM本身是针对SystemVerilog语言开发的,所以若想将这套验证环境与Matlab环境连接,还是需要解决一些具体问题的。为了有效的利用UVM验证方法的优点,来验证算法实现电路的功能,本发明构建一个验证平台中同时运行针对SystemVerilog的仿真以及Matlab模型的仿真。

    技术实现要素:

    本发明的技术任务是针对以上不足之处,提供一种实用性强、连接UVM验证平台的搭建方法。一种连接UVM验证平台的搭建方法,其搭建过程为:通过UVM验证平台产生激励,将激励同时发送给RTL代码被测对象以及Matlab模型,比较两者输出的一致性,来确认RTL代码的正确性。其具体搭建过程为:设置UVM验证平台;设置Matlab模型;通过SystemVerilog的动态程序接口DPI连接UVM验证平台与Matlab模型;设置仿真器及可控制仿真器的脚本,并运行验证平台。所述UVM验证平台内置计分板,该记分板里嵌入上述Matlab模型,该UVM验证平台产生激励数据包并发送给RTL代码被测对象,同时将此数据记录下来,发送给记分板;RTL代码被测对象再输出数据信号给UVM验证平台,UVM验证平台进行收集后也发送给记分板,记分板对两组数据流进性比较,判断是否正确。UVM验证平台里嵌入Matlab模型的具体过程为:首先实现SystemVerilog与Matlab的协同,两者的协同通过一个C程序的头文件来实现,即:通过Matlab自带的C函数库实现对Matlab的控制,调用Matlab的启动、关闭、输入输出;SystemVerilog的动态程序接口DPI直接导入和导出上述C函数库中的函数,从而实现通过SystemVerilog调用C程序然后控制Matlab,实现把Matlab模型嵌入UVM验证平台。所述仿真器包括逻辑仿真器和算法仿真器,并通过脚本实现对仿真器控制,来打开DPI的使能以及使Matlab工具与逻辑仿真器同时启动,以便完成验证平台的数据监测功能;通过使用SystemVerilogDPI连接UVM验证平台与Matlab模型使得逻辑仿真器与算法仿真器同时运行,保证了算法到逻辑映射转换的正确性。本发明的一种连接UVM验证平台的搭建方法,具有以下优点:本发明提供的一种连接UVM验证平台的搭建方法通过利用UVM验证平台产生激励,将激励同时发送给RTL代码被测对象以及高层次Matlab模型,比较两者输出的一致性来,来确认RTL代码的正确性,有效的利用UVM验证方法的优点,来验证算法实现电路的功能,能极大提高带有各种复杂算法的芯片验证的效率,缩短芯片开发周期,实用性强,易于推广。附图说明附图1为本发明的UVM验证平台示意图。附图2为UVM验证平台与Matlab模型的连接关系图。附图3为Matlab控制的C头文件图。附图4为Matlab控制的SystemVerilog调用过程图。具体实施方式下面结合附图和具体实施例对本发明作进一步说明。如附图1、图2所示,本发明的一种连接UVM验证平台的搭建方法,其搭建过程为:通过UVM验证平台产生激励,将激励同时发送给RTL代码被测对象以及高层次Matlab或simulink模型,比较两者输出的一致性,来确认RTL代码的正确性。其具体搭建过程为:设置UVM验证平台;设置Matlab模型;通过SystemVerilog的动态程序接口DPI连接UVM验证平台与Matlab模型;设置仿真器及可控制仿真器的脚本,并运行验证平台。所述UVM验证平台内置计分板,该记分板里嵌入上述Matlab模型,该UVM验证平台产生激励数据包并发送给RTL代码被测对象,同时将此数据记录下来,发送给记分板;RTL代码被测对象再输出数据信号给UVM验证平台,UVM验证平台进行收集后也发送给记分板,记分板对两组数据流进性比较,判断是否正确。与普通UVM验证平台不用的唯一一点是记分板里接入了一个Matlab模型,来运行被测对象的算法实现。为了让SystemVerilog实现的UVM验证平台与Matlab模型同时运行,需要正确的连接他们,图2表示了这种连接的实现。UVM验证平台里嵌入Matlab模型的具体过程为:首先实现SystemVerilog与Matlab的协同,两者的协同通过一个C程序的头文件来实现,即:通过Matlab自带的C函数库实现对Matlab的控制,调用Matlab的启动、关闭、输入输出,图3是这个C头文件的示例;SystemVerilog的动态程序接口DPI直接导入和导出上述C函数库中的函数,从而实现通过SystemVerilog调用C程序然后控制Matlab,实现把Matlab模型嵌入UVM验证平台,图4是SystemVerilog调用C控制Matlab的过程示例。所述仿真器包括逻辑仿真器和算法仿真器,并通过脚本实现对仿真器控制。对于不同的仿真器,也需要加入一些特别的仿真器控制指令,即上述控制脚本来打开DPI的使能以及使Matlab工具与逻辑仿真器同时启动,以便完成验证平台的数据监测功能。通过使用SystemVerilogDPI连接UVM验证平台与Matlab模型能使得逻辑仿真器与算法仿真器同时运行,保证了算法到逻辑映射转换的正确性,提高了开发效率。上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种连接UVM验证平台的搭建方法的权利要求书的且任何所述技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。

    更多相关内容
  • UVM验证平台组成

    2022-02-10 16:39:22
    继承自uvm_object的常用组件uvm_sequence_itemuvm_sequenceuvm_reg_item, uvm_reg_map, ...2. UVM testbench 与 Systermverilog testbench 的差异(待完善)2.1. UVM testbench 的优势自闭性 与复用


    在学习完UVM机制之后,就可以开始UVM验证框架的学习了。

    使用Systermverilog语言搭建的验证平台中,可以看到验证平台包含不同class创建的对象,各对象之间有着明确的从属关系(例如base_test有env成员,env成员有agent成员、和checker成员)

    在UVM世界中,相应的也有这些成员以及固定的从属关系,而且有着固定的class定义方式。

    1. UVM testbench的组成

    uvm的testbench中也有相应的driver, monitor等等。

    但在介绍这些组件之前,需要先介绍两个UVM超级重要的类,uvm_component和uvm_object,所有的这些组件都是继承自这两个基本类的。

    1.1. uvm_component 与 uvm_object

    uvm_component与uvm_object是uvm组件中非常重要的两个基类,实际上uvm_component也是uvm_object的子类。

    一些永久存在的验证组件一般都继承于uvm_component,例如driver, monitor, sequencer ,agent , model, scoreboard, env, test等等。

    而一些可随时创建、随机丢失的周期性实例一般都继承于uvm_object,例如uvm_sequence、uvm_sequence_item等等

    下图为常见UVM类的继承关系

    在这里插入图片描述

    uvm_component 的特有机制

    相比于uvm_object,uvm_component有着自身独特的机制或方法,这个在前文的UVM机制已经讲的很详细了,此处做出总结。

    ● factory机制:uvm_component和uvm_object都可以使用工厂进行注册、创建和覆盖。但uvm_component特有的是通过parent组成组件层次关系,构成UVM树。

    ● confid_db机制:uvm_component特有的机制。因为使用uvm_config_db进行set或get时,都需要写明路径索引,而且是对component内的成员进行配置。

    object的成员则无法使用该机制进行配置

    ● 消息机制:uvm_component特有的机制,实际上这是在uvm_report_object中定义的消息打印方法和控制方法(uvm_report_object继承于uvm_object,uvm_component继承于uvm_report_object)。

    object与tb内也可以使用消息打印方法,这是来自于uvm_global.sv定义的全局方法,但若进行消息控制则需要使用uvm_root::get()。

    ● phase机制:uvm_component特有的机制,uvm_root::get()控制各component统一按照phase顺序执行,并最终结束。

    field automation机制 是uvm_object具备的机制,所以uvm_component也具备

    1.3. 测试用例中的树形结构

    使用uvm搭建的testbench有着很多级的封装关系或者是属性,例如agent封装了sequencer, driver和monitor,将这些封装关系通过树的形式表达,如下图所示

    在这里插入图片描述

    每个模块中上面的字符串表示实例化后的对象,括号为该对象所属的class。
    注意上图只是用于待测设计(Design Under Test, dut)的标准验证结构,实际工作中可自定义各种各样的UVM树,或者用于练习构造各种简单奇葩的UVM树,均可运行。

    UVM树的创建是通过一个一个component实例化之后实现的,所以在对象例化时要指明父节点

    每实例化一个component,就增加一个孩子节点。

    例如

    class my_agent extends uvm_agent;
    	`uvm_component_utils(my_agent)
    	my_driver drv;
    	my_monitor mon;
    	my_sequencer sqr
    	function new(string name, uvm_component parent);				//注意uvm中孩子节点例化均在build_phase中而不是new函数			
    		super.new(name,parent);
    	endfunction
    	virtual function void build_phase(uvm_phase phase);
    		super.build_phase(phase);
    		if (is_active == UVM_ACTIVE) begin
          		sqr = my_sequencer::type_id::create("my_sqr", this);		//例化sqr,parent就是my_agent类例化对象,name是"my_sqr"
          		drv = my_driver::type_id::create("my_drv", this);			//例化drv,parent就是my_agent类例化对象,name是"my_drv"
       		end
       	  		mon = my_monitor::type_id::create("my_mon", this);			//例化mon,parent就是my_agent类例化对象,name是"my_mon"
    	endfunction 
    endclass
    

    注意上文中的sqr = my_sequencer::type_id::create("my_sqr", this);的实例化过程中。前面的sqr是对象变量,后面的字符串"my_sqr"是该对象变量的名字name或叫ID,这与new函数输入变量中的string name是一个东西,也用于UVM树的路径索引
    注意尽量使组件的变量名和name保持一致,方便路径索引,即上面代码中对象sqr叫"my_sqr"就不太合适,应该就叫"sqr"
    UVM树中任意结点都可通过get_full_name()获取name

    uvm还给出了访问每个节点的父节点和孩子节点的方法

    //...\questasim64_2020.1\verilog_src\uvm-1.2\src\base\uvm_component.svh
    extern virtual function string get_full_name();			//获取索引路径
    virtual function string get_type_name();				//获取ID
    extern virtual function uvm_component get_parent();
    extern virtual function uvm_component get_child(string name);		//一个component有好多个children,name表示孩子component的名字name
    extern function void get_children(ref uvm_component children[$]);
    extern function int get_first_child(ref string name);				//与get_next_child()配合获取name
    extern function int get_next_child(ref string name);
    extern function int get_num_children();								//children的数量
    

    uvm_top

    uvm_root类的对象uvm_top是树的根,也是在uvm_pkg中就已经定义好的全局静态对象,可对tb内全部的机制进行控制。

    查看UVM树的方法是uvm_root::get().print_topology();

    1.4. 继承自uvm_object的常用组件

    除了driver, monitor, agent等等,其他组件均派生自uvm_object,一般都是一些短生命周期的组件,例如sequence, sequence item等等。

    uvm_sequence_item

    所有的transaction,都要派生自uvm_sequence_item,而不是uvm_transaction,类似于手枪中的子弹。

    uvm_sequence

    所有的sequence,都要派生自uvm_sequence,用于装载transaction,类似于手枪中的弹夹。

    uvm_reg_item, uvm_reg_map, …

    主要用于寄存器模型

    2. UVM testbench 与 Systermverilog testbench 的差异(待完善)

    2.1. UVM testbench 的优势

    先解释含义,再举例与Systemverilog进行对比说明。

    其实还是围绕UVM那几个机制来谈,这也是UVM引入那些机制的意义

    自闭性 与复用性

    指各component独立封装,编译运行时不需要其他component配合。方便日后集成与复用。

    TLM通信

    driver与sequencer通过TLM通信,但并不是缺了谁就不能运行。

    而SV中generator和stimulator之间的transaction通信,是通过mailbox作连接。如果mailbox不作实例化和连接,就会产生句柄悬空的问题

    factory机制

    重载功能方便了日后component的继承升级,从而无需修改创建函数。而SV在升级component时就需要改变例化内容

    有个例子更好

    field_automation机制

    UVM封装了各种域自动化方法,无需用户定义

    config_db机制

    test向底层作配置时使用config_db机制,由于config_db机制本质是通过一个双string关联数组作媒介,将string作为索引。所以set和get是隔绝的,即在作set时允许没有get,也允许没有相应的层次,同样tb可以运行。

    但SV这种使用句柄索引,一旦环境更新,句柄悬空,就会报错。

    消息机制

    允许在顶层对各component的过滤度阈值修改,和消息严重性重载

    顶层配置

    config_db机制phase机制

    两个机制相互配合,父组件必先于子组件创建,使得整体环境的结构和运行模式都可以从树状config对象中获取,使得顶层环境可以在不同的uvm_test中集中管理。

    如果先子组件再父组件,甚至顺序随机。则config_db的get可能先于set,无法实现配置
    同理,如果没有phase机制,可能先connect再build,引起句柄悬空问题

    配置作用域只为当前层次及以下,且高层级配置会覆盖低层级配置。

    SV也可实现顶层配置,但无法实现高层级的权威性

    端口连接

    TLM通信

    主要是driver和sequencer的连接,和monitor和scoreboard的连接。

    展开全文
  • 多种技术和方法的混合用于改进功能验证并提取覆盖等级的度量:基于通用验证方法(UVM)的形式验证和随机约束测试增加了发现错误的可能性。有时我们为RTL验证创建一个完美有效的测试,但发现它不能在门级仿真期间重复...

    当我们验证片上系统(SoC)嵌入了具有多个数字外设的微处理器以及可能的模拟模块时,我们希望检查所有实现的功能和可能的极端情况,以最大限度地缩短验证时间。多种技术和方法的混合用于改进功能验证并提取覆盖等级的度量:基于通用验证方法(UVM)的形式验证和随机约束测试增加了发现错误的可能性。有时我们为RTL验证创建一个完美有效的测试,但发现它不能在门级仿真期间重复使用,因为UVM监视器挂在内部SoC信号上,这些信号在实现阶段后可能会消失或改变。

    本文将描述创建有效的自检模型是多么容易,这些测试既简单又可以在门级模拟过程中重复使用。令人惊讶的是,通过改变数据流,我们可以为测试平台带来好处,降低记分板的复杂性,这也意味着更少的测试开发时间。

    流程基于实例化UVM验证用于检查接口的组件,例如SPI,I 2 C,& UART,但它也可以扩展到更复杂的接口。

    SoC验证流程

    最有效的SoC验证是基于内部总线内部,特定内部模块和主SoC接口上的多个UVM验证组件(UVM VC)的实例化。这些UVM VC用作总线协议检查器(例如,AMBA检查器);串行协议检查器和主动主控器(例如,I 2 C,SPI,UART,JTAG,SATA,PCIe)。

    基于UVM开发的测试应该是自检的;必须通过检查器验证每个操作,激励和事务,如果不匹配,会引发一个“标志”,停止模拟并发出模拟器控制台上显示的错误消息并写入日志文件。

    通信接口(例如,SPI)的验证需要使用由在总线上获取事务的收集器形成的UVM VC,用于检查协议合规性的监视器以及生成的生成的总线功能模型(BFM)交易。 SoC和外部UVM VC之间交换的数据通过名为记分板的模块进行验证。

    此记分板至少有两个端口,其中添加的对象与第二个相匹配 - 参考。如果不匹配,则发出错误。在门级仿真期间必须重复使用这种检查器以刺激关键路径。图1显示了验证测试平台的简单框图,该平台使用多个检查器进行有效的验证方法。

    图1:典型的UVM验证测试平台

    黄色块是UVM VC。总线监视器是一个只有监视器和检查器的无源组件。

    用于测试串行外设的通用数据流是将数据从UVM VC发送到微处理器并检查数据是否有到达目的地(微处理器)。在第二步中,我们将数据从微处理器发送到UVM VC,检查正确的数据是否已到达目的地(UVM VC)。

    图2显示了数据记分板用于全双工同步通信(例如,SPI)。 UVM VC和外围总线上的监视器(被动)用于将数据发送到记分板:UVM VC发送的数据被添加到记分板 TX路径,当它们到达外围设备时,将通过总线监视器发送到相同的记分板进行匹配。来自外围设备的数据被添加到记分板 RX路径中,并与UVM VC被动监视器接收的数据相匹配。

    图2:全双工同步外设示例

    此方法的主要缺点是门级仿真的可移植性。在实施阶段,RTL中可用的内部信号可能会在优化的网表中消失,UVM VC模块的绑定变得困难,有时甚至不可能(例如,在合成期间删除未使用的端口)。

    新的SoC验证流程

    新流程的基本概念是记分板中检查的数据不应来自内部SoC节点上绑定的监视器(参见图2)。因此,修改了测试平台配置,以便仅使用UVM VC(主动和被动)进行顶层绑定的数据检查。内部监视器(绑定在SoC内部节点上的监视器)仅用于RTL仿真,检查总线的合规性并跟踪覆盖范围。

    此时,有必要更改数据在UVM VC和SoC外设之间交换数据包的流程。主要要求是:

    数据随机化

    门级模拟的可移植性

    易用性

    由UVM VC生成并由外围设备接收的随机约束数据分组被SoC用于生成出站分组。为了增加随机化,SoC中的微处理器计算接收数据的CRC并将结果用作要传输的数据。

    记分板将从UVM获取数据VC,在将它们添加到数据列表之前,它将计算CRC。从外围设备返回的数据将直接添加到记分板以进行匹配过程。图3显示了这个新流程的一个示例。

    图3:数据检查的新方法

    计算CRC非常简单;对于记分板,可以使用内置函数(伪方法),例如,可以使用 e 语言:

    list_bytes 。crc_32(来自字节,字节数)

    list_bytes 。crc_8(来自字节,字节数)

    它逐字节读取列表返回位或字节列表的CRC函数的整数值。可以计算CRC,定义起始字节(通过第一个参数 from byte )和选定的字节数(通过第二个参数字节数)。

    32位CRC的生成多项式为:

    x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x +1

    8位CRC的生成多项式为:

    x 8 + x 2 + x + 1

    类似的函数用于SoC中微处理器执行的 C 代码:

    POLY_GEN8为0x03。可以使用POLY_GEN32 = 0x2608EDB为CRC32扩展该功能。

    使用此方法可以极大地简化记分板上的数据管理;由于数据检查是在串行接口上进行的,因此它与微处理器总线的数据大小无关,可以是8,16,32位或更多。以下是记分板的示例。

    全双工同步接口

    如果是全双工同步接口,例如SPI,我们可以有两种可能的模式:外设是从机,或外设是主机。

    当外设是从机时,事务由外部UVM VC启动。全双工模式意味着必须同时发送和接收数据。由于我们希望避免在SoC侧生成数据(在 C 代码上没有有线数据),因此有效数据存在系统延迟。此延迟应在记分板上实现,以便正确比较交换的数据。

    图4:全双工数据序列用于从模式

    图4显示了在主(UVM VC)和从(外设)之间交换的数据序列的示例。由外围设备发送的第一个符号对于记分板“不关心”,因此被释放。微处理器需要一些时间从缓冲区获取数据并计算CRC。一段时间后,数据准备就绪,交换继续从UVM VC随机生成和来自外围侧的伪随机数据(在D x 上计算的CRC)。

    我们可以通过使用传统的“不关心”数据(例如,零)来进行自动符号同步。当然,这些数据不应由UVM VC生成。 SoC上的外设将发送零直到CRC数据准备就绪,并且UVM VC以足够的零符号终止以完成记分板中的匹配。

    当外围设备是主设备时,事务通过微处理器自行启动。

    图5:主模式的全双工数据序列

    数据流与奴隶模式的情况非常相似。图5显示了在主(外设)和从(UVM VC)之间交换的数据序列的示例。外围设备发送的第一个符号对于记分板“不关心”。 UVM VC用随机符号D x 回复,微处理器用它来计算外围设备发送的伪随机数据。如上所述,黄色突出显示的符号是在记分板中比较的符号。

    半双工接口

    如果是半双工接口,例如I 2 C,我们可以有两种可能的模式:外设是从机,或外设是主机。

    外设是slave,事务由外部UVM VC启动。半双工模式基于通信协议,其中主设备发送命令请求数据作为回复或将数据发送到专用从设备。

    对于全双工模式,有必要定义良好的流程这样可以避免 C 代码中的数据(非随机)并使数据检查变得简单:

    通过发送write命令启动事务。 UVM VC将开始发送数据包。在计算CRC之后,这些数据被添加到记分板中。

    接收的数据被DUT用作“回复读取”命令。微处理器计算接收数据的CRC并准备数据包以进行回复。

    UVM VC发送读命令。外围设备开始发送先前准备的数据。这些数据将添加到记分板中以进行匹配。

    图6显示了此数据握手的简单图表。

    图6:从模式的半双工数据交换

    主模式

    当外围设备是主设备时,事务通过微处理器自行启动。

    在这种情况下,为了利用UVM VC的随机约束特性,协议必须

    通过发送读命令启动事务。 UVM VC将开始作为回复发送数据包。在计算CRC之后,这些数据被添加到记分板中。

    接收的数据被DUT用作“写入数据”命令。微处理器计算接收数据的CRC并为下一步准备数据包。

    外设发送写命令,然后开始发送先前准备的数据。这些数据将添加到记分板中以进行匹配。

    图7显示了此数据握手的简单图表。

    图7:主模式的半双工数据交换

    复杂协议

    相同的方法可以也可用于USB或以太网等复杂协议。概念是相同的:对于全双工通信,初始符号是“不关心”(空符号),然后DUT使用接收的样本来计算CRC并将数据发回。

    对于半双工,数据交换由UVM VC启动,然后DUT使用接收的数据包构建传输数据包。

    展开全文
  • 当然伴随形式验证的发展,assertion也被用于形式验证的条件输入和期望输出。这里主要还是讲在动态仿真中的assertion的应用。在动态仿真中插入assertion能方便快速的对错误源头进行定位,减少debug时间。assert...

    assertion的概念来源于软件设计中的错误监测,在verilog的TB中,也会通过各种task监测信号来报告状态。SV专门的assertion方便了这种监测的应用。当然伴随形式验证的发展,assertion也被用于形式验证的条件输入和期望输出。这里主要还是讲在动态仿真中的assertion的应用。在动态仿真中插入assertion能方便快速的对错误源头进行定位,减少debug时间。

    assertion主要分2种,所谓的Immediate assertion和Concurrentassertion。这2种可以认为是 always @* 与always @(posedgeclk)的区别,即前者是始终在检查,而后者是在时钟沿进行采样检查的。

    Immediate assertion

    这种断言立即生效,可以用来检测组合信号,也可以在时钟模块中监测时序信号

    time t;

    always@(posedge clk)

    if(state == REQ)

    assert(req1 || req2) //监测信号是1,否则打印错误信息

    else begin

    t = $time;

    #5 $error('assert failed at time %0t',t);

    end

    Concurrentassertion

    这种断言在时钟沿生效,可以用来监测采样信号,并行断言自底向上分为4个逻辑层次分别是,逻辑层,序列层,属性层,断言层。以下通过一个例子说明

    sequence req_gnt_seq;

    //  (~req& ~gnt) 表达式是逻辑层

    (~req &gnt)  ##1  (~req &~gnt);  //这个是序列层,表达式1之后1个周期出现表达式2

    endsequence

    //=================================================

    // Property Specification Layer

    //=================================================

    property req_gnt_prop; //属性层

    @ (posedgeclk)  //采样上升沿,且reset时无效

    disable iff (reset)

    req |-> req_gnt_seq; //req变高后出现序列req_gnt_seq

    endproperty

    //=================================================

    // Assertion Directive Layer

    //=================================================

    req_gnt_assert : assert property (req_gnt_prop)//断言层,若违反则报错

    else

    $display('@ ns Assertion Failed', $time);

    定义了assertion后,可以在TB的顶层将assertion与DUT绑定,让它去检查指定的dut,则在仿真中会动态报警。这样实现了设计与验证模块的分离,方便进行工程的管理,以下是bind的使用实例

    module assertion_ip(input wire clk_ip,req_ip,reset_ip,gnt_ip);

    sequence req_gnt_seq;

    (~req_ip & gnt_ip) ##1 (~req_ip &~gnt_ip);

    endsequence

    property req_gnt_prop;

    @ (posedge clk_ip)

    disable iff(reset_ip)

    req_ip |=> req_gnt_seq;

    endproperty

    req_gnt_assert : assert property (req_gnt_prop)

    else

    $display('@ ns Assertion Failed', $time);

    endmodule

    module bind_assertion(

    input wire clk,req,reset,

    output reg gnt);

    always @ (posedge clk)

    gnt <= req;

    endmodule

    module binding_module();

    //=================================================

    // Bind by Module name : This will bind all instance

    // of DUT

    //=================================================

    // Here RTL : stands for design under test

    //     VIP : Assertion file

    //   RTL ModuleName  VIP moduleName   Instance Name

    bind bind_assertion  assertion_ip     U_assert_ip (

    // .vip port (RTL port)

    .clk_ip  (clk),

    .req_ip  (req),

    .reset_ip (reset),

    .gnt_ip  (gnt)

    );

    endmodule

    assertion更具体的语法参见LRM,由于跟uvm测试平台并不直接相关,这里不做更具体的解释。

    展开全文
  • (11)UVM 如何构建好的UVM验证环境?

    多人点赞 2021-11-13 13:54:52
    UVM带来的环境复用,相比于之前SV验证环境做到了下面的几个优势: 各个模块的验证环境是独立封装的,对外不需要保留数据端口,因此便于环境的进一步集成复用。 由于UVM自身的phase机制,在顶层协调各个子环境时,...
  • 龙源期刊网http://www.qikan.com.cn基于UVM方法的FPGA验证技术作者:习建博朱鹏崔留争来源:《电子科学技术》2016年第03期摘要:针对现场可编程逻辑门阵列(FPGA)在雷达信号处理领域日趋显现的重要性,通过对传统FPGA...
  • 入门UVM验证方法学

    千次阅读 2020-06-01 14:48:53
    1.验证的本质:尽最大可能找出设计的bug 2.如何实现验证 测试向量文件: 以模拟的方式验证设计的正确性,以源的方式来激励设计的逻辑模块。 验证三要素: 灌入激励,产生输入信号; 收集响应,收集输出信号; 做...
  • 本发明涉及数字芯片的功能验证验证方法学领域,尤其是一种基于UVM验证方法学的SPI验证方法,通过验证平台的搭建,随机化激励的生成,功能覆盖率的收集,响应结果的自检等操作完成对SPI的功能验证。背景技术:近年...
  • 本发明涉及芯片设计的功能验证领域,尤其是一种基于UVM的总线验证方法。背景技术:随着集成电路工艺的不断进步,集成电路的规模和复杂度也在不断地提高,验证的难度也越来越大。在集成电路设计中,验证工作已经占到...
  • UVM(一)——UVM验证平台

    千次阅读 2020-07-16 13:35:09
    UVM(一)——UVM验证平台UVM验证平台组成driver组件factory机制objection机制virtual interfaceconfig_db机制transaction UVM验证平台组成 之前一直在忙比赛的事情,时隔一个月终于又能开始继续学习验证了! 这次刚...
  • SV、UVM验证思想

    千次阅读 2021-08-31 23:53:33
    文章目录1 SV基础1.2 sequence和property的比较1.3 SV数据类型1.4 fork线程1.5 任务和函数1.6 接口interface2 UVM基础2.1 UVM的优势和劣势、方法学的演变2.0 UVM树形结构2.1 UVM组件Components2.1 Components和...
  • 写过 verilog 硬件代码的同学应该都知道 DUT 会包含很多寄存器,它们是模块间交互的接口,其...在验证过程中,寄存器的验证是最新开始的,只有保证寄存器的配置正确,才能使得硬件之间的“交互”正确。在验证寄存...
  • 文章目录1 加入 transaction2 加入 env3 加入 monitor4 封装成agent5 ...记录一下《UVM实战(卷I)》学习笔记。 这节的 dut 与第一节是一样的,直接对输入打拍输出: module dut(clk, rst_n, rxd, rx_dv, txd, t
  • 一个基本的 uvm 验证环境结构如下图所示,包含两个 agent,其中 in_agent 用于驱动 DUT ,同时将驱动数据同时传递给 reference model, out_agent 用于按照协议采集 DUT 的输出数据,并将数据传递给 scoreboard,在 ...
  • 自闭性是指单元组件(如uvm_agent 或者uvm_env)自身可以成为独立行为、不依赖于其他并行的组件。 单元自闭性为日后的组件复用提供了良好的基础。 各个子环境可以独立集成于顶层环境,互相也不需要额外的通信连接,...
  • 自闭性是指单元组件(如uvm_agent或uvm_env)自身可以成为独立行为不依赖于其他并行的组件。 举例来说,driver同sequencer之间,虽然driver需要获取sequencer的transaction item,但是它本身可以独立例化,而他们...
  • UVM的组建类(uvm_component)是验证环境的骨架,用于验证环境的结构的创建。主要包括uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env、uvm_test等。 在对组件类进行工厂机制的注册...
  • 为什么不把 transaction 实例化、随机和驱动全部放入 driver 中完成,我们验证的主要工作量,除了搭建验证环境之外,还有一大工作-拼凑场景case,其中不同场景中 transaction 的发送给数量和组织形式各有差异,...
  • 一个简单的UVM验证平台1:面向对象的编程语言的特性:封装(变量和methods在一个类里),继承(派生,子类拥有父类所有特性)和多态(调用同一个函数但最终状态不一样(必须是virtual methods))。2:UVM是一个库,在这个库...
  • 原标题:验证平台自动化篇之二:UVM Framework一个UVM使用者,从新手到精通大致会经历三年的时间,而在经过这三年之后,verifier会有倦怠期。除了不可避免地在80%以上工作处于重复性劳动或者称之为没有创新的劳动...
  • UVM 验证方法学之interface学习系列文章 UVM 验证方法学之interface学习系列文章(一)初级 UVM 验证方法学之interface学习系列文章(二)中级 UVM 验证方法学之interface学习系列文章(三)进阶1 UVM 验证...
  • UVM学习之路(6)— 基于MCDF的验证平台 一、前言 MCDF即多通道数据整形器(Multi-Channel Data Formatter)可以将多个通道是数据经过打包后以数据包的形式发送出去,其输入输出如下所示,其中输出的数据包的数据长度...
  • 部分示例:结合了RTL模拟和仿真的仿真加速。...对于断言,X传播等,形式验证和模拟验证结合的很好,当断言可以被综合,并且映射到仿真上时,形式验证技术甚至与基于硬件的执行相关。VigyanSinghal指...
  • UVM中的phase按照其是否消耗仿真时间($time打印出的时间)的特性,可以分成一类是function phase(如build_phase、connect_phase等),这些phase都不耗费仿真时间,通过函数来实现; 另一类是task phase(如run_...
  • 2.1 验证平台的组成 2.1.1. 何谓验证平台 何谓验证平台?验证最基本的目的在于测试 DUT 的正确性,其最常使用的方法就是给 DUT 施加不同的输入(激励),所以一个验证平台最重要的的功能在于产生各种各样不同的激励...
  • UVMuvm 中的层次关系uvm_topuvm_test_topmodule top uvm 中的层次关系 uvm_top uvm_test_top module top

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 580
精华内容 232
关键字:

uvm 形式验证