RAL寄存器模型

1.寄存器模型介绍

UVM 寄存器模型的本质就是重新定义了验证平台与DUT 的寄存器接您证人员更好地组织及配置寄存器,简化流程、减少工作量。
 

uvm_reg_field:这是寄存器模型中的最小单位。

uvm_reg:它比 uvm_reg_fied高一个级别,但是依然是比较小的单位。一个寄存器中至少包含一个uvm_reg_field.

uvm_reg_block :它是一个比较大的单位,在其中可以加入许多的uvm_reg.也可以加入其他的uvm_reg_ block。一个寄存器模型中至少包含一个 uvm _reg_block。

uvm_reg_mp :每个寄存器在加入寄存器模型时都有其地址,uvm_reg_map 就是存储这些地址,并将其转换成可以访的物理地址(因为加入寄存器模型的地址是偏移地址,而不是绝对地址)。当寄存器模型使用前门访同方式来实现读或写操作时,uvm_reg_map 就会将地址转换成绝对地址,启动一个读或写的 sequence,并将读或写的结果返回。在每个reg_block 内部,至少有一个(通常也只有一个)uvm _reg_map。


2.只有一个寄存器的寄存器模型


 建立寄存器模型。首先要从uvm_reg 派生一个 invert类:

class reg_invert extends uvm_reg;
      'uvm_object_utils(reg_invert)
      rand uvm_reg_field reg_data;

virtual function void build();
    reg_data = uvm_reg_field::type_id::create("reg data");
    reg_data.configure(this,1,0,"Rw",1,0,1,1, 0);
endfunction

function new(input string name="reg invert");
      super.new(name, 16,UVM_NO_COVERAGE);
endfunction

在new 函数中,要将 invert寄存器的宽度作为参数传递给 super.new 函数。这里的宽度20 不是指这个寄存器的有效宽度,而是指这个寄存器中总共的位数。如对于一个16位的寄存器,其中可能只使用了8位,那么这里要填写的是 16,而不是 8。这个数字一般与系统线的度一致。super. new 中另外一个参数是是否要加人覆盖率的支持,这里选择 UVM_NO_COVERAGE,即不支持。


定义好此寄存器后,需要在一个由 reg_block 派生的类中将其实例化:

class reg_model extends uvm_reg_block;
     rand reg_invert invert;
  
 virtual function void build();
      default_map = create_map("default_map", 0, 2, UVM_BIG_ENDIAN, 0);
      
      invert =reg_invert::type_id::create("invert",,get_full_name());
      invert.configure(this, null, " "); 
      invert.build();
      default_map.add_reg(invert,'h9,"Rw");

endfunction
 
   'uvm object utils(reg_model)

function new(input string name="reg_model");
     super.new(name,UVM_NO_COVERAGE);
endfunction

一个uvm_reg_block中一定要对应一个uvm_reg_map,系统已经有一个声明好的default_map, 只需要在build 中将其实例化。这个实例化的过程并不是直接调用uvm_reg_map的new函数,而是通过调用 uvm _reg_ block 的 create _map 来实现,create_map 有众多的参数,其中第一个参数是名字,第二个参数是基地址,第三个参数则是系统总线的宽度,单位是 byte,第四个参数是大小端,最后一个参数表示是否能够按照byte寻址。

随后实例化 invert并调用 invet.conigure 函数。这个函数的主要功能是指定寄存器进行后门访问操作时的路径。其第一个参数是此寄存器所在uvm_reg_block 的指针,这里写 this,第二个参数是reg_file 的指针,第三个参数是此寄存器的后门访问路径。

当调用完 configure 时,需要手动调用 invert 的 build 函数,将 invert 中的域实例化。最后一步则是将此寄存器加人 default _map 中。

uvm_ reg_map 的作用是存储所有寄存器的地址,因此必须将实例化的寄存器加人 default_ map 中,否则无法进行前门访问操作add_reg 函数的第一个参数是要加人的寄存器,第二个参数是寄存器的地址,这里是 16"h9, 第三个参数是此寄存器的存取方式。

3.在验证平台中使用寄存器模型


当一个寄存器模型被建立好后,可以在 sequence 和其他component 中使用。以在参考原型中使用为例,需要在参考模型中有一个寄存器模型的指针:

class my_model extends uvm_component;
    reg_model p_rm;
endclass


在代码清单7-10 中已经为 env的 p_rm 赋值,因此只需要在 env 中将p_mm 传递给参考模型即可:
代码清单 7-12
文件: src/ch7/section7.2/my env.sv43 function void my env::connect phase (uvm phase phase);
mdl.p rm = this.p rm;51
对于寄存器,寄存器模型提供了两个基本的任务: read 和 write。若要在参考模型中读取寄存器,使用 read 任务

 p_rm.invert.read(status, value, UVM_FRONTDOOR);

第一个是 uvm_status_e 型的变量,一个输出,用于表明读操作是否成功;第二个是读取的数值,也是一个输出;第三个是取的方式,可选 UVM_FRONTDOOR 和UVM_BACKDOOR。 

write同上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值