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