(1) 一个寄存器模型必须包含一个reg_block;一般DUT内具有相同的基地址的所有寄存器,会放在一个reg_block中. (2) uvm_reg_block可以包含任意数量的uvm_reg, register files, memories以及其他低层次的uvm_reg_block; (3) uvm_reg block里含有uvm_reg_map类对象default_map,用于地址映射以及完成寄存器前门访问操作...
(2) 在使用get_root_blocks函数得到reg_block的指针后,使用cast将其转化为目标reg_block形式; externstaticfunctionvoidget_root_blocks(refuvm_reg_block blks[$]); functionvoiduvm_reg_block::get_root_blocks(refuvm_reg_block blks[$]);foreach(m_roots[blk]) begin blks.push_back(blk); end endfunc...
uvm_reg_block:它是一个比较大的单位,在其中可以加入许多的uvm_reg,也可以加入其他的uvm_reg_block uvm_reg_map:每个寄存器在加入寄存器模型时都有其地址,uvm_reg_map就是存储这些地址,并将其转换成可以访问的物理地址(因为加入寄存器模型中的寄存器地址一般都是偏移地址,而不是绝对地址) 简单的寄存器模型 只有一...
uvm_reg_field:包含uvm_reg_data_t类型的三个成员变量value,m_mirrored,m_desire。 uvm_reg:包含成员变量m_fields,加入各个uvm_reg_field。 uvm_reg_block:uvm_reg的集合,uvm_reg需要加入到uvm_reg_map中,且属于同一个uvm_reg_block。每个uvm_reg_block至少包含一个uvm_reg_map。uvm_reg_block中也可以再...
uvm_reg_block:它是一个比较大的单位,在其中可以加入许多uvm_reg,也可以加入其他的uvm_reg_block。一个register model中至少包含一个uvm_reg_block。 UVM_FRONTDOOR:它代表的是寄存器的访问方式,即通过模拟cpu,在总线上发出读指令,进行读写操作。在这个过程中,仿真时间(不是花费的cpu时间,而$time函数得到的时间...
uvm_reg_map:用于存储寄存器模型里寄存器的地址,在每个reg_block里至少有一个uvm_reg_map(通常也只有一个)。 接下来我们来分享如何定义一个最简单的寄存器模型(只有一个寄存器,且寄存器里只有一个寄存器域)。 首先,要先从uvm_reg类里派生一个寄存器类(即先生成一个寄存器的版图),在这个类里会有一个build函数(完...
uvm_reg的configure,也有3个参数,· uvm_reg_block blk_parent,表示包含reg的reg_block对象 · ...
uvm_reg_block,包含类,包含底层的uvm_reg_block,uvm_reg, default_path,定义自己的hdl_path, lock,表明当前的model是lock住的,调用function lock_model() 自己的coverage设置,new的时候设置到has_cover,get的时候,得到cover_on。 uvm_reg_sequence,只是实现了调用map中的读写操作,不支持burst_read,burst_write,...
get register函数是用于从register block中获取指定名称或地址的寄存器描述的函数。它接受一个字符串参数,可以是寄存器的名称或地址,并返回对应的寄存器描述。 以下是一个示例get register函数的代码: python function get_register(input string name) return uvm_reg; static uvm_reg_list reg_list = this.get_regis...
uvm_reg的访问方法 在给出寄存器模型的常见应用模式之前,首先从下表中更全面地了解uvm_reg_ block、 uvm_reg 和uvm_reg_ field 三个类提供的用于访问寄存器的方法。 uvm_reg_ sequence 提供的方法(均是针对寄存器对象的, 而不是寄存器块或寄存器域)如下表。