The UVM Primer -- Chpater 22 UVM Agent

Chpater 22 UVM Agent

  • 将测试平台不断模块化是一件美妙的事情,无论我们使用它来封装硬件中的块,固件中的子程序还是软件中的对象,模块化都会隐藏复杂性并改善生活。 模块化还允许我们将经过测试的功能重用为硬件中的IP,固件中的库和软件中的类库。
  • 成功模块化的关键是支持严格且不变的接口。定义接口允许用户(以及未来的自我)自信地使用模块化组件,而不必担心其内部工作。
  • UVM 提供了Agent, configuration objects,configuration database实现UVM的模块化。Agent允许我们封装相似的对象,cfg object允许我们存储agent需要的信息,cfg databas允许我们传递配置信息到同类型的不同Agent。

22.1 模块化前后的测试平台

  • 模块化前的测试平台如下所示:
    在这里插入图片描述
    测试品台需要产生激励,检查结果,监测覆盖率。但是这些功能都是分开的一个个碎片,如果我们的设计中使用大量的TinyALU,我们需要拷贝所有的对象,port来实现重用。
  • 模块化后的测试平台如下所示:
    在这里插入图片描述
    我们使用和此前一致的objects,并使用uvm_component类型的组件uvm_agent来封装这些组件。各组件间的连接方式不变。
    此外,我们在uvm_agent顶层声明了两个analysis port,这样我们可以在更高的层次中看到uvm_agent中传输的数据,但是scoreboard和coverage不做任何改变。
    虚线中的模块包括tester, command_f, driver对象,只有在初始化时希望产生激励是才激活,否则uvm_agent中不包括这三个模块,但我们仍可以使用agent的其他组件监控TinyALU。

22.2 创建TinyALU Agent

  • TinyALU看来和env十分类似,他们之间的区别是uvm agent引入configuration机制来传输BFM,并且可以决定agent中是否包含stimulus
  • TynyALU Agent中包含了此前测试平台中所有的组件和FIFO,并且定义了agent定测接口的两个analysis port。
class tinyalu_agent extends uvm_agent;         //扩展自uvm_agent,属于umv_component
   `uvm_component_utils(tinyalu_agent)         //注册到factory

   tinyalu_agent_config tinyalu_agent_config_h;//声明agent_cfg类型对象 tinyalu_agent_config

   tester          tester_h;
   driver          driver_h;
   scoreboard      scoreboard_h;
   coverage        coverage_h;
   command_monitor command_monitor_h;
   result_monitor  result_monitor_h;

   uvm_tlm_fifo      #(command_transaction) command_f;
   uvm_analysis_port #(command_transaction) cmd_mon_ap;
   uvm_analysis_port #(result_transaction) result_ap;

   function new (string name, uvm_component parent);
      super.new(name,parent);
   endfunction : new  
   
   function void build_phase(uvm_phase phase);               //在build phase例化需要的所有对象
   
      if(!uvm_config_db #(tinyalu_agent_config)::get(this, "","config",tinyalu_agent_config_h))
       `uvm_fatal("AGENT", "Failed to get config object");   //传入cfg文件,而不是BMF 
      is_active = tinyalu_agent_config_h.get_is_active();    //查看config中的配置,是否激活stiumiulus模块
   
      if (get_is_active() == UVM_ACTIVE) begin : make_stimulus  //get_is_active返回两种枚举类型:UVM_ACTIVE or UVM_PASSIVE,默认是UVM_ACTIVE
         command_f = new("command_f", this);                    //如果激活UVM_ACTIVE,则需要构建stimulus模块的对象
         tester_h    = tester::type_id::create( "tester_h",this);
         driver_h    = driver::type_id::create("driver_h",this
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值