将枚举类型转换为 std_logic_vector VHDL

Convert enum type to std_logic_vector VHDL

我想知道是否可以将枚举类型(如 FSM 状态)转换为 std_logic_vector 或整数。我正在使用 OSVVM 为 FSM 做一个测试台,我想使用记分牌包来自动比较预期状态和实际状态。

谢谢!

也许像这样...

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);`

要转​​换为整数,请使用:

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 中学习所有这些 class :)。