У меня возникли проблемы с пониманием поведения Kansas Lava, когда блок RTL
содержит несколько присвоений одному регистру. Здесь версия номер 1:
foo :: (Clock c) => Signal clk Bool
foo = runRTL $ do
r <- newReg True
r := low
return $ var r
Это ведет себя так, как я ожидал:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
Сгенерированный VHDL
:
architecture str of assignments is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
OUTPUT <= sig_2_o0;
end architecture str;
Однако я надеялся, что эта другая версия также будет работать:
foo = runRTL $ do
r <- newReg True
r := low
r := high
return $ var r
Но это не так, и второе назначение не учитывается:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
Причина, по которой я запутался, состоит в том, что reg
и var
определены в терминах полного тактового цикла, поэтому мне не хотелось делать невозможные для синтеза вещи, такие как ветвь на основе r
, а затем переназначьте новое значение. Так почему же эта вторая форма не работает?
Это не просто проблема моделирования: сгенерированная VHDL
для второй версии ясно показывает, что второе задание выбрасывается во время генерации:
architecture str of assignments2 is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
OUTPUT <= sig_2_o0;
end architecture str;
В принципе, я ожидал, что результат будет больше похож на
architecture str of assignments2 is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
sig_2_o0 <= '1';
OUTPUT <= sig_2_o0;
end architecture str;
но я не уверен, что это будет/должно означать в VHDL.