参数化的类——可以用来处理多种数据类型,类似于“模板”
一、一个简单的堆栈
使用整数的堆栈
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
二、关于参数化的建议
- 在建立参数化类的时候,应该从非参数化类开始,仔细地调试,然后增加参数。
- 宏是参数化类的一种替代形式。
- 事务类中的通用虚方法集可以帮助你创建参数化类。
---------------------
作者:煎丶包
来源:CSDN
原文:https://blog.csdn.net/qq_39794062/article/details/113429812
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件