目录
1. 基本概念
以下的这些基本概念其实是面向对象编程的基本术语。
类(class):包含变量和子程序的基本构建块。
对象(object):类的实例
句柄(handle):指向对象的指针。一个句柄可以指向很多对象。
属性(property):存储数据的变量
方法(method):任务或者函数中操作的程序性代码
原型(prototype):程序的头,包括程序名、返回类型和参数列表
可参考:
2.this指针
this指针的概念在c++里面也有。
在面向对象语言中,this经常用来表示对当前对象的一个引用,可以理解为指向对象本身的一个指针,并且常作为类中方法的隐含形参,通过该形参可以访问对象内部的属性和方法
可参考 SystemVerilog中这个this到底怎么回事
3.$cast
$cast可以对不同的内建类型进行转换,用的更多的是不同层次之间类的转换。也就是在父类与子类之间的转换。
可以参考
下面给出一种使用cast的场景:
在sequence中交替发送my_transaction和your_transaction。在sequencer和driver中设置能够接受的数据类型为uvm_sequence_item。
class case0_sequence extends uvm_sequence;
my_transaction m_trans;
your_transaction y_trans;
virtual task body();
repeat (10) begin
`uvm_do(m_trans);
`uvm_do(y_trans);
end
endtask
`uvm_object_utils(case0_sequence)
endclass
这样带来的问题是,由于driver中接收的数据类型是uvm_sequence_item,如果它要使用my_transaction或者your_transaction中的成员变量,就必须使用cast转换:
task my_driver::main_phase(uvm_phase phase);
my_transaction m_tr;
your_transaction y_tr;
while(1) begin
seq_item_port.get_next_item(req);
if ($cast(m_tr, req)) begin
drive_my_transaction(m_tr);
`uvm_info("drive", "receive a transaction whose type is my_transaction", UVM_NONE);
end
else if ($cast(y_tr, req)) begin
drive_your_transaction(y_tr);
`uvm_info("drive", "receive a transaction whose type is your_transaction", UVM_NONE);
end
else begin
`uvm_error("drive", "receive a transaction whose type is unknown");
end
seq_item_port.item_done();
end
endtask