SystemVerilog对重载的支持
1.
SystemVerilog是一种面向对象的语言。面向对象语言都有一大特征:重载。当在父类中定义一个函数/任务时,如果将其设置为virtual类型,那么就可以在子类中重载这个函数/任务:
class bird extends uvm_object;
virtual function void hungry();
$display("I am a bird, I am hungry");
endfunction
function void hungry2();
$display("I am a bird, I am hungry2");
endfunction
endclass
class parrot extends bird;
virtual function void hungry();
$display("I am a parrot, I am hungry");
endfunction
function void hungry2();
$display("I am a parrot, I am hungry2");
endfunction
endclass
重载的最大优势是使得一个子类的指针以父类的类型传递时,其表现出的行为依然是子类的行为:
function void my_case0::print_hungry(bird b_ptr);
b_ptr.hungry();
b_ptr.hungry2();
endfunction
function void my_case0::build_phase(uvm_phase phase);
bird bird_inst;
parrot parrot_inst;
super.build_phase(phase);
bird_inst = bird::type_id::create("bird_inst");
parrot_inst = parrot::type_id::create("parrot_inst");
print_hungry(bird_inst);
print_hungry(parrot_inst);
endfunction
这里打印结果分别为:
"I am a bird, I am hungry"
"I am a bird, I am hungry2"
和
"I am a parrot, I am hungry"
"I am a bird, I am hungry2"
2.
UVM支持对约束的重载。
首先定义my_transaction。
class my_transaction extends uvm_sequence_item;
constraint crc_err_cons{
crc_err == 1'b0;
}
constraint sfd_err_cons{
sfd_err == 1'b0;
}
constraint pre_err_cons{
pre_err == 1'b0;
}
endclass
然后在此基础上派生一个新的transaction。
class new_transaction extends my_transaction;
`uvm_object_utils(new_transaction)
function new(string name= "new_transaction");
super.new(name);
endfunction
constraint crc_err_cons{
crc_err dist {0 := 2, 1 := 1};
}
endclass
在这个新的transaction中将crc_err_cons
重载了。因此,在异常的测试用例中,可以使用如下的方式随机化:
virtual task body();
new_transaction ntr;
repeat (10) begin
`uvm_do(ntr)
ntr.print();
end
endtask
使用factory机制进行重载
1.
factory机制最伟大的地方在于其具有重载功能。面向对象语言基本都支持对函数/任务的重载,此外,SystemVerilog还额外支持对约束的重载。但factory机制的重载与这些重载都不一样。
function void my_