《SystemVerilog验证测试平台编写指南》学习笔记——参数化的类

参数化的类——可以用来处理多种数据类型,类似于“模板

一、一个简单的堆栈

使用整数的堆栈

class IntStack;
	local int stack[100];		//保存数据值
	local int top;

	function void push(input int i);		//从顶端压栈
		stack[++top] = i;
	endfunction : push

	function int pop();		//从顶端出栈
		return stack[top--];
	endfunction
endclass

在SV中可以为类增加一个数据类型参数,并在声明类句柄的时候指定类型,类似于C++中的模板。

参数化的堆栈类

class Stack # (type T = int);
	local T stack[100];		//保存数据值
	local int top;

	function void push(input T i);		//从顶端压栈
		stack[++top] = i;
	endfunction : push

	function T pop();		//从顶端出栈
		return stack[top--];
	endfunction
endclass

使用参数化的堆栈类

initial begin
	Stack # (real) rStack;		//创建一个用于实数类型的堆栈

	rStack = new();
	for(int i = 0; i < 5; i++)
		rStack.push(i * 2.0);
		
	for(int i = 0; i < 5; i++)
		$display("%f", rStack.pop());
end

原子发生器是类被参数化的很好地例子,一旦定义了一个发生器类,那么该类的结构对任何数据类型都有效。

使用蓝图模式的参数化的发生器类

class Generator # (type T = BaseTr);
	mailbox gen2drv;
	T blueprint;		//蓝图对象

	function new(input mailbox gen2drv);
		this.gen2drv = gen2drv;
		blueprint = new();		//创建默认类型的对象
	endfunction

	task run();
		T tr;
		forever begin
			assert(blueprint.randomize);		//对象随机化
			tr = blueprint.copy();				//复制
			gen2drv.put(tr);					//送给驱动器
		end
	endtask
endclass

使用参数化发生器类的简单测试平台

program automatic test;
	initial begin
		Generator # (Transaction) gen;
		mailbox gen2drv;
		gen2drv = new(1);
		gen = new(gen2drv);

		fork
			gen.run();
			repeat(5) begin
				Transaction tr;
				gen2drv.peek(tr);		//获取下一个事务
				tr.display();
				gen2drv.get(tr);		//删除事务
			end
		join_any
	end
endprogram

二、关于参数化的建议

  • 在建立参数化类的时候,应该从非参数化类开始,仔细地调试,然后增加参数。
  • 宏是参数化类的一种替代形式。
  • 事务类中的通用虚方法集可以帮助你创建参数化类。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值