yuanpin318的个人空间 https://blog.eetop.cn/13812 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

uvm callback

已有 992 次阅读| 2018-8-29 08:13 |个人分类:UVM|系统分类:芯片设计

象下面用继承+factory实现callback的方法,导致unmanageable explosion of driver class
class driver extends uvm_driver #(packet);
    `uvm_component_utils(driver)
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction: new

   task main_phase (uvm_phase phase);
       forever begin
          pre_send();
          xxx;
          send();
          xxx;
          post_send(); 
      end 
   endtask
    virtual task send(packet tr);
        ...
    endtask: send

    virtual task pre_send(packet tr);
        ...
    endtask: pre_send

    virtual task post_send(packet tr);
       ...
    endtask
endclass
class driver_error extends driver ...
class driver_delay extends driver ...
class driver_delay_error extends driver_error...

其实,uvm callbacks的机制更加灵活,不需要创建大量的OOP hierarchy
1. 在major operation前面/后面插入embeded callback method

class driver extends uvm_driver #(packet);
    `uvm_component_utils(driver)
    function new(string name, uvm_component parent);
        super.new(name, parent)
    endfunction: new

    `uvm_register_cb(driver, driver_callback);

    virtual task main_phase(uvm_phase phase)
        forever begin
              seq_item_port.get_next_item(req);
              ...
              `uvm_do_callbacks(driver, driver_callback, pre_send(this, req));
              send(req)
              `uvm_do_callbacks(driver, driver_callback, post_send(this, req));
         end
     endtask: main_phase
endclass

2. declare façade class
class driver_callback extends uvm_callback;
    function new(string name = "driver_callback");
         super.new(name);
    endfunction: new
virtual task pre_send(driver drv, packet tr); ... endtask
virtual task post_send(driver drv, packet tr); ... endtask     // driver: match types in `uvm_do_callbacks

3. Implement callback: Error
class driver_err_callback extends driver_callback;
    ...
   virtual task pre_send(driver drv, packet tr);
       ...
   endtask
endclass

4. create and register callback object in tests
class test extends test_base;
    driver_err_callback drv_err_cb;
    ...
    virtual function void connect_phase(uvm_phase phase);
        super.connect_phase(phase);
        drv_err_cb = new();
        uvm_callbacks#(driver, driver_callback)::add(env.agt.drv, drv_err_cb);
        uvm_callbacks#(driver, driver_callback)::display()      // visually verify the registeration (optional)
    endfunction: connect_phase
    ...
endclass

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 11

    粉丝
  • 2

    好友
  • 18

    获赞
  • 7

    评论
  • 3609

    访问数
关闭

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

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

GMT+8, 2024-5-8 14:47 , Processed in 0.013306 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部