uvm_primer static方法和变量 ch7
ch7 static方法和变量
ch7.1不要使用全局变量
小白刚开始写代码 时会觉得全局变量比较好用,不管在哪都能访问;
但是项目变大后,调试起来就是噩梦,如果这个变量不对了,要去track哪里修改的,写错了,比较麻烦;因为他在哪里都能访问,比如100个地方对这个变量复制了,就要去逐一排查;
ch7.2静态变量
但是全局变量哪都能访问还是有一定优势,所以要一个受控的全局变量;
static变量就相当于一个受控的全局变量
static含义
- static变量在程序刚运行的时候就分配了内存,如果没有static ,则变量在new()构造之后才分配内存
- static的成员在程序中只有一个内存空间,不管把这个类例化了多少个对象,这些对象的该static成员变量共享一个内存;
- static的数据成员不用new,即可直接使用;
- static的数据成员和方法在任何地方都可以访问,这个类似全局变量,但是一般要把数据成员protected,使用开放的方法来间接访问
class lion_cage;
static lion cage[$]; //static 变量cage,是一个队列,队列中的每个成员只能是lion类型的对象;
endclass : lion_cag
module top;
initial begin
lion lion_h;
lion_h = new(2, "Kimba");
lion_cage::cage.push_back(lion_h); //队列的方法
lion_h = new(3, "Simba");
lion_cage::cage.push_back(lion_h);
lion_h = new(15, "Mustafa");
lion_cage::cage.push_back(lion_h);
$display("Lions in cage");
foreach (lion_cage::cage[i])
$display(lion_cage::cage[i].get_name()); //get_name() 是lion这个class的方法;
end
endmodule : to
ch7.2.1两种访问方法的途径
- 类访问
::不需要实例化该类;
lion_cage::cage.push_back(lion_h); - 对象访问
lion_cage lion_cage_h;
lion_cage_h = new();
lion_cage.cage.push_back(lion_h);
ch7.2.2queue队列
.push_back 是队列的方法
ch7.3静态方法
上个代码直接把cage这个静态变量开放给外部访问;这个就有点类似全局变量了,这个是坏习惯;
应该将静态变量保护起来,protected ,然后给外部开放function访问,
class lion_cage;
protected static lion cage[$]; //限制访问范围
static function void cage_lion(lion l); //供外部调用,来修改cage,不能让外部直接修改
cage.push_back(l);
endfunction : cage_lion
static function void list_lions();
$display("Lions in cage");
foreach (cage[i])
$display(cage[i].get_name());
endfunction : list_lions
endclass : lion_cage
module top;
initial begin
lion lion_h;
lion_h = new(2, "Kimba");
lion_cage::cage_lion(lion_h);
lion_h = new(3, "Simba");
lion_cage::cage_lion(lion_h);
lion_h = new(15, "Mustafa");
lion_cage::cage_lion(lion_h);
lion_cage::list_lions();
end
endmodule : top
ch7.3.1变量作用范围限定
- local:表示的成员或方法只对该类的对象可见,子类以及类外不可见。
- protected: 表示的成员或方法对该类以及子类可见,对类外不可见。
- 默认 public: 默认为public,子类和类外皆可访问。
ch7.4summary
- static 变量
- static方法 ,需要把类中变量保护起来,提供函数来间接访问变量
- protected 变量供该类及子类访问 类外不可见