vmm_xactor

vmm_xactor为我们构建所有的component提供了基类模板。generator,BFM,Driver,Monitor,scoreboard都是从vmm_xactor派生出来的。

1. 主要数据成员

  vmm_log  log;                  // transactor基类的消息接口
  int stream_id;                 // transactor基类的设备号
  vmm_notify notify;             // transacotr基类的事件控制器   

   此外,还有一些预先定义的事件,这些事件是从999990开始,但是小于1000000. 而vmm_atomic_gen 中的 GENERATED和 DONE事件的ID是0和1.所以我们扩展xactor时,自己定义的事件可以从0开始。 

因此new函数的参数如下,其中name和 instance用于创建vmm_log。

new(string name, string instance, int stream_id=-1);

对于Xactor的最终扩展基类,在扩展类的new函数中调用super.new("svidXactor","class"); 进行命名。  

2. 常用成员函数

virtual function void prepend_callback(vmm_xactor_callbacks cb);  
       //将某vmm_xactor_callbacks扩展类句柄前置压入callback队列。

virtual function void append_callback(vmm_xactor_callbacks cb);   
       //将某vmm_xactor_callbacks扩展类句柄后置压入callback队列。

virtual function void unregister_callback(vmm_xactor_callbacks cb);
       //将某vmm_xactor_callbacks扩展类句柄从callback队列中删除。

`vmm_callback(callback_class_name, method(args)));   
       // 等同于foreach (callbacks[i])  callbacks[i].function(args) 

定义vmm_xactor_callbacks的派生类,派生类中有两个函数一个是 pre_cycle, 一个是post_cycle, 这两个函数也许会改变transactor以及transaction。所以一般常带有如下参数

virtual task pre_cycle(xactor_class_name xactor,  data_class_name pkt, ref bit drop). 

virtual task post_cycle(xactor_class_name xactor,  data_class_name pkt, ref bit drop). 

 这些函数的参数都是句柄,因此可以直接改动实参的值。pre_cycle一般多用于error injection 和delay injection,而post_cycle一般多用于 delay injection, transation collection, result record for coverage, result compare.

在vmm_atomic_gen产生的generator有类似的callback类,不过函数固定了叫做post_inst_gen. 在放入channel前使用,用于error inject 和delay inject, 当然也可以进行 transaction copying to scoreboard的动作。 如果要和scoreboard连接,callback派生类中必须引入scoreboard成员,而callback的函数中会调用scoreboard的成员函数直接对某个transactor进行处理,而省却了channel的引入。 

protected virtual task main();        // 必须自己写的函数
  fork
     super.main();
  join_none
  ...
endtask

virtual function void start_xactor();

virtual function void stop_xactor();

virtual function void reset_xactor(reset_e rst_typ=SOFT_RST);

protected task wait_if_stopped_or_empty(vmm_channel chan);  

3. 扩展例子 

virtual function void reset_xactor(reset_e rst_typ=SOFT_RST);
       super.reset_xactor(rst_typ);
       this.in_chan.flush();
       this.sigs.mck.psel<= '0          // 将某些critical的ouput信号置为缺省值
endfunction
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值