You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog是否有类似Java Object的通用空数据类句柄?

SystemVerilog通用类句柄实现方案

SystemVerilog本身没有提供类似Java Object的内置根类,但可以通过两种原生方式实现通用类句柄的需求,无需自行创建空数据类:

1. 使用void*通用指针

void*是SystemVerilog内置的通用指针类型,可存储任意内存地址,包括类对象的句柄。你可以将任意类句柄直接赋值给void*,后续通过$cast转换回原始类类型:

// 定义任意业务类
class Foo;
  int val = 42;
  function void print();
    $display("Foo value: %0d", val);
  endfunction
endclass

class Bar;
  string msg = "Hello SystemVerilog";
  function void print();
    $display("Bar message: %s", msg);
  endfunction
endclass

// 通用持有类,支持接收任意对象
class GenericHolder;
  void* generic_ptr;

  // 构造函数接收任意类句柄
  function new(input object obj);
    generic_ptr = obj;
  endfunction

  // 获取对象,通过类型参数指定目标类型
  function T get_object(T);
    if (!$cast(get_object, generic_ptr)) begin
      $error("Type cast failed: incompatible object type");
    end
  endfunction
endclass

// 测试示例
module testbench;
  Foo foo_inst = new();
  Bar bar_inst = new();
  GenericHolder holder_foo = new(foo_inst);
  GenericHolder holder_bar = new(bar_inst);

  initial begin
    Foo retrieved_foo = holder_foo.get_object(Foo::new());
    retrieved_foo.print(); // 输出: Foo value: 42

    Bar retrieved_bar = holder_bar.get_object(Bar::new());
    retrieved_bar.print(); // 输出: Bar message: Hello SystemVerilog
  end
endmodule

2. 利用动态类型转换特性

如果你不需要显式存储通用句柄,可直接利用SystemVerilog的$cast动态转换能力,在不同类句柄之间进行转换。不过这种方式需要声明一个通用的类句柄变量(无需定义具体类),但本质上和自定义空类的逻辑接近,不如void*直接贴合你的需求。

注意事项

  • 使用void*时,必须确保转换回的目标类型与原始对象类型一致,否则$cast会返回错误,避免类型不匹配导致的运行时问题。
  • 该方案完全基于SystemVerilog原生语法,无需依赖UVM等第三方库。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:09:27