自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 同步fifo及异步fifo的代码示例

同步fifo,异步fifo

2022-06-10 16:07:24 1328

原创 UVM实战——lab3 channel组件更新

部分内容在前文已有提及接口更新slave node接口:DATA(31:0):通道数据输入。DATA_PARITY: Data数据的奇偶校验位。VALID:数据有效标志信号。WAIT:暂停接收。PARITY_ERR: slave node侧发现数据或数据校验位出错。时序更新slave node接口时序:#1: 正常传输#2: VALID=O,上行数据未准备好,等待#3: 数据校验错误,接收端置起WAIT将数据接收和输入挂起。#4: 错误标识位通过APB清除,数据准备重发。

2022-05-05 19:33:31 477

原创 UVM实战——lab2

PROPERY ASSERTION实现apb_if文件下的PROPERY ASSERTION:在PSEL为高时,PADDR总线不可以为X值property p_paddr_no_x; @(posedge clk) psel |-> !$isunknown(paddr);endpropertyassert property(p_paddr_no_x) else `uvm_error("ASSERT", "PADDR is unknow when PSEL is high")...

2022-05-01 15:50:10 852

原创 UVM实战——property使用

property使用结合sequence(序列)对时序和逻辑的描述,property(属性)可以用来描述设计的确切行为。Property可以在验证中用来做assumption,checker或者coverage:- 当使用assert关键词时,可以用作checker来检查设计是否遵循property的描述。- 当使用assume关键词时,可以作为环境的假设条件,对于仿真环境和形式验证均起到对激励进行假设的作用。- 当使用cover关键词时,可以将property是否真正通过作为断言覆盖率来衡量。P

2022-04-28 16:15:12 2013

原创 UVM实战——sequence定义

基本操作符号##用来表示周期延迟符号,例如##n表示在n个时钟周期后,##0表示在当前周期,即交叠周期。a ##0 b指a、b同时为高,等同于a&&b.sequence a_b@(posedge clk) a ##1 b;endsequence##[min:max]表示在一个范围内的时钟周期延迟。min、max必须是非负数,序列会在从min到max时间窗口中最早的时间来匹配。sequence a_b@(posedge clk) a ##[1:5] b; //b在min到ma

2022-04-22 17:04:37 1087

原创 UVM实战——assertion介绍

断言(assertion)断言(assertion)是用来与设计功能和时序作比较的属性描述,可以完成:- 检查设计的内容。- 提高设计的可视度和调试能力。- 检查设计特性在验证中是否被覆盖。对于断言,它的可读性好,可以用来服务于设计文档;用来检查算法模型的断言在形式验证(formal verification)中可以穷尽计算,找出可能的违例(violation);可以自由地打开或者关闭;—小部分子集甚至可以用来综合或者移植到emulation中,用来完成跨平台的移植。基于断言的验证方法学(ABV

2022-04-22 14:49:36 5033

原创 UVM实战——lab1

APB的层次关系实现APB master driver的drive_transfer()方法task apb_master_driver::get_and_drive(); forever begin seq_item_port.get_next_item(req); //获取trans `uvm_info(get_type_name(), "sequencer got next item", UVM_HIGH) drive_transfer(req); //发送trans v

2022-04-20 16:32:11 1120 4

原创 UVM实战——验证环境更新策略

组件更新channel master agent的driver和monitor由于总线接口信号和时序的变化,需要更新。register master agent由于总线更新为APB,需要开发完整的APB master agent。formatter slave agent由于总线信号和时序的变化,也需要进行更新。寄存器列表发生了变化,因此也需要进行寄存器模块的更新。由于寄存器访问VIP发生变化,也需要对寄存器模型与总线VIP桥接转换的adapter进行更新。环境更新与MCDF连接的各个接口信.

2022-04-18 15:37:51 325

原创 UVM实战——AMBA标准接口

AMBA标准接口AMBA概述AMBA(Advanced Microcontroller Bus Architecture)高级处理器总线架构,不同的速率需求构成了为高性能SoC设计的通信标准:- AHB(Advanced High-performance Bus)高级高性能总线;- APB(Advanced Peripheral Bus)高级外围总线;- AXI (Advanced eXtensible Interface)高级可拓展接口。AHB主要是针对高效率、高频宽及快速系统模块所设计的总线

