• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

UVM中uvm_config_db在sequence中的使用

在UVM中使用get_full_name()可以得到一个component的完整路径,同样的,此函数也可以在一个sequence中被调用,尝试在一个sequence的body中调用此函数,并打印出返回值,其结果大体如下:
uvm_test_top.env.i_agt.sqr.case0_sequence
这个路径是由两个部分组成,此sequence的sequencer的路径,即实例化此sequence时传递的名字。

在sequence中get参数

//my_case0.sv

function void my_case0::build_phase(uvm_phase phase);
...
  uvm_config_db#(int)::set(this, "env.i_agt.sqr.*", "count", 9);
...
endfunction

set函数的第二个路径参数里面出现了通配符,这是因为sequence在实例化名字一般是不固定的,而且有时是未知的,所以使用通配符。

在sequence中以如下方式调用config_db::get函数。
//my_case0.sv

class case0_sequence extends uvm_sequence#(my_transaction);
...
  virtual task per_body();
    if(uvm_config_db#(int)::get(null, get_full_name(), "count", count)
      `uvm_info("seq0", $sformatf("get count value %0d via config_db", count), UVM_MEDIUM)
    else
      `uvm_error("seq0", "cannot get count value!")
  endtask
...
endclass

在get函数原型中,第一个参数必须是一个component,而sequence不是一个component,所以这里不能使用this指针,只能使用null或uvm_root::get()。前面已经提到过,当使用null是,UVM会自动将其替换为uvm_root:get(),再加上第二个参数get_full_name(), 就可以完整地得到此sequence的路径,从而得到参数。

在sequence中set参数

//my_case0.sv

class drv0_seq extends uvm_sequnece #(my_transaction);
...
  virtual task body();
    void'(uvm_config_db#(bit)::get(uvm_root::get(), get_full_name(), "first_start", first_start));
    if(first_start)
      `uvm_info("drv0_seq", "this is the first start of the sequence", UVM_MEDIUM)
    else
      `uvm_info("drv0_seq", "this is not the first start of the sequence", UVM_MEDIUM)
    uvm_config_db#(bit)::set(uvm_root::get(), "uvm_test_top.v_sqr.*", "first_start", 0);
  endtask...
endclass

需要注意的是,由于此sequence在virtual sequence中被启动,所以其get_full_name的结果应该是uvm_test_top.v_seq.,而不是uvm_test_top.env0.i_agt.sqr.,所以在设置时,第二个参数应该是前者。

还有其他用法
uvm_test中:
uvm_config_db#(bit)::set(null, "*", "first_start", 0);
sequence中:
uvm_config_db#(bit)::get(m_sequencer, "", "first_start", first_start);

posted on 2022-06-26 17:20  SOC验证工程师  阅读(938)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3