自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 UVM入门实验3

一、TLM单向通信和多向通信在之前的monitor到checker的通信,以及checker与reference model之间的通信,都是通过mailbox以及在上层进行其句柄的传递实现的。这次实验则使用TLM端口进行通信,做逐步的通信元素和方法的替换。TLM通信结构框图将monitor中的用来与checker中的mailbox通信的mon_mb句柄替换为对应的uvm_blocking_put_port类型。uvm_blocking_put_port #(mon_data_t) mon_bp_p

2021-02-28 21:04:54 2601

原创 同步通信元件

一、概述SV用来做线程同步的几种元件,它们分别是semaphore、event、mailbox。在UVM中,需要同步线程不再只局限于同一个对象中,还需要解决不同组件之间的线程同步问题。一旦线程同步要求发生在不同组件,这就要求组件之间可以通过某种方法来实现同步。考虑到UVM组件封闭性原则,最好不要通过层次索引的形式在组件中索引公共的event或者semaphore,UVM为了解决封闭性的问题,定义了如下的类来满足组件之间的同步要求:uvm_eventuvm_event_pooluvm_even

2021-02-28 17:07:28 717

原创 TLM2通信

一、概述TLM是一种为了构建更高级抽象模型的传输方式。虽然SV语言本身没有原生的TLM传输方式,但是TLM在UVM很好地集成进来,并且在组件传输中得到了充分运用。伴随着SystemC模型的广泛引用,SystemC通信机制TLM2.0业发展起来,成为SystemC模型之间的核心传输方式。TLM协议本身并不依赖于某一种语言,而是可以跨语言来实现其传输标准。与TLM1.0相比,TLM2.0提供了更丰富更强大的传输特性,主要包括:双向的阻塞或者非阻塞接口、时间标记、统一的数据包。通过这些特性,TLM2.0

2021-02-28 13:05:56 1340

原创 通信管道

一、概述TLM通信的实现方式有一个共同的地方即都是端对端的,同时target一段需要实现传输方法,例如put()或者get()。对于monitor、coverage collector等组件在传输数据时,会存在一端到多端的传输。二、TLM_FIFO在一般TLM传输过程中,无论是initiator给target发起一个transaction,还是initiator从target获取一个transaction,transaction最终都会流向consumer中。consumer在没有分析transa

2021-02-27 21:43:08 1072

原创 多向通信

一、概述多向通信这种方式服务的仍然是两个组件之间的通信,而不是多个组件之间的通信,毕竟多个组件的通信r仍然可以由基础的两个组件的通信方式来构建。多向通信指的是,如果initiator与target之间的相同TLM端口数目超过一个时的处理解决办法。comp1有两个uvm_blocking_put_port,而comp2有两个uvm_blocking_put_imp端口。对于端口例化可以给不同名字,连接也可以通过不同名字来索引,但问题在于comp2中需要实现两个task put(itrans t),

2021-02-27 19:30:22 381

原创 双向通信

一、概述与单向通信相同的是,双向通信的两端也分为initiator和target,但是数据流向在端对端之间是双向的。双向通信中的两端同时扮演着producer和consumer的角色,而initiator作为request发起方,在发起request之后,还会等待response返回。UVM双向端口分为以下类型:uvm_blocking_transport_PORTuvm_nonblocking_transport_PORTuvm_transport_PORTuvm_blocking_mast

2021-02-27 18:53:58 2080

原创 单向通信

一、概述单向通信指的是从initiator到target之间的数据流向是单一方向的,或者说initiator和target只能扮演producer和consumer中的一个角色。在UVM中,单一数据流向的TLM端口有很多类型:uvm_blocking_put_PORTuvm_nonblocking_put_PORTuvm_put_PORTuvm_blocking_get_PORTuvm_nonblocking_get_PORTuvm_get_PORTuvm_blocking_peek_P

2021-02-27 18:21:53 1657

原创 TLM通信

一、概述在芯片开发流程中,系统原型和芯片验证对项目的助推起到了关键作用。系统原型一般是通过硬件功能描述文档来模拟硬件行为,而行为要求不同于RTL模型。系统原型可以提供一个准确到硬件比特级别、按照地址段访问、不依赖于时钟周期的模型,该模型通常基于SystemC语言,而系统原型中各个模块通过TLM可以实现宽松时间范围内的数据包传输。芯片验证是在RTL模型初步建立之后,通过验证语言和方法学来构建验证平台。该平台的特点是验证环境整体基于面向对象开发,组件之间的通信基于TLM,而在driver与硬件接口之间需

2021-02-27 16:12:37 2025 1

