Enums 访问Systemverilog中的枚举名称

Enums 访问Systemverilog中的枚举名称,enums,system-verilog,Enums,System Verilog,我希望能够检索枚举中类型的名称,而不必实际为它们分配变量。因此,给定这样的枚举 class my_class; typedef枚举位{ 一,, 两个 }fsm_state_t; 末级 我知道我可以访问声明变量的名称,如下所示: class另一个类; ... my_class::fsm_state\u t state=my_class::ONE; 打印(state.name()); ... 末级 是否可以访问枚举的名称而不必实际声明和分配变量?我的意思是这样的: class另一个类; ...

我希望能够检索枚举中类型的名称,而不必实际为它们分配变量。因此,给定这样的枚举

class my_class;
typedef枚举位{
一,,
两个
}fsm_state_t;
末级
我知道我可以访问声明变量的名称,如下所示:

class另一个类;
...
my_class::fsm_state\u t state=my_class::ONE;
打印(state.name());
...
末级
是否可以访问枚举的名称而不必实际声明和分配变量?我的意思是这样的:

class另一个类;
...
打印(my_class::ONE);
打印(my_class::2);
...
末级

否,无法对类型调用内置方法。

否,无法对类型调用内置方法

如果某一天类型发生更改,编译器会通知打印 也必须改变

通过在代码中简单地“使用”枚举,如果它消失,您将得到一个编译错误。这似乎是你在复制的东西。更实用的复制方法是对每个枚举进行值检查:

class another_class;
...
   if (my_class::ONE!=0) print("ONE has changed!");
   if (my_class::TWO!=1) print("TWO has changed!");
...
endclass
编辑:或为枚举创建包装类

virtual class enum_wrap#(type T);
  static function string name(T obj);
    return obj.name();
  endfunction
endclass

program testbench;
  initial begin
    typedef enum {ZERO, ONE, TWO, THREE} numbers_t;
    $display("ENUM without variable: %s", enum_wrap#(numbers_t)::name(THREE));
  end
endprogram
印刷品:

ENUM without variable: THREE
如果某一天类型发生更改,编译器会通知打印 也必须改变

通过在代码中简单地“使用”枚举,如果它消失,您将得到一个编译错误。这似乎是你在复制的东西。更实用的复制方法是对每个枚举进行值检查:

class another_class;
...
   if (my_class::ONE!=0) print("ONE has changed!");
   if (my_class::TWO!=1) print("TWO has changed!");
...
endclass
编辑:或为枚举创建包装类

virtual class enum_wrap#(type T);
  static function string name(T obj);
    return obj.name();
  endfunction
endclass

program testbench;
  initial begin
    typedef enum {ZERO, ONE, TWO, THREE} numbers_t;
    $display("ENUM without variable: %s", enum_wrap#(numbers_t)::name(THREE));
  end
endprogram
印刷品:

ENUM without variable: THREE

如果您只想将常量
myclass::ONE
转换为字符串
“ONE”
,为什么不直接说
print(“ONE”)
?(或者,可以使用宏将名称字符串化)如果使用synopsys
VCS
,则可以对枚举名称执行
$display(“%s”)
。据我所知,没有其他人实现此功能。否则,只需创建一个枚举名称表,并根据值获取它们。打印(“一”)显然有效,但关键是要约束它,以便在某一天更改类型时,编译器通知打印也必须更改。这是一个一致性安全问题,而不仅仅是如何打印名称。将此标记为已解决,因为答案说明没有内置方法。如果您只想将常量
myclass::ONE
转换为字符串
“ONE”
,为什么不直接说
print(“ONE”)
?(或者,可以使用宏将名称字符串化)如果使用synopsys
VCS
,则可以对枚举名称执行
$display(“%s”)
。据我所知,没有其他人实现此功能。否则,只需创建一个枚举名称表,并根据值获取它们。打印(“一”)显然有效,但关键是要约束它,以便在某一天更改类型时,编译器通知打印也必须更改。这是一个一致性安全问题,而不是如何打印名称。将此标记为已解决,因为答案说明没有内置方法。感谢您的评论,但我不确定我是否通过简单地在代码中“使用”枚举来理解您的第一句话,如果它消失,您将得到编译错误。如果我有一个接收整数和字符串的函数,我希望它们对应于我的_类:1和“1”,函数不知道枚举tho,因此我可以使用
函数(我的_类::1,“2”)
,因此我不会得到任何编译错误。我想阻止这一切。我将Dave的答案标记为解决方案,目前我并不关注这个问题,因此我建议使用虚拟包装器类。编辑回答谢谢你的评论,但我不太确定我是否理解你的第一句话,只是简单地在代码中“使用”枚举,如果它消失了,你会得到一个编译错误。如果我有一个接收整数和字符串的函数,我希望它们对应于我的_类:1和“1”,函数不知道枚举tho,因此我可以使用
函数(我的_类::1,“2”)
,因此我不会得到任何编译错误。我想阻止这一切。我将Dave的答案标记为解决方案,目前我并不关注这个问题,因此我建议使用虚拟包装器类。编辑答案