SystemVerilog中的local、protected、public以及static。。。
SystemVerilog有着和其他oop语⾔⼀样的数据/⽅法的开放性控制特性,在以下做详细阐述:
对于公有性和私有性:
public: 默认为public,⼦类和类外皆可访问。
local:表⽰的成员或⽅法只对该类的对象可见,⼦类以及类外不可见。
protected: 表⽰的成员或⽅法对该类以及⼦类可见,对类外不可见。
对于静态与动态:
由于SystemVerilog刻画的是软件的世界,所以默认所有的变量为dynamic。⽽在Verilog中,所有变量默认的上static属性,因为Verilog 描绘的是硬件的世界,是实实在在的电路,电路不能动态构成。
static: 静态变量,此变量被这个类的所有实例所共享。
dynamic: 动态变量,⽆需声明,变量默认为动态变量。
静态变量和动态变量的区别
class Transaction;
static int count = 0;
int id;
function new();
id = count ++;
endfunction
endclass
Transation t1,t2;
initial begin
t1 = new(); //Frist instantiation,id=0,count=1
t2 = new(); //Second instantiation,id=1,count=2
$display("Second id=%d, cound = %d, t2.id, t2.count”);
end
在上述代码中,⽆论创建了多少个Transcation对象,静态变量count只有⼀个,可以认为count是保存在硬件域中的。⽽变量id是动态的,所以每个Transcation都有⾃⼰的id变量。
在实际设计中,使⽤ID域来跟踪对象是⼀个⾮常好的办法,SystemVerilog不能输出对象的地址,但可以创建ID域来区分对象。
通过类名访问静态变量
除了上述使⽤句柄来引⽤静态变量,还可以直接使⽤类名引⽤静态变量,只需在类名后加⼊:: ,即域的类作⽤域操作符。
class Transaction;
static int count = 0;
...
endclass
initial class
run_test();
$display("%d transation were created", Transcation::count);
end
节约内存为导向
static修饰的变量静态变量通常在声明时初始化,不能简单地在类的构造函数中初始化静态变量,因为每创建⼀个新的对象都会调⽤构造函数。总之在实际操作中,我们要保证在创建第⼀个对象之前就已经初始化了静态变量。
静态变量的设置是以优化内存为导向的,如下⾯的代码,如果不设置静态句柄,那么每次例化Transaction都会分配⼀次cfg的空间,没有必要。
class Transaction;
static Config cfg;
MODE_E mode;
function new();
mode = de;
endfunction
endclass
Config cfg;
initial begin
cfg = new(MODE_ON);
Transcation::cfg = cfg;
....
end
SystemVerilog不允许静态⽅法读取⾮静态变量,下⾯代码⽰例了静态⽅法的调⽤。class Transationl
static Config cfg;
static int count = 0;
int id;
//显⽰静态变量的静态⽅法
static function void display_statics();
$dislplay("de = %s, count = %0d",de.name(),count);
endfunction
endclass
Config cfg;
initial begin
cfg = new(MODE_ON);
Transaction::cfg = cfg;
Transaction::display_statics(); //调⽤静态⽅法
end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论