我想知道是否可以将枚举类型(例如FSM状态)转换为std_logic_vector或整数。我正在使用OSVVM为FSM编写测试台,并希望使用scoreboard包自动比较预期状态和实际状态。
谢谢!
我想知道是否可以将枚举类型(例如FSM状态)转换为std_logic_vector或整数。我正在使用OSVVM为FSM编写测试台,并希望使用scoreboard包自动比较预期状态和实际状态。
谢谢!
要将其转换为整数,使用:
IntVal := StateType'POS(State) ;
从那里开始,将其转换为std_logic_vector很容易,但是在可能的情况下,我更喜欢使用整数进行操作,因为它们比std_logic_vector更小。 对于验证,如果值小于32位,则思考整数会更容易。
如果需要将其转换为std_logic_vector,则仅使用numeric_std即可:
Slv8Val := std_logic_vector(to_unsigned(IntVal, Slv8Val'length)) ;
为了验证,我通常会大量使用numeric_std_unsigned,因此转换更容易:
Slv8Val := to_slv(IntVal, Slv8Val'length) ;
如果你有一个整数,想要将它转换回枚举值,可以使用'VAL。
State := StateType'VAL(IntVal) ;
在OSVVM中,我们使用具有解析值的记录来创建事务接口。我们针对整数类型有一个解析类型(osvvm.ResolutionPkg.integer_max)。我们使用'POS(用于存入)和'VAL(取出)传输枚举值到记录中。请注意,不要将'VAL与'VALUE混淆。'VALUE将字符串转换为值-与'IMAGE相反。当然,你可以在SynthWorks的OSVVM课程中学习所有这些知识。 :)或许是这样的...
function my_func(inp : t_my_enum) return integer is
begin
case inp is
when stateA =>
return 1;
when stateB =>
return 2;
when others =>
return 0;
end case;
end function my_func;
... <= my_func(stateB);`
attribute enum_encoding
。 - user1818839