在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: oscillator_cn1

[求助] 求助:UVM中peek与poke的问题

[复制链接]
发表于 2013-7-24 10:41:15 | 显示全部楼层



在uvm1.1c的库文件中,uvm_mem.svh的1434行起 有下面的这段代码,想请问,这里面的rw.path就是所谓的hdl_path了,是如何传递进来,以及和offset进行绑定的呢?
谢谢

task uvm_mem::write(output uvm_status_e      status,
                    input  uvm_reg_addr_t    offset,
                    input  uvm_reg_data_t    value,
                    input  uvm_path_e        path = UVM_DEFAULT_PATH,
                    input  uvm_reg_map       map = null,
                    input  uvm_sequence_base parent = null,
                    input  int               prior = -1,
                    input  uvm_object        extension = null,
                    input  string            fname = "",
                    input  int               lineno = 0);
   // create an abstract transaction for this operation
   uvm_reg_item rw = uvm_reg_item::type_id::create("mem_write",,get_full_name());
   rw.element      = this;
   rw.element_kind = UVM_MEM;
   rw.kind         = UVM_WRITE;
   rw.offset       = offset;
   rw.value[0]     = value;
   rw.path         = path;
   rw.map          = map;
   rw.parent       = parent;
   rw.prior        = prior;
   rw.extension    = extension;
   rw.fname        = fname;
   rw.lineno       = lineno;
   do_write(rw);
   status = rw.status;
endtask: write
 楼主| 发表于 2013-7-24 13:05:43 | 显示全部楼层
应该就是的。不大明白你说的跟offset进行绑定是什么意思,反正当时我使用register model的时候,需要用configure函数对其指定hdl_path



  1.     virtual function void build_phase(uvm_phase phase);
  2.         super.build_phase(phase);
  3.         demo_cfg = demo_config::type_id::create("demo_cfg");
  4.         vdo_cfg  = config1::type_id::create("vdo_cfg");
  5.         uvm_config_object::set(this,"apb0*","cfg",demo_cfg);
  6.         uvm_config_object::set(this,"apb0.slave[0]*","cfg",demo_cfg.slave_configs[0]);
  7.         uvm_config_object::set(this,"vdo0*","cfg",vdo_cfg);
  8.         uvm_config_object::set(this,"vdo0.slave[0]","cfg",vdo_cfg.slave_configs[0]);
  9.         apb0=apb_env::type_id::create("apb0",this);
  10.         vdo0=vdo_env::type_id::create("vdo0",this);

  11.         regmodel=ral_block_apb_basic_block::type_id::create("regmodel",,get_full_name());
  12.         regmodel.configure(null,"top.u_dut.apb_slave");
  13.         regmodel.build();
  14.         regmodel.lock_model();
  15.         regmodel.reset();
  16.         reg_sqr_adapter=reg_to_apb_adapter::type_id::create("reg_sqr_adapter",,get_full_name());
  17.         mon_sqr_adapter=reg_to_apb_adapter::type_id::create("mon_sqr_adapter",,get_full_name());
  18.         reg_predictor=new("reg_predictor",this);

  19.     endfunction : build_phase



