参数化、静态、抽象与接口类背景根据绿皮书第5章和第8章内容总结扩展核心内容参数化类静态变量和静态方法纯虚方法我的理解参数化类Parameterized Class和模块类似类可以带参数实现编译时的静态多态。class Register #(parameter WIDTH 1); bit [WIDTH-1:0] data; function void set(bit [WIDTH-1:0] val); data val; endfunction endclass Register #(8) reg8; // 8位寄存器 Register reg1; // 默认1位如果这个类被继承了它的参数会被默认继承吗这要分成三种情况来看第一种派生类不重传参数使用基类的默认值如果基类有默认值派生类在extends时可以不传递参数此时基类直接使用默认值。// 基类有默认参数 WIDTH 8 class Base #(int WIDTH 8); bit [WIDTH-1:0] data; endclass // 派生类没有指定参数Base 内部使用默认值 8 class Derived extends Base; endclass Derived d new(); // d 内部的 data 是 8 位第二种派生类显式固定基类的参数如果基类没有默认值或者你想改变基类的参数值可以在extends时直接为基类指定具体值。// 基类没有默认值必须传参 class Base #(int WIDTH); bit [WIDTH-1:0] data; endclass // 派生类在继承时直接写死基类的 WIDTH 32 class Derived extends Base #(32); endclass Derived d new(); // d 内部的 data 是 32 位第三种派生类也带参数并传递给基类// 基类 class Base #(int WIDTH); bit [WIDTH-1:0] data; endclass // 派生类也带参数并转发给基类 class Derived #(int WIDTH) extends Base #(WIDTH); bit [WIDTH-1:0] extra_data; // 派生类自己也可以用这个参数 endclass // 使用时用户通过派生类的参数来控制基类 Derived #(16) d new(); // 此时基类的 data 是 16 位派生类的 extra_data 也是 16 位注意第三种情况下基类参数没有默认值所以派生类必须将自己的参数传递给基类否则会有编译错误。但如果有默认值且如果你不想修改默认值的话Base后面的#(WIDTH)也可以不写。或者如果你不想传递WIDTH而是传递一个固定值也可以将Base后面的#(WIDTH)写成类似#(8)。另外参数可以是类型参数type T int实现泛型容器。静态成员和静态多态静态变量无论new了多少次同一个静态变量只在内存中有一份拷贝。静态方法静态方法内只能访问静态变量或调用静态方法不可被重写可通过类名直接调用如MyClass::get_count()。class Counter; static int count 0; function new(); count; endfunction static function void print_count(); $display(Total objects: %d, count); endfunction endclass静态多态和上面两个“静态”没有直接关联简单来说就是参数化类因为在编译时就已经确定了它所要处理的参数。抽象类与纯虚方法Abstract Class Pure Virtual使用virtual class定义抽象类该类不能直接实例化。内部可包含pure virtual方法只声明不实现由子类必须重写实现。virtual class Driver; pure virtual function void drive(); // 纯虚方法 function void common_setup(); // 通用实现 endfunction endclass class UARTDriver extends Driver; virtual function void drive(); // 具体驱动实现 endfunction endclass纯虚方法可以定义一套代码框架罗列出其中必须存在的方法让后来者去做实现如果没有实现其中罗列的方法会直接报错。4. 接口类Interface ClassSV 2009 引入接口类允许类实现多个接口模拟多重继承避免菱形问题。interface class Resetable; pure virtual function void reset(); endclass interface class Configurable; pure virtual function void set_config(int cfg); endclass class MyDevice implements Resetable, Configurable; function void reset(); // 复位逻辑 endfunction function void set_config(int cfg); // 配置逻辑 endfunction endclass接口类只包含纯虚方法不包含属性或实现。类可以实现多个接口但只能继承一个父类。
SV基础之面向对象编程基础(四)
发布时间:2026/7/13 22:17:25
参数化、静态、抽象与接口类背景根据绿皮书第5章和第8章内容总结扩展核心内容参数化类静态变量和静态方法纯虚方法我的理解参数化类Parameterized Class和模块类似类可以带参数实现编译时的静态多态。class Register #(parameter WIDTH 1); bit [WIDTH-1:0] data; function void set(bit [WIDTH-1:0] val); data val; endfunction endclass Register #(8) reg8; // 8位寄存器 Register reg1; // 默认1位如果这个类被继承了它的参数会被默认继承吗这要分成三种情况来看第一种派生类不重传参数使用基类的默认值如果基类有默认值派生类在extends时可以不传递参数此时基类直接使用默认值。// 基类有默认参数 WIDTH 8 class Base #(int WIDTH 8); bit [WIDTH-1:0] data; endclass // 派生类没有指定参数Base 内部使用默认值 8 class Derived extends Base; endclass Derived d new(); // d 内部的 data 是 8 位第二种派生类显式固定基类的参数如果基类没有默认值或者你想改变基类的参数值可以在extends时直接为基类指定具体值。// 基类没有默认值必须传参 class Base #(int WIDTH); bit [WIDTH-1:0] data; endclass // 派生类在继承时直接写死基类的 WIDTH 32 class Derived extends Base #(32); endclass Derived d new(); // d 内部的 data 是 32 位第三种派生类也带参数并传递给基类// 基类 class Base #(int WIDTH); bit [WIDTH-1:0] data; endclass // 派生类也带参数并转发给基类 class Derived #(int WIDTH) extends Base #(WIDTH); bit [WIDTH-1:0] extra_data; // 派生类自己也可以用这个参数 endclass // 使用时用户通过派生类的参数来控制基类 Derived #(16) d new(); // 此时基类的 data 是 16 位派生类的 extra_data 也是 16 位注意第三种情况下基类参数没有默认值所以派生类必须将自己的参数传递给基类否则会有编译错误。但如果有默认值且如果你不想修改默认值的话Base后面的#(WIDTH)也可以不写。或者如果你不想传递WIDTH而是传递一个固定值也可以将Base后面的#(WIDTH)写成类似#(8)。另外参数可以是类型参数type T int实现泛型容器。静态成员和静态多态静态变量无论new了多少次同一个静态变量只在内存中有一份拷贝。静态方法静态方法内只能访问静态变量或调用静态方法不可被重写可通过类名直接调用如MyClass::get_count()。class Counter; static int count 0; function new(); count; endfunction static function void print_count(); $display(Total objects: %d, count); endfunction endclass静态多态和上面两个“静态”没有直接关联简单来说就是参数化类因为在编译时就已经确定了它所要处理的参数。抽象类与纯虚方法Abstract Class Pure Virtual使用virtual class定义抽象类该类不能直接实例化。内部可包含pure virtual方法只声明不实现由子类必须重写实现。virtual class Driver; pure virtual function void drive(); // 纯虚方法 function void common_setup(); // 通用实现 endfunction endclass class UARTDriver extends Driver; virtual function void drive(); // 具体驱动实现 endfunction endclass纯虚方法可以定义一套代码框架罗列出其中必须存在的方法让后来者去做实现如果没有实现其中罗列的方法会直接报错。4. 接口类Interface ClassSV 2009 引入接口类允许类实现多个接口模拟多重继承避免菱形问题。interface class Resetable; pure virtual function void reset(); endclass interface class Configurable; pure virtual function void set_config(int cfg); endclass class MyDevice implements Resetable, Configurable; function void reset(); // 复位逻辑 endfunction function void set_config(int cfg); // 配置逻辑 endfunction endclass接口类只包含纯虚方法不包含属性或实现。类可以实现多个接口但只能继承一个父类。