- class basic_test;
- function new();
- ……
- endfunction
- task test(); //virtual task test();
- $display("basic_test::test");
- endtask
- endclass
- class test_wr extends basic_test;
- function new();
- ……
- endfunction
- task test();
- super.test();
- $display("test_wr:test");
- endtask
- endclass
- basic_test t;
- test_wr wr;
- initial begin
- wr=new();
- t=wr;
- wr.test(); //basic_test::test //basic_test::test
- //test_wr::test //test_wr::test
- t.test(); //basic_test::test //basic_test::test
- end //test_wr::test
- Packet p1;
- p1 = new ; //new可以有参数,不能有返回值,不能带 virtual
- Packet p1;
- Packet p2;
- p1 = new; //p1=new();
- p2 = new pl; //p2=new()p1; //p1、p2指向各自对象,p1=p2则只有一个对象
- //新创建一个对象,把原有对象里的变量拷贝到新对象
- //句柄拷贝,p1和p2指向同一对象
区别句柄拷贝与对象拷贝的区别
- class basic_test;
- ……
- virtual function void copy_data(basic_test t);
- t.def=def;
- t.fin=fin;
- endfunction
- virtual function basic_test copy();
- basic_test t=new(0);
- copy_data(t);
- return t;
- endfunction
- endclass
-
- class test_wr extends basic_test;
- ……
- function void copy_data(basic_test t);
- test_wr h;
- super.copy_data(t); //super,所以会调用父类方法,直接执行 父类句柄到父类的copy_data
- $cast(h,t); //父类句柄指向子类对象,要添加这个是因为让h也指向子类对象吗?
- h.def=def; //实现子类句柄只拷贝子类成员
- endfunction
- function basic_test copy(); //函数返回类型为basic_test
- test_wr t=new();
- copy_data(t); //调用该函数会隐式地将子类句柄转为父类句柄,但依然指向子类对象
- return t;
- endfunction
- endclass
-
- module tb;
- ……
- test_wr wr;
- test_wr h;
- initial begin
- wr=new();
- $cast(h,wr.copy()); //h和wr指向不同对象
- h.def=300;
- end
- endmodule
- virtual class Driver_cbs; //Driver回调虚类 不能例化,可以继承,虚类是提供模板
- virtual task pre_tx(ref Transaction tr,ref bit drop);//两个ref,怎么第一个就是输入第二输出
- ……
- endtask
- virtual task post_tx(ref Transaction tr);
- ……
- endtask
- endclass
-
- class Driver;
- Driver_cbs cbs[$]; //队列,里面放着句柄
- task run();
- endclass
-
- //回调函数主要有三步
- //第一预留入口
- task Driver::run;
- forever begin
- ……
-
- transmit(tr);
-
- ……
- end
- endtask
- //第二步,定义回调类
- class Driver_cbs_drop extends Driver_cbs; //继承自虚类
- virtual task pre_tx(ref Trsansaction tr,ref bit drop);
- drop=($urandom(0,99)==0);
- endtask
- endclass
- //第三步,例化以及添加回调类的实例
- program automatic test;
- ……
- begin
- Driver_cbs_drop dcd=new();
- env.drv.cbs.push_back(dcd);
- end
- env.run;
- ……
- endprogram
- //该maibox只能用于操作整数类 类定义时添加参数
- class mailbox; //class maibox #(type T=int); //参数名为T,值为int
- local int queue[$]; // local T queue[$];
- task put(input int i); //task put(input T i);
- queue.push_back(i);
- endtask
- task get(ref int o); //task get(ref T o);
- wait(queue.size()>0);
- o=queue.pop_front();
- endtask
- task peek(ref int o); //task peek(ref T o);
- wait(queue.size()>0);
- o=queue[0];
- endtask
- endclass
-
-
-
- //maibox #(real) mb; //创建一个存储real类型的maibox
- //mb=new();