UVM中的regmodel建模(一)
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建模(一)的更多相关文章
- UVM中的regmodel建模(三)
总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...
- UVM中的regmodel建模(二)
UVM的寄存器模型,对一个寄存器bit中有两种数值,mirror值,尽可能的反映DUT中寄存器的值.expected值,尽可能的反映用户期望的值. 几种常用的操作: read/write:可以前门访问 ...
- Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型: 在visio菜单上--->点击数据库--->选项--->文档 打开后选择表这项,在上 ...
- UVM中的class
UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...
- 直播开始:'云榨汁机'诞生记--聊聊JavaScript中的'业务建模'
闭包是JavaScript中的一个重要特性,在之前的博文中,我们说闭包是一个'看似简单,其实很有内涵'的特性.当我们用JavaScript来实现相对复杂的业务建模时,我们可以如何利用'闭包'这个特性呢 ...
- 浅析软件工程中的UML建模技术
一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...
- UVM中的sequence使用(一)
UVM中Driver,transaction,sequence,sequencer之间的关系. UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的rand ...
- UVM中factory机制的使用
UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...
- UVM中的factory机制实现
首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...
随机推荐
- innodb 锁机制
InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我 ...
- ConfluenceRemoteUserAuth
配置confluence使用httpHeader的方式进行登录(目标版本:atlassian-confluence-6.3.3) 前提是已经安装好了Confluence,并且前端使用apache或者n ...
- VIM 的一些技巧
vim配置文件 ~/.vimrc 如果没有自己创建一个即可 filetype plugin indent on #打开插件 set number #显示行号 syntax on #语法高亮 set c ...
- 23种设计模式之中介者模式(Mediator)
中介者模式是一种对象的行为型模式,通过一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者对象的存在保证了对象结构上的稳 ...
- dhroid - eventbus 事件总线
你听过onClick 事件,onItemClick 事件,事件总线不一定听过吧, eventbus 事件总线也是一个编程思想,为什么要设计EventBus了,因为他是领域驱动设计中比不可少的模块,它承 ...
- 关于IP地址子网的划分
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
- linker command failed with exit code 1 (use -v to see invocation) 变量重名
有时候,xcode报错看不到,点最后一个按钮,类似气泡的就能看到 报错信息: duplicate symbol _imgNummmm in: /Users/mianmian/Library/De ...
- maven package install deploy区别
package 命令完成了项目编译.单元测试.打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库install 命令完成了项目编译.单元测 ...