initialbegin cls = new(1); // 利用关键字new初始化 cls2 = new cls; // 浅复制,只会复制x的值 sv_class::get_pkt_ctr(); // static函数直接调用 end endmodule
浅复制不会复制类中的类(内部类),而是共享同一片存储空间
和interface类似,class也可以使用参数化设计
//---- class ---- class packet #(parameterint ADDR_WIDTH = 32,DATA_WIDTH = 32); bit [ADDR_WIDTH-1:0] address; bit [DATA_WIDTH-1:0] data ; functionnew(); address = 10; data = 20; endfunction endclass
继承与多态
在sv的class中,可以使用extends继承父类
class parent_class; bit [31:0] addr;
virtualfunctionvoid display(); $display("parent"); endfunction endclass class child_class extends parent_class; bit [31:0] data;
functionvoid display(); $display("child"); endfunction endclass module inheritence; initialbegin child_class c = new(); c.addr = 10; c.data = 20; $display("Value of addr = %0d data = %0d",c.addr,c.data);
parent_class p = c; p.display(); // 输出child end endmodule
权限控制:
public: 默认值,不需要写public,使用super关键字可以访问父类成员
local:只有自己可以访问,子类无法访问
protected: 只有自己和子类可以访问
抽象类
抽象类无法实例化,只能被继承
抽象类可以包含只有一个原型的函数(纯虚函数)
virtualclass BasePackt; int id; purevirtualfunctionint send(bit[31:0] data); endclass