UVM中的regmodel继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过Synopsys

家的工具ralgen来直接生成regmodel,提供后门访问,十分方便。

寄存器模型建模:

1)定义一个寄存器,如下;也可以在该class中定义covergroup,sample的function等。在以后的component中在采样。

class  reg_invert  extends uvm_reg;

rand  uvm_reg_field  reg_data;     //uvm_reg_field是寄存器模型中最小的单元,相当于一个bit

//可以定义多个uvm_reg_field;

covergroup  cg_vars();                 //定义covergroup

option.per_instance = 1;     //按intance来采集覆盖率

xxxxxxx;

endgroup

virtual  function  void build();        //与build phase不同,这仅仅是一个建立函数

reg_data = uvm_reg_field::type_id::creat("reg_data");      //new reg_field

reg_data.configure();    //可以定义该field在这个reg中的具体位置,操作方式,是否有复位值

endfunction                                //是否可以随机化等。

function  void  sample_values();

super.sample_values();

if(get_coverage(UVM_CVR_FIELD_VALS))  begin   //get_coverage()返回coverage是否使能

if(cg_vals != null)  cg_vals.sample();

endfunction

configure(this, 1, 0, "RW", 1, 0, 1, 1, 0); this表示parent class,"1"表示此域的宽度,“0”表示最低位的位置,“RW”表示可读可写,“1”是否volatile

“0”上电后的复位值,“1”此域是否有复位,“1”是否可以随机化,“0”此域是否可单独存取

UVM_CVR_FIELD_VALS定义于uvm_coverage_model_e联合体中,还有定义UVM_NO_COVERAGE, UVM_CVR_REG_BITS,

UVM_CVR_ADDR_MAP, UVM_CVR_ALL。

2)定义一组寄存器,如下:

class  block_reg  extends  uvm_reg_block;

rand  reg_gpr0   gpr0;                //定义一个寄存器

rand  uvm_reg_field    ctrl_en;    //也可定义一个寄存器部分

virtual function void build();        //同样与build phase不同,仅仅一个建立函数

this.default_map = creat_map();    //先建立一个addr_map

this.gpr0 = reg_gpr0::type_id::create("gpr0",get_full_name() );

this.gpr0.configure(this, null, "");

this.gpr0.build();

this.gpr0.add_hdl_path();        //后门访问的路径

this.default_map.add_reg();           //前门访问的地址

endfunction

begin

reg_gpr0_bkdr  bkdr = new(this.gpr0.get_full_name() );

this.gpr0.set_backdoor(bkdr);          //设置该寄存器对应的后门操作

end

create_map("", 0, 4, UVM_LITTLE_ENDIAN, 0); 参数名为空, 基地址为0, 系统总线的宽度是4*8,小端格式,不能按byte来寻址。

add_hdl_path(‘{‘{“REG1”, -1, -1}});   表示作为一个整体来寻址。

