Je vais avoir du mal à comprendre Kansas Lave comportement quand un RTL
bloc contient des affectations multiples pour le même registre. Voici le numéro de version 1:
foo :: (Clock c, sig ~ Signal c)
=> sig Bool
foo = runRTL $ do
r <- newReg True
r := low
return $ var r
Il se comporte comme je m'y attendais:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
Le générés VHDL
est:
architecture str of assignments is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
OUTPUT <= sig_2_o0;
end architecture str;
Cependant, j'espère que cette autre version serait également le travail:
foo = runRTL $ do
r <- newReg True
r := low
r := high
return $ var r
Mais il ne l'est pas, et la deuxième affectation n'est pas pris en compte:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
La raison pour laquelle je suis confus est parce qu' reg
et var
sont définies dans les conditions d'un plein cycle d'horloge, donc c'est pas comme si je pouvais faire impossibles à synthétiser des choses comme la direction générale basée sur r
, puis attribuer une nouvelle valeur. Alors pourquoi ne pas cette deuxième forme de travail?
Ce n'est pas seulement une simulation de question soit: la générées VHDL
pour la deuxième version montre clairement que la deuxième tâche est jeté au moment de la génération:
architecture str of assignments2 is
signal sig_2_o0 : std_logic;
begin
sig_2_o0 <= '0';
OUTPUT <= sig_2_o0;
end architecture str;
Donc, fondamentalement, je me serais attendu à la sortie pour être plus comme
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;
mais je ne suis pas sûr de ce que pourrait/devrait signifier en VHDL.