原创 UVM入门实验2

一、验证组件和层次构建首先将各个package中的SV组件替换为UVM组件实现组件对应原则SV的transaction类对应uvm_sequence_itemSV的driver类对应uvm_driverSV的generator类对应uvm_sequence + uvm_sequencerSV的monitor对应uvm_monitorSV的agent对应uvm_agentSV的env对应uvm_envSV的checker对应uvm_scoreboardSV的reference mod

2021-02-27 13:31:59 2748

转载 电子通信协议之SPI通信协议篇

               当你将微控制器连接到传感器,显示器或其他模块时,你是否考虑过这两种设备如何相互通信?他们到底在说什么?他们如何理解对方? 电子设备之间的通信就像人类之间的通信。双方都需要说同样的语言。在电子产品中,这些语言称为通信协议。对我们来说幸运的是,在构建大多数DIY电子产品项目时,我们只需要知道几个通信协议即可。在本系列文章中,我们将讨论三种最...

2021-02-27 00:19:44 883

转载 电子通信协议之I2C通信协议篇

       到目前为止,我们已经讨论了SPI通信和UART通信的基础知识,因此现在让我们进入本系列的最后一个协议,即集成电路总线或I2C。 如果你在项目里使用OLED显示器,气压传感器或陀螺仪/加速度计模块,那你很可能会发现自己正在使用I2C通信协议。    I2C通信简介 I2C结合了SPI和UART中最好的功能。使用I2C,您可以将多个从设备连接到单个主设备(像S...

2021-02-27 00:14:31 852

转载 电子通信协议之UART通信协议篇

                       还记得以前打印机、鼠标和调制解调器都会带有那些笨拙的连接器的粗电缆的时代吗?从字面上来解读,就是必须拧入您的计算机的那些?这些设备可能正在使用UART协议与您的计算机进行通信。尽管USB几乎完全取代了那些旧的电缆和连接器,但是UART绝不会...

2021-02-26 23:59:15 754

原创 构建验证环境的内经

一、环境构建的四要素在发送测试序列之前,首先需要创建一个结构化的环境,将环境建立的核心要素拆解开来,可以分为四个部分:单元组件的自闭性回归创建通信端口连接顶层配置二、单元组件的自闭性自闭性指的是单元组件(例如uvm_agent或者uvm_env)自身可以成为独立行为、不依赖于其它并行的组件。举例来说,driver同sequencer之间,虽然driver需要获取sequencer的transaction item,但是它本身可以独立例化,而它们之间的通信也是基于TLM端对端的连接实现的。这

2021-02-26 17:20:26 711

原创 MCDF顶层验证方案

一、概述MCDF的主要功能是将输入端的三个通道数据,通过数据整形和过滤,最终输出。可以将MCDF的设计结构分别四个模块:上行数据的通道从端(channel slave)仲裁器(arbiter)整形器(formatter)控制寄存器(control registers)二、reg_env对于寄存器模块的验证环境reg_env,它的组织包括:reg_master_agent,提供寄存器接口驱动信号。reg_slave_agent,提供寄存器接口反馈信号。scoreboard,分别从r

2021-02-26 16:13:24 11521

原创 UVM结构回顾

一、uvm_topuvm_top是uvm_root类的唯一实例,它由UVM创建和管理,它所在的域是uvm_pkg。uvm_top是所有test组件的顶层,所有验证环境中的组件在创建时都需要指明它的父一级,如果某些组件在创建时指定父级的参数为null,那么它将直接隶属于uvm_top。uvm_top提供一系列的方法来控制仿真,例如phase机制、objection防止仿真退出机制等。...

2021-02-26 13:25:54 1165

原创 UVM组件家族

一、概述SV验证环境中的验证组件按照功能需要,被称之为激励器、监测器和检查器,这三个核心组件与验证环境的三个关键特性对应,即激励、监测和检查,并且有与其对应的组件(component)。UVM组件家族是从UVM基类继承的一个核心分支即uvm_component类。从uvm_component类继承的类都可以构成验证环境,这是因为它们都从uvm_component类继承了phase机制,也都会经历各个phase阶段。在UVM模块中,主要的构成验证环境的常见组件类包括:uvm_driver、uvm_monit

2021-02-25 19:54:14 1176

原创 UVM入门实验1

一、工厂的注册、创建和覆盖机制UVM中只有两种用例注册的宏`uvm_component_utils(T)`uvm_object_utils(T)编译仿真factory_mechanism.sv文件object_create类 class object_create extends top; trans t1, t2, t3, t4; `uvm_component_utils(object_create) function new(string name = "obje

2021-02-23 17:42:26 3828 9

原创 UVM入门实验0

一、编译UVM代码编译文件uvm_compile.sv,等待正常编译结束,在work库中仿真模块uvm_compile,在命令窗口执行run -all。uvm_compile.sv代码module uvm_compile; import uvm_pkg::*; `include "uvm_macros.svh" initial begin `uvm_info("UVM", "Hello, welcome to RKV UVM training!", UVM_LOW) #1

2021-02-22 00:40:10 2018

原创 UVM的消息管理

一、概述一个好的验证系统应该具有消息管理特性,它们是:通过一种标准化的方式打印信息、过滤重要级别信息、打印通道。UVM中提供了一系列的类和方法来生成和过滤消息,包括消息方法、消息处理、消息机制。二、消息方法在UVM环境中或者环境外,只有引入uvm_pkg,都可以通过下面的方法来按照消息的严重级别和冗余度打印消息。function void uvm_report_info(string id, string message, int verbosity=UVM_MEDIUM, string filen

2021-02-21 22:28:28 782

原创 UVM的config机制

一、概述在验证环境的创建过程build_phase中,除了组件的实例化,配置也是必不可少的。为了验证环境的复用性,通过外部的参数配置,使得环境在创建时可以根据不同参数来选择创建的组件类型、组件实例数目、组件之间的连接以及组件的运行模式等。在更细致的环境调节中有更多的变量需要配置,例如for-loop的阈值、字符串名称、随机变量的生成比重等。比起重新编译来调节变量,如果在仿真中可以通过变量设置来修改环境,那么就更灵活了,而UVM的config机制正提供了这样的便利。UVM提供了uvm_config_db配

2021-02-21 01:29:03 1741

原创 UVM的phase机制

一、概述SV的验证环境构建中,传统的硬件设计模型在仿真开始前,已经完成例化和连接了,而SV的软件部分对象例化则需要在仿真开始后执行。虽然对象例化通过调用构建函数new()来实现,但是单单通过new()函数无法解决在验证环境实现层次化时,无法保证例化的先后关系,以及各个组件在例化后的连接。如果需要实现高级功能,例如在顶层到到底层的配置时,SV也无法在底层组件例化之前完成对底层的配置逻辑。因此,UVM在验证环境构建时,引入了phase机制,通过该机制可以将UVM仿真阶段层次化,不单单是各个phase的先后执行

2021-02-20 23:06:52 3604

原创 UVM核心基类

一、uvm_object类UVM中的类最初都是从一个uvm_void根类(root class)继承而来的,而实际上这个类并没有成员变量和方法。uvm_void只是一个虚类(virtual class),还在等待将来继承于它的子类去开垦。在继承于uvm_void的子类中,有两个类,一个为uvm_object类,另一个为uvm_port_base类。在UVM的类库地图中,除了事务接口(transaction interface)类继承于uvm_port_base,其他所有的类都是从uvm_object

2021-02-20 14:30:07 1177

原创 MCDF实验——Lab5

Lab5主要完成如何定义覆盖率,如何从验证计划到测试用例的实现,最后再到覆盖率的量化。验证量化分为代码覆盖率和功能覆盖率。一、编译在编译过程中,需要对于设计相关的文件设置额外的覆盖率编译选项。只选中与设计相关的文件点击右键,选择compile->compile properties,在弹出设置栏的coverage一栏中,如图选择以下选项,然后点击OK。完成所有文件的编译“Compile All”。这一步将在编译DUT文件时生成代码覆盖率的模型。二、仿真在仿真窗口(transcrip

2021-02-20 00:56:49 8439 11

原创 UVM覆盖方法

一、工厂机制——覆盖(override)覆盖机制可以将原来所属的类型替换为另一个新的类型。在覆盖之后,原本原来创建原属类型的请求,将由工厂来创建新的替换类型。无需再修改原始代码,继而保证了原有代码的封装性。新的替换类型必须与被替换类型相兼容,否则稍后的句柄赋值将失败,所以使用继承。做顶层修改时非常方便,允许灵活的配置,例如可使用子类来覆盖原本的父类,可使用不同的对象来修改其代码行为。要实现覆盖的特性,原有类型和新类型都需要注册。当使用create()来创建对象时,工厂会检查是否原有类型被覆盖,如

2021-02-18 13:38:36 1729 3

原创 MCDF实验——Lab4

在之前的Lab3中,通过一个初具规模的MCDT的验证环境,学习到:验证环境按照隔离的观念,应分为硬件DUT,软件验证环境,和处于信号媒介的接口interface。对于软件验证环境,需要经历建立阶段(build),连接阶段(connect),产生激励阶段(generate)和发送激励阶段(transfer),只有当所有的激励发送完毕并且比较完全之后,才可以结束该测试。从Lab4开始,要验证更大的子系统,即MCDF。与MCDT相比,MCDF主要添加了寄存器控制和状态显示功能,同时也添加了一个重要的数据

2021-02-18 11:32:16 18173 12

原创 UVM工厂机制

一、工厂机制的意义工厂机制也是软件的一种典型设计模式,UVM工厂的存在就是为了更方便地替换验证环境中的实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性。这里的实例或者类型替代,在UVM中称作覆盖(override),而被用来替换的对象或者类型,应满足注册和多态的要求。UVM的验证环境构成可以分为两个部分。一部分构成了环境的层次,这部分代码是通过uvm_component类完成,另一部分构成了环境的属性(例如配置)和数据传输,这一部分通过uvm_object类完成。uvm_componen

2021-02-17 16:45:59 3316

原创 UVM类库地图

一、概述在SV模块中,验证环境整体的构建,是从底层模块的验证组件搭建到通信和激励生成。这些元素无论是软件对象的创建、访问、修改、配置,还是组件之间的通信等都是通过用户自定义的方式来实现的。UVM验证方法学,就是将验证过程中可以重用和标准化的部分都规定在其方法学的类库当中。对于验证环境的需求:组件的创建和访问、环境的结构创建、组件之间的连接和运行、不同阶段的顺序安排、激励的生成传递和控制、测试的报告机制。二、UVM类库地图...

2021-02-16 23:56:30 1116

原创 SystemVerilog线程

一、程序和模块module除了作为RTL模型的外壳包装和实现硬件行为,在更高层的集成层面,模块之间也需要通信和同步。对于硬件的过程块,它们之间的通信可理解为不同逻辑/时序块之间的通信或者同步,是通过信号的变化来完成的。从硬件实现的角度来看,Verilog通过always,initial过程语句块和信号数据连接实现进程间通信。可以将不同的module作为独立的程序块,他们之间的同步通过信号的变化event触发、等待特定事件(时钟周期)或者时间(固定延时)来完成。模块(线程)在仿真一开始便并行执行,

2021-02-14 22:18:58 1237

原创 MCDF实验——Lab3

Lab3将在Lab2的基础上使用随机约束和环境结构来改进完善实验代码。Lab3中将对generator和initiator之间的数据生成和数据传输的处理进行改进,还将完善何时结束测试,将其主动权交于generator而不再是test组件。在组件结构方面,在原有的initiator、generator、agent、test组件的基础上,再加上monitor和checker,并且使其构成一个有机的整体,最终可以通过在线比较数据的方式完成对MCDT的测试。一、随机约束实验要求:继承Lab2的大部分代码,基

2021-02-11 01:33:32 9881 8

原创 UVM简介

一、概述UVM就一种验证方法学而言,它的思想却并不是必须要与某一种语言绑定的。因此,UVM的验证方法学通过吸取eRM、AVM、OVM、UVM等之前不同方法学的优点,集众家之所长。所有的验证方法学服务目的都在于提供一些可以重用的类来减轻在项目之间水平复用和垂直复用的工作量,而同时对于验证新人又能提供一套可靠的框架,摆脱搭建房子构思图纸的苦恼。UVM面向所有数字设计,涵盖了从模块级到芯片级,ASIC到FPGA,以及控制逻辑、数据通路到处理器验证的全部场景。UVM中的Universal(通用)的含义代表

2021-02-10 13:11:12 2870

原创 验证的方法

一、概述在开展验证时有一整套的工具箱,根据设计的特点选用不同的验证方法,最终取得满意的效果。实际的验证工作中,需要通过多种语言、方法、工具实现验证,比如仿真验证会协同形式验证一同来完善功能覆盖率,也有可能通过语言和脚本之间的整合来最终完成一项验证流程。目前的阶段,已经无法依赖单一的工具、语言或者方法来达到验证的完备性。二、主要方法分类动态仿真该方式是通过测试序列和激励生成器给入待测设计适当的激励,伴随着仿真时间,进而判断输出是否符合预期。需要仿真器配合,比较结果和仿真波形,最终判定测试用

2021-02-10 12:37:56 6297

原创 SystemVerilog随机控制和随机函数

一、随机序列产生事务序列的另一个方法是使用SV的randsequence结构,这对于随机安排组织原子测试序列很有帮助。initial begin for(int i = 0; i < 15; i++) begin randsequence(stream) stream: cfg_read := 1 | //权重分布 io_read := 2 | mem_read := 5; cfg_read : {cfg_read_task;} |

2021-02-09 22:49:01 1642

原创 SystemVerilog数组约束

一、打开或关闭约束一个类可以包含多个约束块,可以把不同的约束块用于不同测试。各个约束块之间的约束内容是互相协调不违背的。使用内建的constraint_mode()函数可以根据不同的需要打开或者关闭约束。二、内嵌约束多个约束块之间会相互作用,用来使能和禁止这些约束的代码也会增加测试的复杂性。约束需要考虑类的开放封闭原则。SV允许使用randomize() with来增加额外的约束,这和在类里增加约束是等效的,但同时要注意内部约束和外部约束之间应该是协调的,如果出现互相违背的情况,那么 随

2021-02-09 22:11:31 1300

原创 SystemVerilog随机约束和分布

一、为什么需要随机芯片体积增大,复杂度越来越高,定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高。随机测试可以找到意想不到的缺陷。随机测试的环境要求比定向测试复杂,需要激励、参考模型、在线比较。随机测试相对于定向测试可以减少相当多的代码量,产生的激励较定向测试也更多样。二、为什么需要约束如果没有约束,产生有效激励的同时也产生了很多无效和非法的激励。随机自由是一种合法的随机,需要限定激励的合法范围。随机的对象不只是一个数据,而是有联系的变量集。通常这些变量会被封装在一个数据类中,

2021-02-08 23:09:28 1739

原创 MCDF实验——Lab2

Lab2主要是使用之前学习的接口、仿真开始和结束、类以及包的使用,来优化Lab1的验证结构。将逐渐从使用硬件盒子过渡到使用接口和软件盒子(class)来验证设计

2021-02-07 23:45:54 9478 2

原创 验证的问题追踪

一、追踪的问题类型系统功能定义的问题硬件设计问题芯片验证环境问题综合时序问题硅前工具问题引用库和IP问题二、追踪工具记录分类派发查找追溯报告三、追踪流程

2021-02-07 13:54:18 220

原创 验证的收敛

一、概述随机验证的方式使得回归测试更加有意义。一般来说,基于两种目的来提交回归测试表:由于随机验证环境每次仿真产生的激励序列不同,这就使得每次仿真均会对覆盖率做出贡献,往复递交同样的测试变得有意义。当设计缺陷被发现后,回归测试序列需要再次提交,用来确保之前的功能点测试无误,同时设计缺陷也被修复。回归测试指的是每次讲所有测试用例提交到服务器上运行,并且检查测试结果。对于模块级的回归测试,这种方法在时间和计算资源上也许是可行的,然而对于芯片级,这种方法每次要消耗的时间和资源会很大。在实际项目中进行回

2021-02-07 13:45:43 428

原创 验证的周期

验证的里程碑RTL0:芯片框架和模块功能定义完成,制定验证的策略。RTL1:模块和子系统的功能信号定义完成,定制需要的存储模型。RTL2:完成所有模块的设计,以及80%以上的模块和子系统的验证。核心功能全部完成验证。RTL3:完成芯片系统的连线集成和验证,覆盖所有的功能验证点。GLS:完成门级网表的验证。TO:回顾验证的各项检查清单,最终流片。RTL0RTL1RTL2RT3GLSTO...

2021-02-07 12:44:53 294

原创 MCDF实验——Lab1

验证结构框架结构图时钟信号分别送给chnl0_init、chnl1_init、chnl2_init和MCDT,chnl0_init、chnl1_init、chnl2_init这4个是硬件模块module可以例化,然后跟MCDT之间通过各个线网直接连接。4个模块的数据来自于4个动态数组。相比于Lab0来讲,Lab1把chnl_write()、chnl_idle()等一些方法封装到了一个硬件模块initiaor里面,不用通过传id来确定哪个通道进行数据传输,而是通过例化相对应的initiaor来进行。

2021-02-06 14:42:47 8946 13

原创 仿真中设置断点和查看变量

设置断点和查看变量在软件执行过程中,通过设置断点可以查看在程序执行到断点处时变量数值。设置断点可以便于查看软件程序(function、task、object)中局部变量的数值。要注意的是,软件部分的变量(即动态变量,与硬件变量即静态变量相对)是无法添加到波形窗口的,原因之一例如软件变量会在0时刻中完成多次运算,而波形窗口无法反映出在0时刻的若干变化,而且这么做对于波形存储的压力也很大。因此软件部分的变量只可以通过设置断点来查看当前程序中的变量数值。设置断点的另一个作用在于可以用来调试程序执行的顺序,

2021-02-04 23:49:47 2006

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除