SystemVerilog中如何为类属性实现连续赋值?
SystemVerilog类属性自动同步的简便实现方案
SystemVerilog本身不支持对类属性直接使用Verilog风格的assign连续赋值(连续赋值仅适用于网型变量或静态变量,类成员属于动态对象的存储变量),但可以通过**alias关键字创建变量别名**的方式,实现类属性间的自动同步绑定,这是满足需求的最简便方案。
示例代码
class TestClass; int foo; int test_var[3]; // 定义固定大小的数组 function new(); // 将test_var[1]与foo绑定为同一存储位置的别名 alias test_var[1] = foo; endfunction // 更新foo的方法,test_var[1]会自动同步 function void updateFoo(int new_val); foo = new_val; endfunction endclass module tb; initial begin TestClass obj = new(); // 初始化数组其他元素 obj.test_var[0] = 10; obj.test_var[2] = 40; // 通过updateFoo修改foo,test_var[1]自动同步 obj.updateFoo(20); $display("test_var[0] = %0d, test_var[1] = %0d, foo = %0d", obj.test_var[0], obj.test_var[1], obj.foo); // 直接修改test_var[1],foo也会同步更新 obj.test_var[1] = 30; $display("test_var[1] = %0d, foo = %0d", obj.test_var[1], obj.foo); end endmodule
代码说明
alias test_var[1] = foo;语句将数组元素test_var[1]与变量foo关联为同一存储位置的别名,二者共享同一块内存空间,修改任意一个变量的值,另一个会自动同步变化。- 该方案无需额外的同步逻辑或复杂的设计模式,完全依赖SystemVerilog的语言特性实现。
- 注意事项:
alias要求两个变量的类型必须完全匹配,且数组test_var需在绑定前已确定大小(不能是未分配空间的动态数组)。此特性支持SystemVerilog 2012及后续版本。
内容的提问来源于stack exchange,提问作者Tucker Zischka
相关产品推荐
相关产品推荐

