UVM中的factory机制

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_
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值