uvm_reg_item——寄存器模型(五)
uvm_reg_item 扩展自uvm_sequence_item,也就说寄存器模型定义了transaction item. adapter 的作用是把这uvm_reg_item转换成uvm_sequence_item,再经由uvm_sequencer发送个uvm_driver,最终在总线上传输。
//------------------------------------------------------------------------------
// Title: Generic Register Operation Descriptors
//
// This section defines the abstract register transaction item. It also defines
// a descriptor for a physical bus operation that is used by <uvm_reg_adapter>
// subtypes to convert from a protocol-specific address/data/rw operation to
// a bus-independent, canonical r/w operation.
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// CLASS: uvm_reg_item
//
// Defines an abstract register transaction item. No bus-specific information
// is present, although a handle to a <uvm_reg_map> is provided in case a user
// wishes to implement a custom address translation algorithm.
//------------------------------------------------------------------------------ class uvm_reg_item extends uvm_sequence_item; `uvm_object_utils(uvm_reg_item) // Variable: element_kind
//
// Kind of element being accessed: REG, MEM, or FIELD. See <uvm_elem_kind_e>.
//
uvm_elem_kind_e element_kind; uvm_object element;
rand uvm_access_e kind; // Variable: value
//
// The value to write to, or after completion, the value read from the DUT.
// Burst operations use the <values> property.
//
rand uvm_reg_data_t value[]; // TODO: parameterize
constraint max_values { value.size() > && value.size() < ; } rand uvm_reg_addr_t offset;
uvm_status_e status;
uvm_reg_map local_map;
uvm_reg_map map;
uvm_path_e path;
rand uvm_sequence_base parent;
int prior = -;
rand uvm_object extension;
string bd_kind;
string fname;
int lineno; function new(string name="");
super.new(name);
value = new[];
endfunction // Function: convert2string
//
// Returns a string showing the contents of this transaction.
//
virtual function string convert2string();
string s,value_s;
s = {"kind=",kind.name(),
" ele_kind=",element_kind.name(),
" ele_name=",element==null?"null":element.get_full_name() }; if (value.size() > && uvm_report_enabled(UVM_HIGH, UVM_INFO, "RegModel")) begin
value_s = "'{";
foreach (value[i])
value_s = {value_s,$sformatf("%0h,",value[i])};
value_s[value_s.len()-]="}";
end
else
value_s = $sformatf("%0h",value[]);
s = {s, " value=",value_s}; if (element_kind == UVM_MEM)
s = {s, $sformatf(" offset=%0h",offset)};
s = {s," map=",(map==null?"null":map.get_full_name())," path=",path.name()};
s = {s," status=",status.name()};
return s;
endfunction virtual function void do_copy(uvm_object rhs);
endfunction endclass //------------------------------------------------------------------------------
//
// CLASS: uvm_reg_bus_op
//
// Struct that defines a generic bus transaction for register and memory accesses, having
// ~kind~ (read or write), ~address~, ~data~, and ~byte enable~ information.
// If the bus is narrower than the register or memory location being accessed,
// there will be multiple of these bus operations for every abstract
// <uvm_reg_item> transaction. In this case, ~data~ represents the portion
// of <uvm_reg_item::value> being transferred during this bus cycle.
// If the bus is wide enough to perform the register or memory operation in
// a single cycle, ~data~ will be the same as <uvm_reg_item::value>.
//------------------------------------------------------------------------------ typedef struct { // Variable: kind
//
// Kind of access: READ or WRITE.
//
uvm_access_e kind; // Variable: addr
//
// The bus address.
//
uvm_reg_addr_t addr; // Variable: data
//
// The data to write. If the bus width is smaller than the register or
// memory width, ~data~ represents only the portion of ~value~ that is
// being transferred this bus cycle.
//
uvm_reg_data_t data; // Variable: n_bits
//
// The number of bits of <uvm_reg_item::value> being transferred by
// this transaction. int n_bits; /*
constraint valid_n_bits {
n_bits > 0;
n_bits <= `UVM_REG_DATA_WIDTH;
}
*/ // Variable: byte_en
//
// Enables for the byte lanes on the bus. Meaningful only when the
// bus supports byte enables and the operation originates from a field
// write/read.
//
uvm_reg_byte_en_t byte_en; // Variable: status
//
// The result of the transaction: UVM_IS_OK, UVM_HAS_X, UVM_NOT_OK.
// See <uvm_status_e>.
//
uvm_status_e status; } uvm_reg_bus_op;
uvm_reg_item——寄存器模型(五)的更多相关文章
- uvm_reg_predictor——寄存器模型(十七)
这是寄存器模型类中唯一派生自uvm_component的类,我们的寄存器模式需要实时,以最接近的方式知道DUT中寄存器的变化,uvm_reg_predictor就是为这个而生的. // TITLE: ...
- uvm_reg_sequence——寄存器模型(六)
寄存器模型 uvm_reg_sequence是UVM自带所有register sequence 的基类. 该类包含model, adapter, reg_seqr(uvm_sequencer). 感觉 ...
- uvm_reg_model——寄存器模型(一)
对于一个复杂设计,寄存器模型要能够模拟任意数量的寄存器域操作.UVM提供标准的基类库,UVM的寄存器模型来自于继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器 ...
- [Beego模型] 五、构造查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- uvm_reg_cbs——寄存器模型(十六)
当你完成寄存器模型的时候,你就会想到给后来的人一个接口,给他更多的扩展,让他做更多的事,一般而言,只有做VIP时,会想到做callbacks. typedef class uvm_reg; typed ...
- uvm_reg_block——寄存器模型(七)
这是寄存器模型的顶层 //------------------------------------------------------------------------ // Class: uvm_ ...
- uvm_reg_defines——寄存器模型(四)
文件: src/marcos/uvm_reg_defines 类: 无 该文件是寄存器模型src/reg/* 文件对于的宏文件,主要定义了寄存器地址位宽,寄存器数据位宽,字节的大小.计算机从最初的8, ...
- UVM——寄存器模型相关的一些函数
0. 引言 在UVM支持的寄存器操作中,有get.update.mirror.write等等一些方法,在这里整理一下他们的用法. 寄存器模型中的寄存器值应该与DUT保持同步,但是由于DUT的值是实时更 ...
- uvm_reg_fifo——寄存器模型(十五)
当我们对寄存器register, 存储器memory, 都进行了建模,是时候对FIFO进行建模了 uvm_reg_fifo毫无旁贷底承担起了这个责任,包括:set, get, update, read ...
随机推荐
- 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决
原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...
- ImportCommon
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using S ...
- Flutter实战视频-移动电商-62.购物车_首页Provide化 让跳转随心所欲
62.购物车_首页Provide化 让跳转随心所欲 新建provide/currentIndex.dart 内容比较简单,定义一个变量当前页面的索引currentIndex,再定义一个方法改变它的值 ...
- ASP.NET中的几种弹出框提示基本方法
NET程序的开发过程中,常常需要和用户进行信息交互,对话框的出现将解决了这些问题,下面是本人对常用对话框使用的小结,希望对大家有所帮助 我们在.NET程序的开发过程中,常常需要和用户进行信息交互,比如 ...
- man帮助的使用
本篇博文转自Linux社区,谨在此记录使用: ——————Linux系统man帮助的使用技巧———————— man的查询后面的数字含义:1用户在shell换机中可以操作的指令或可执行文件2系统核心可 ...
- [Xcode 实际操作]八、网络与多线程-(4)使用UIApplication对象发送短信
目录:[Swift]Xcode实际操作 本文将演示如何使用应用程序单例对象,发送短信的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 注:需要使用真机进行测 ...
- django框架知识3
1.Django安装: 1.安装版本Django1.11.11 2.安装方式:命令行安装 pycharm安装 2.创建Django项目 1.创建方式:cd到你要创建的目录下 然后输入 Djang ...
- Luogu P1514引水入城【搜索】 By cellur925
题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...
- html中id name class的区别(转)
HTML 中 id与name 区别 一个name可以同时对应多个控件,比如checkbox和radio 而id必须是全文档中唯一的 id的用途 1) id是HTML元素的Identity,主要是在客户 ...
- PyInstaller 库
将.py 源代码转换成无需源代码的可执行文件 首先,PyInstaller是第三方库,需要下载额外安装(安装第三方库需要使用pip工具) 步骤: 1.用管理员运行cmd命令行 "pip in ...