UVM Primer - OOP基础 - 静态变量和方法

静态变量

virtual class animal;
   protected int age=-1;


   function new(int age);
      set_age(age);
   endfunction : new

   function void set_age(int a);
      age = a;
   endfunction : set_age

   function int get_age();
      if (age == -1)
        $fatal(1, "You didn't set the age.");
      else
        return age;
   endfunction : get_age

   pure virtual function void make_sound();

endclass : animal


class lion extends animal;

   protected string        name;

   function new(int age, string n);
      super.new(age);
      name = n;
   endfunction : new

   function void make_sound();
      $display ("%s says Roar", get_name());
   endfunction : make_sound

   function string get_name();
      return name;
   endfunction : get_name
   
endclass : lion
//我们只能有一个放狮子的笼子,所以我们不能在 lion 类里创建笼子变量。我们需要一个带静态变量的新类lion_cage 来装所有的狮子。
class lion_cage;

    static lion cage[$]; //lion_cage包含了一个 SystemVerilog 队列并定义为静态变量。这个队列用于存放lion对象
    //定义前的static关键字意味着我们不用例化这个类就可以访问这个变量。这个变量只有一份拷贝,程序一运行, 这个变量就得到了分配的空间。这样我们就可以任意访问这个狮笼了。
endclass : lion_cage

module top;

   initial begin
      lion   lion_h;
      lion_h  = new(2,  "Kimba");
      lion_cage::cage.push_back(lion_h);
//
这里我们创建了新的狮子,然后用静态变量把它们放进了笼子队列 。注意到“::”操作符。我们通过把::置于类名之后来访问lion_cage的变量。这告知了编译器我们在类的命名空间下访问静态变量

        //我们用lion_cage::cage 访问变量,用push_back()方法在队列里存放狮子

      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()方法来打印出狮子的名字
   end

endmodule : top

静态方法

注意line_cage类内的静态方法

virtual class animal;
   protected int age=-1;


   function new(int age);
      set_age(age);
   endfunction : new

   function void set_age(int a);
      age = a;
   endfunction : set_age

   function int get_age();
      if (age == -1)
        $fatal(1, "You didn't set the age.");
      else
        return age;
   endfunction : get_age

   pure virtual function void make_sound();

endclass : animal


class lion extends animal;

   protected string        name;

   function new(int age, string n);  //重载基类的new(),获取age和name
      super.new(age);
      name = n;
   endfunction : new

   function void make_sound();
      $display ("%s says Roar", get_name());
   endfunction : make_sound

   function string get_name();
      return name;
   endfunction : get_name
   
endclass : lion

class lion_cage;

   protected static lion cage[$];  //我们用了protected关键字来保护静态变量。这个关键字阻止了用户对我们的SystemVerilog队列的直接访问 ,保证了良好的重用。有任何直接访问笼子变量的行为,SystemVerilog编译器都会报错。

   static function void cage_lion(lion l);  //cage_lion()使用一个lion对象参数并将其放入SystemVerilog队列
      cage.push_back(l);
   endfunction : cage_lion

   static function void list_lions();   //lion_list()使用SystemVerilog的foreach循环来列出存放的狮子
      $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
//
这个代码里我们新建了狮子对象并用lion_cage::cage_lion() 方法将其放进笼子。然后我们用lion_cage::list_lions()列出了所有的狮子

//所有这些方法的调用都访问了一样的地址空间。我们可以在程序的任何地方用全局引用lion_cage类来访问狮笼

endmodule : top

猜你喜欢

转载自www.cnblogs.com/yiyedada/p/12366790.html