add_hdl_path(‘{‘{“A_REG”, 15, 1},  '{"B_REG", 10, 2}});   表示两部分第15位的为A_REG,第10-11位是B_REG。

add_reg(this.gpr0, 'h0, "RW");  表示寄存器gpr0,地址是0, 读写方式访问。

class  reg_gpr0_bkdr    extends   uvm_reg_backdoor;

virtual task read(uvm_reg_item rw);

do_pre_read(rw);           //callback函数

rw.value[0] = `REG_TOP_PATH.A_REG;    //路径+已经定义过的A_REG,在add_hdl_path,PATH的定义可以放在命令行

rw.status = UVM_IS_OK;            //返回的状态值定义在uvm_state_e联合体中,还有UVM_HAS_X, UVM_ERROR

do_post_read(rw);

endtask

virtual  task  write(uvm_reg_item rw);

//与read类似

endtask

endclass

uvm_reg_item派生自uvm_sequence_item,表示一个寄存器的Transaction。

uvm_reg_bus_op表示一个对register/memory的bus Transction,主要用在前门访问中

最后子顶层env build_phase中定义如下:

uvm_reg::include_coverage("*", UVM_CVR_FIELD_VALS);

regmodel = block_reg::type_id::create("block", this);

regmodel.build();

regmodel.set_coverage(UVM_CVR_FIELD_VALS);

regmodel.lock_model();

regmodel.default_map.set_auto_predict(0);  //从DUT更新寄存器模型的一种方式

至此后门访问已经可以通过

UVM中的regmodel建模(一)的更多相关文章

  1. UVM中的regmodel建模(三)

    总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...

  2. UVM中的regmodel建模(二)

    UVM的寄存器模型,对一个寄存器bit中有两种数值,mirror值,尽可能的反映DUT中寄存器的值.expected值,尽可能的反映用户期望的值. 几种常用的操作: read/write:可以前门访问 ...

  3. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称

    关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型:   在visio菜单上--->点击数据库--->选项--->文档    打开后选择表这项,在上 ...

  4. UVM中的class

    UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...

  5. 直播开始:'云榨汁机'诞生记--聊聊JavaScript中的'业务建模'

    闭包是JavaScript中的一个重要特性,在之前的博文中,我们说闭包是一个'看似简单,其实很有内涵'的特性.当我们用JavaScript来实现相对复杂的业务建模时,我们可以如何利用'闭包'这个特性呢 ...

  6. 浅析软件工程中的UML建模技术

    一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...

  7. UVM中的sequence使用(一)

    UVM中Driver,transaction,sequence,sequencer之间的关系. UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的rand ...

  8. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  9. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...

随机推荐

  1. TypeScript中处理大数字(会丢失后面部分数字)

    为啥要弄这玩意? 最近做数值游戏,需要用到很大的数字,在前端大数字会自动变成e的科学计数法. 有啥问题? 问题: 1. 在传递给服务端时,服务端因为不能处理大数字(怎么就处理不了?!),就想要我传字符 ...

  2. CentOS上传下载查看命令

    之前往CentOS中上传都用ftp软件,这里介绍一种另外的上传下载方式,两个命令轻松搞定.这两个命令目前只针对Xshell和SecureCRT等远程终端软件才支持,并且还会有时间的限制.大概30秒不上 ...

  3. 【CF662C】Binary Table 按位处理

    [CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le ...

  4. 【CF865C】Gotta Go Fast 二分+期望DP

    [CF865C]Gotta Go Fast 题意:有n个关卡需要依次通过,第i关有pi的概率要花ai时间通过,有1-pi的概率要花bi时间通过,你的目标是花费不超过m的时间通关,每一关开始时你都可以选 ...

  5. Unity3D 面试三 ABCDE

    说说AB两次面试: “金三银四” 三月份末又面试过两家:共和新路2989弄1号1001这家找了我半天,哇好漂亮的办公大楼!问了保安才知道,这个地址是小区地址.另一家也是创业公司面试我的自称是在腾讯做过 ...

  6. Unity3D NGUI 二 NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么

    a.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不灵活. void OnClick(){ Debug.Log("Button is Click!!!& ...

  7. iOS - ShareSDK第三方分享(图文和视频)和登录

    由于近期工作需要自己抽时间搞了一下第三方分享,这里使用的是shareSDK的第三方,在使用的过程中有一些心得和体会,特在此和大家分享一下~ 1.在经过将近一周时间的开发,终于搞定ios分享了. 2.由 ...

  8. STS没有找到Dynamic Web Project

    解决:安装JavaEE插件 help-> install new software-> 选择sts对应的eclipse版本站点,如eclipse版本4.09选择2018-09.4.10选择 ...

  9. Windows Server 2008 R2之三管理活动目录数据库

    活动目录数据库包括数据库文件NTDS.dit和日志文件.考虑到最佳性能,在生产环境推荐将日志文件和数据库文件在单独的硬盘驱动器中或RAID中,同时要根据网络的规模,保证磁盘上有充足的剩余空间.由于活动 ...

  10. vue--自定义指令进行验证(1)

    实例代码: <template> <div id="app" class="app"> <h3>{{msg}}</h3 ...