2022-04-18 15:30:33 511

原创 UVM实战——MCDF的设计更新

MCDF的设计更新主要可分为结构、接口、时序、寄存器的更新。结构更新Channel的概念由Slave Node替代。Slave node的接口发生变化。Registers的接口发生变化。Formatter的接口发生变化。接口更新Slave node接口:- DATA(31:0):通道数据输入。- DATA_PARITY:Data数据的奇偶校验位。.- VALID:数据有效标志信号。- WAIT︰暂停接收。- PARITY_ERR:slave node侧发现数据或数据校验位出错。上三个

2022-04-18 15:01:23 885

原创 UVM——寄存器应用场景

寄存器应用场景在了解了寄存器模型的常规方法之后,我们需要考虑如何利用这些方法来检查寄存器、以及协助检查硬件设计逻辑和比对数据。在软件实现硬件驱动和固件层时,也会实现类似寄存器模型镜像值的方法,即在寄存器配置的底层函数中,同时也声明一些全局的影子寄存器(shadow register) 。这些影子寄存器的功能就是暂存当时写入寄存器的值,而在后期使用时,如果这些寄存器是非易失的non-volatile),那么便可以省略读取寄存器的步骤,转而使用影子寄存器的值。这么做的好处在于响应更迅速,而不再通过若干个时钟周

2022-04-15 11:19:50 482

原创 UVM——寄存器常规方法

