Chcę wiedzieć, czy możliwe jest przekonwertowanie typu enum, takiego jak stany fsm do std_logic_vector lub całkowitą. Robię testbench z OSVVM dla FSM i chcę użyć pakietu tablicy wyników, aby automatycznie porównywać oczekiwany stan z rzeczywistym.

Dzięki!

10
ferdepe 15 luty 2017, 19:30

2 odpowiedzi

Najlepsza odpowiedź

Aby przekonwertować na liczbę całkowitą, użyj:

IntVal := StateType'POS(State) ; 

Stamtąd łatwo jest przekonwertować na std_logic_vector, ale wolę pracować z liczbami całkowitymi, jeśli to możliwe, ponieważ są mniejsze w magazynie niż std_logic_vector. W celu weryfikacji będzie łatwiej, jeśli zaczniesz bardziej myśleć o liczbach całkowitych, gdy wartość jest mniejsza niż 32 bitów.

Jeśli potrzebujesz go jako STD_LOGIC_VECTOR, używając tylko numeryk_std, możesz:

Slv8Val := std_logic_vector(to_unsigned(IntVal, Slv8Val'length)) ; 

W celu weryfikacji swobodnie używam numeryk_std_unsunded, więc konwersja jest łatwiejsza:

Slv8Val := to_slv(IntVal, Slv8Val'length) ; 

W przypadku, gdy masz liczbę całkowitą i chcesz przekonwertować go z powrotem do wyliczonej wartości, możesz użyć "Val.

State := StateType'VAL(IntVal) ; 

W OSVVM używamy rekordów o rozwiązanych wartościach, aby utworzyć interfejs transakcji. Mamy zniszczone typy dla liczb całkowitych (osvvm.resolutionpkg.integer_max). Przesyłamy wyliczane wartości za pomocą rekordu za pomocą "POS (jak go umieściliśmy) i" Val (jak to wychodzimy).

Uwaga Nie myl "Val z" wartością ". "Wartość konwertuje ciąg do wartości - naprzeciwko obrazu".

Oczywiście dowiedz się wszystkiego w klasie OSVVM Synthworks :).

12
Jim Lewis 20 luty 2017, 17:10

Może taki ...

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);`
0
fpga_magik 15 luty 2017, 16:42