复制代码
好像我用的configure中省掉了一些参数,我记得这个东西很长的参数列表。
这个regmodel是个ram,而它的地址的指定,是在为其建立模型的时候:



  1. class ral_mem_MY_RAM extends uvm_mem;
  2.    //function new(string name = "MY_RAM");
  3.     function new(string name = "n_ram");
  4.       super.new(name, `UVM_REG_ADDR_WIDTH'h400, 32, "RW", build_coverage(UVM_NO_COVERAGE));
  5.    endfunction
  6.    virtual function void build();
  7.    endfunction: build

  8.    `uvm_object_utils(ral_mem_MY_RAM)

  9. endclass : ral_mem_MY_RAM



复制代码
好像是new函数中需要指定(好像是大小),然后将其映射到default_map上去的时候要指定起始地址?时间太久我不大记得了。



  1. class ral_block_apb_basic_block extends uvm_reg_block;
  2.         //rand ral_mem_MY_RAM MY_RAM;
  3.     rand ral_mem_MY_RAM n_ram;

  4.         function new(string name = "apb_slave");
  5.                 super.new(name, build_coverage(UVM_NO_COVERAGE));
  6.         endfunction: new

  7.    virtual function void build();
  8.       this.default_map = create_map("", 0, 4, UVM_LITTLE_ENDIAN);
  9.       //this.MY_RAM = ral_mem_MY_RAM::type_id::create("MY_RAM");
  10.       //this.MY_RAM.build();
  11.       //this.MY_RAM.configure(this, "");
  12.       //this.default_map.add_mem(this.MY_RAM, `UVM_REG_ADDR_WIDTH'h0, "RW", 0);
  13.       this.n_ram = ral_mem_MY_RAM::type_id::create("n_ram");
  14.       this.n_ram.build();
  15.       this.n_ram.configure(this,"n_ram.mem");
  16.       this.default_map.add_mem(this.n_ram,`UVM_REG_ADDR_WIDTH'h0,"RW",0);
  17.       //add_hdl_path("dut","apb_slave");
  18.    endfunction : build
  19.    function display();
  20.       $display({"***************now is ",get_full_name()});
  21.    endfunction : display

  22.         `uvm_object_utils(ral_block_apb_basic_block)

  23. endclass : ral_block_apb_basic_block



复制代码
发表于 2013-8-13 20:43:42 | 显示全部楼层


各位:
     正在学习UVM中对register model的backdoor访问。使用peek的时候有点问题,想不出到底为什么, ...
oscillator_cn1 发表于 2012-8-13 18:36




楼主看了你上面的代码还有一个问题,你在config里指明了 HDL 路径

但是在peek/poke 中有一个地方是判断是否使用backdoor访问的,uvm_mem.svh中的源码 如下

task uvm_mem::peek(output uvm_status_e      status,
                   input  uvm_reg_addr_t    offset,
                   output uvm_reg_data_t    value,
                   input  string            kind = "",
                   input  uvm_sequence_base parent = null,
                   input  uvm_object        extension = null,
                   input  string            fname = "",
                   input  int               lineno = 0);

   uvm_reg_backdoor bkdr = get_backdoor();
   uvm_reg_item rw;
   m_fname = fname;
   m_lineno = lineno;

   if (bkdr == null && !has_hdl_path(kind)) begin
      `uvm_error("RegModel", {"No backdoor access available in memory '",
                 get_full_name(),"'"})
      status = UVM_NOT_OK;
      return;
   end

这里面的bkdr = get_backdoor 该怎样保证不为 null ?  谢谢
发表于 2013-8-13 21:10:58 | 显示全部楼层
回复 12# oscillator_cn1


    楼主,看了你的这段代码,有个问题不理解,调用uvm_peek函数时, 下面的这个如何设置get_backdoor

task uvm_mem::peek(output uvm_status_e      status,
                   input  uvm_reg_addr_t    offset,
                   output uvm_reg_data_t    value,
                   input  string            kind = "",
                   input  uvm_sequence_base parent = null,
                   input  uvm_object        extension = null,
                   input  string            fname = "",
                   input  int               lineno = 0);

   uvm_reg_backdoor bkdr = get_backdoor();

   uvm_reg_item rw;
   m_fname = fname;
   m_lineno = lineno;
   if (bkdr == null && !has_hdl_path(kind)) begin
      `uvm_error("RegModel", {"No backdoor access available in memory '",
                 get_full_name(),"'"})
      status = UVM_NOT_OK;
      return;
   end

怎么设置get_backdoor才能够让  bkdr != null ?

谢谢
发表于 2013-8-13 21:11:08 | 显示全部楼层
回复 12# oscillator_cn1


    楼主,看了你的这段代码,有个问题不理解,调用uvm_peek函数时, 下面的这个如何设置get_backdoor

task uvm_mem::peek(output uvm_status_e      status,
                   input  uvm_reg_addr_t    offset,
                   output uvm_reg_data_t    value,
                   input  string            kind = "",
                   input  uvm_sequence_base parent = null,
                   input  uvm_object        extension = null,
                   input  string            fname = "",
                   input  int               lineno = 0);

   uvm_reg_backdoor bkdr = get_backdoor();

   uvm_reg_item rw;
   m_fname = fname;
   m_lineno = lineno;
   if (bkdr == null && !has_hdl_path(kind)) begin
      `uvm_error("RegModel", {"No backdoor access available in memory '",
                 get_full_name(),"'"})
      status = UVM_NOT_OK;
      return;
   end

怎么设置get_backdoor才能够让  bkdr != null ?

谢谢
发表于 2013-8-13 21:11:18 | 显示全部楼层
回复 12# oscillator_cn1


    楼主,看了你的这段代码,有个问题不理解,调用uvm_peek函数时, 下面的这个如何设置get_backdoor

task uvm_mem::peek(output uvm_status_e      status,
                   input  uvm_reg_addr_t    offset,
                   output uvm_reg_data_t    value,
                   input  string            kind = "",
                   input  uvm_sequence_base parent = null,
                   input  uvm_object        extension = null,
                   input  string            fname = "",
                   input  int               lineno = 0);

   uvm_reg_backdoor bkdr = get_backdoor();

   uvm_reg_item rw;
   m_fname = fname;
   m_lineno = lineno;
   if (bkdr == null && !has_hdl_path(kind)) begin
      `uvm_error("RegModel", {"No backdoor access available in memory '",
                 get_full_name(),"'"})
      status = UVM_NOT_OK;
      return;
   end

怎么设置get_backdoor才能够让  bkdr != null ?

谢谢
 楼主| 发表于 2013-8-15 10:03:25 | 显示全部楼层
回复 13# huobaihua

我觉得应该是确保你设定的hdl_path是正确的,畅通的。
因为get_backdoor是'get the user-defined backdoor for all registers in this block'
如果你定义的backdoor路径是错误的,或者没有指定backdoor路径,那么,肯定返回的是null值。
我是这样理解的,不知道你有什么想法呢?
发表于 2018-11-28 09:59:46 | 显示全部楼层
所以问题是出在hdl_path没有设置对?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-15 03:04 , Processed in 0.021542 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表