mirro、desired和actual value我们在应用寄存器模型的时候,除了利用它的寄存器信息,也会利用它来跟踪寄存器的值。寄存器模型中的每一个寄存器,都应该有两个值,一个是镜像值(mirrored value) ,一个是期望值(desired value) 。期望值是先利用寄存器模型修改软件对象值,而后利用该值更新硬件值;镜像值是表示当前硬件的已知状态值。镜像值往往由模型预测给出,即在前门访问时通过观察总线或者在后门访问时通过自动预测等方式来给出镜像值。镜像值有可能与硬件实际值(actual

2022-04-15 10:09:50 2529

原创 UVM——寄存器模型集成

寄存器模型集成总线UVC的实现MCDF访问寄存器的总线接口时序较为简单。控制寄存器接口首先需要在每一个时钟解析cmd。当cmd为写指令时,即需要把数据cmd_data_in写入到cmd_addr对应的寄存器中。当cmd为读指令时,即需要cmd_addr对应的寄存器中读取数据,在下一个周期,cmd_addr对应的寄存器数据被输送到cmd_data_out接口。下例时8位地址,32位数据线的总线UVC实现代码。class mcdf_bus_trans extends uvm_sequence_item;

2022-04-06 20:59:35 599

原创 UVM——寄存器模型

寄存器模型概览硬件中的各个功能模块可以由处理器来配置功能以及访问状态,而与处理器的对话即是通过寄存器的读写来实现的。寄存器的硬件实现是通过触发器,而每一个比特位的触发器都对应着寄存器的功能描述(function specification)。一个寄存器一般由32个比特位构成,将单个寄存器拆分后,又可以分为多个域(field),不同的域往往代表着某一项独立的功能。单个的域可能由多个比特位构成,也可能有单一比特位构成,这取决于该域的功能模式可配置的数量。而不同的域,对于外部的读写而言,又大致可以分为WO(

2022-04-05 17:37:47 3175 2

原创 UVM——sequence的层次化

sequence的层次化sequence的层次化包含以下概念:hierarchical sequence;virtual sequence;layering sequenceHierarchical Sequence在验证MCDF的寄存器模块时,verifier将SV验证环境进化到了UVM环境之后,关于测试寄存器模块的场景可以将其拆解为:- 设置时钟和复位- 测试通道1的控制寄存器和只读寄存器- 测试通道2的控制寄存器和只读寄存器- 测试通道3的控制寄存器和只读寄存器//实例typed

2022-03-29 22:03:18 624

原创 UVM——sequencer的仲裁和锁定机制

sequencer的仲裁机制uvm_sequencer类自建了仲裁机制来保证多个sequence在同时挂载到sequencer时,可以按照仲裁规则允许特定sequence中的item优先通过。在实际使用中,可以通过uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)函数来设置仲裁模式,UVM_SEQ_ARB_TYPE有以下几种值供选择:- UVM_SEQ_ARB_FIFO:默认模式,来自于sequences的发送请求,按照FIFO先进先出的方式依次授

2022-03-29 12:11:18 1257

原创 UVM——sequence和item的挂载

sequence和sequencersequence需要挂载到sequencer上方能正常工作,如果有多个sequence同时挂载到一个sequencer时,还需要进行仲裁。以下会对挂载常用的宏和方法进行介绍sequence宏sequence的发送和嵌套主要依靠start()和’uvm_do//sequence和item发送实例class bus_trans extends uvm_sequence_item; rand int data; `uvm_object_utils_begin(bu

2022-03-29 11:12:11 1525

原创 UVM——Sequencer & Driver

driver和sequencer之间的通信方式采取get模式,即由driver发起请求,从sequencer一端获得item,再由sequencer将其传递至drive。driver只要可以从sequencer获取item,就会不停的进行工作。sequencer和item只应该在合适的时间点产生需要的数据,而处理数据应该交由driver实现。端口和方法为了便于item传输,UVM专门定义了匹配的TLM端口供sequencer和driver使用:- uvm_seq_item_pull_port #(t.

2022-03-28 11:29:11 1024

原创 UVM——sequence & item

此处sequence泛指uvm_sequence_item类,item泛指uvm_sequence_item类。sequence用来实现激励生成和场景控制;item实现对激励所需要的具体数据和控制要求。sequence item介绍item基于uvm_object类,具备UVM核心基类所必要的数据操作方法,如copy(),clone(),compare(),record()等。通常将它们划分为以下类:- 控制类。如总线协议上的读写类型、数据长度、传送模式等。- 负载类。一般指数据总线上的数据包。

2022-03-23 10:14:43 1302

原创 UVM——sequence、sequencer、driver概述

sequence、sequencer、driver关系三者的关系如上图所示:- sequence产生目标数量的sequence item,并通过随机化使每一个sequence item对象的数据内容不同- sequence item经过sequencer流向driver- driver将每一个流入的item(req)进行数据解析,按照与DUT的接口协议写入,形成有效激励- 如有需要,driver解析完一个item后,会将最后的状态信息写回item,再返回给sequencer(rsp),最终抵达s

2022-03-22 15:41:10 3869

原创 UVM——同步通信元件

同步通信元件SV用来做线程同步的元件分别是semaphore、event、mailbox。UVM中需要解决不同组件之间的线程同步问题,如果线程同步发生在不同组件,这就要求组件之间可以通过某种方法实现同步。而event或semaphore会因为层次索引的形式破坏UVM组件的封闭性,因此UVM定义了以下类来实现组件之间的同步:- uvm_event,uvm_event_pool和uvm_event_callback- uvm_barrier,uvm_barrier_pool这两组类分别用于服务两个组件

2022-03-18 22:34:49 1142

原创 UVM——TLM2通信

TLM2通信TLM2.0多用于SystemC,与TLM1.0相比,2.0的优势包括:- 双向的阻塞或非阻塞接口- 时间标记- 统一的数据包TLM2.0使得接口之间的通信更趋于标准化,更容易为系统构建抽象模型。接口实现TLM2的传输是双向的,一次完整的数据传输包含request和response类型,与TLM1 transport端口传输方式类似。TLM2支持blocking和nonblocking两种transport方式:- blocking传输方式要求在一次传输过程中,完成request

2022-03-18 16:19:20 753

原创 UVM——通信管道

通信管道可以通过以下TLM组件和端口实现端对端的数据传输:- TLM FIFO- analysis port- analysis TLM FIFO- request&response 通信管道TLM_FIFO在一般TLM传输过程中,无论是initiator给target发起一个transaction,还是initiator从target获取一个transaction,transaction最终都会流向consumer中(initiator和target都可以是consumer)。co

2022-03-18 11:35:04 354

原创 UVM——双向通信,多向通信

双向通信双向通信(bidirectional communication)的两端也分为initiator和target,但是数据流向在端对端之间是双向的。双向通信的两端同时扮演着producer和consumer的角色,而initiator作为request发起方,在发起request之后,还会等待response返回。端口分类双向端口按照通信握手信号可以分为:- transport双向通信方式- master和slave双向通信方式transport端口通过transport()方法,可以在

2022-03-17 16:36:35 998

原创 UVM——单向通信

单向通信单向通信(unidirection communication)指的是从initiator到target之间的数据流向是单一方向的或者说initiator和target只能扮演producer和consumer中的一个角色。端口类型PORT代表了三种端口名:port、export、imp按照UVM端口名的命名规则,指出了通信的两个要素:是否阻塞(是否可以等待延时);何种通信方法。端口方法阻塞传输方式将blocking前缀作为函数名的一部分,而非阻塞方式则名为nonblocking。阻塞

2022-03-16 11:10:15 416

原创 UVM——TLM通信

TLM通信TLM(Transaction-Level Modeling)是一种基于事务的通信方式,通常作为模块之间的通讯使用。TLM通信需要两个通信对象:initiator,target。initiator发起通信请求,target作为发起通信的响应方。而按照transaction的流向,可以将对象分为producer和consumer。producer是数据产生的地方,consumer是数据流向的地方。需要注意的是initiator不一定是producer,target不一定是consumer。有了

2022-03-14 21:22:46 789

原创 UVM——构建验证环境的内经

环境构建的四要素环境建立的核心要素:单元组件的自闭性;回归创建;通信端口连接;顶层配置单元组件的自闭性自闭性是指单元组件(如uvm_agent或uvm_env)自身可以成为独立行为不依赖于其他并行的组件。举例来说,driver同sequencer之间,虽然driver需要获取sequencer的transaction item,但是它本身可以独立例化,而他们之间的通信是基于TLM端对端的连接实现的。这种单元组件的自闭性为日后的组件复用提供了良好基础,各个子环境可以独立集成于顶层环境,互相也不需要额外

2022-03-11 15:45:00 338

原创 UVM——MCDF顶层结构

MCDF设计结构可以分为四个模块:上行数据的通道从端(channel slave);仲裁器(arbiter);整形器(formatter);控制寄存器(control registers。将验证环境进一步划分,可以分为reg_env,chnl_env,arb_env,fmt_env。reg_envreg_env包括:reg_master_agent,提供寄存器接口驱动信号reg_slave_agent,提供寄存器接口反馈信号scoreboard,分别从reg_master_agent内的mon

2022-03-10 15:11:43 1194

原创 UVM——组件家族

用户在使用uvm_driver时,不应该直接调用uvm_driver,而应该定义一个继承于uvm_driver新driver类,其中的REQ,RSP类型也可以进行更改。uvm_driver类的作用是和sequencer类的端口连接进行通信,从而实现事务对象的获取。通过pull实现:driver.seq_item_po

2022-03-07 10:46:53 773

原创 UVM——config机制,消息管理

config机制config机制的作用是设置变量修改环境,实现变量从一个层次到另一个层次的传递。常见的是uvm_config_db类,其功能如下:传递virtual interface到环境中设置单一变量值,例如int、string、enum等传递配置对象(config object)到环境中uvm_config_db#(T)::set(uvm_component cntxt, string inst_name, string field_name, T value);uvm_config_

2022-03-05 15:41:22 1293 1

原创 UVM——phase机制

phase机制

2022-03-04 21:29:13 1045

原创 UVM——核心基类

核心基类uvm_void开辟了UVM世界,uvm_object和uvm_port_base继承了uvm_object类,进行世界的耕垦。在类库地图中,事务接口(transaction interface)类继承uvm_port_base,其他继承uvm_object。uvm_object提供的核心方法主要有:copyclonecompareprintpack/unpack域的自动化(field automation)UVM通过域的自动化能够让用户更方便的使用这些方法,无需像SV中那样进

2022-03-03 19:51:50 875

原创 UVM——工厂机制,覆盖方法

工厂的意义:为了更方便的替换验证环境中的实例或已注册的类型,使注册机制更加灵活。UVM验证环境的两大类:uvm_component,uvm_object。 从关系上来看,uvm_component 继承于 uvm_report_objec t继承于 uvm_object。uvm_component实现了验证环境的层次化,uvm_object实现了环境的配置和数据的传输。uvm_component是...

2022-02-28 16:57:19 1120

空空如也

空空如也

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

TA关注的人

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