zoukankan      html  css  js  c++  java
  • 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更新寄存器模型的一种方式

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

  • 相关阅读:
    事务的手动创建和提交
    计数器AtomicInteger
    多线程方法执行等待
    【javascript动画系列之网页白板】javascript实现的白板(兼容ff,ie,chrome,……)
    ie6,7下js动态加载图片不显示错误
    php中遇到include_path='.;C:\php5\pear'的错误
    linux下php扩展curl的安装
    【转】Linux操作系统文件系统基础知识详解
    【javascript动画之圆形运动】环绕鼠标运动作小球(兼容ie,ff,chrome,……)
    as(ActionScript)拖动实现
  • 原文地址:https://www.cnblogs.com/-9-8/p/4465746.html
Copyright © 2011-2022 走看看