纯虚类(virtual class)和纯虚方法(pure virtual function)

具体内容参加绿皮书,
virtual method

class Transaction;
   rand bit[31:0] src,dst,data[8];
   bit[31:0]crc;
   virtual function void calc_crc();
       crc=src^dst^data.xor;
   endfunction
endclass :Transaction    
   
class BadTr extends Transaction;
  rand bit bad_crc;
  virtual function void calc_crc();
      super.calc_crc();
      if(bad_crc) crc = ~crc;
  endfunction
endclass;BadTr

使用不同类型句柄的一个代码块

Transaction tr;
BadTr       bad;

initial begin
   tr = new();
   tr.calc_crc(); //调用Transaction::calc_crc
   
   bad = new();
   bad.calc_crc();   //调用BadTr::calc_crc
   
   tr = bad;          //基类句柄指向扩展类
   tr.calc_crc();     //调用BadTr::calc_crc
end

这里由于calc_crc定义为了virtual,所以最后一步tr.calc_crc(); 会根据对象类型调用BadTr::calc_crc,而非句柄类型调用Transaction::calc_crc。
如果没有定义为virtual calc_crc,会根据句柄类型调用Transaction::calc_crc。

BaseTr 是一个virtual class, 可被声明,可以被extend, 但是不能被实例化。
可以定义 function, virtual function,pure virtual function

pure virtual function 是只有定义,没有实体的方法,只可以在virtual class中定义。

virtual class BaseTr;
   static int count;
   int id;

   function new();
     id=count++;
   endfunction
   
   pure virtual function bit compare(input BaseTr to);
   pure virtual function BaseTr copy(input BaseTr to=null);
   pure virtual function void display(input string prefix=""); 
 endclass: BaseTr
     
BaseTr   BT; // 正确可以执行
BT = new(); //会报错。

pure virtual function 只有在扩展类中定义了实体,才可以使用

class Transaction extends BaseTr;
   rand bit[31:0] src, dst,crc, data[8];
  
   external virtual function bit compare(input BaseTr to);
   external virtual function BaseTr copy(input BaseTr to=null);
   external virtual function void copy_data(input Transaction copy);
   external virtual function void display(input string prefix="");
   external function new();
 endclass
 //下面是方法实体
 function bit Transaction ::compare(input BaseTr to);  
     Transaction tr;
     assert($cast(tr,to));
     return ( (this.src == tr.src) &&
              (this.dst == tr.dst) &&
              (this.crc == tr.crc) &&
              (this.data == tr.data));  
            );
 endfunction: compare

 function BaseTr Transaction ::copy(input BaseTr to=null); 
     Transaction cp;
     if(to ==null) cp =new();
     else          $cast(cp,to);
     copy_data(cp);
     return cp;
 endfunction

 function BaseTr Transaction ::copy_data(Transaction copy); 
    copy.src = src;
    copy.dst = dst;
    copy.data = data;
    copy.crc = crc;
 endfunction
 
 function void Transaction ::display(string prefix=""); 
    $display("%s Transaction %0d src =%h, dst = %%x, crc= %x ",prefix,id,src,dst,crc);
 endfunction
 
 function void Transaction ::new(); 
    super.new();
 endfunction
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值