38 votes

Affectations multiples au même registre dans un bloc RTL avec Kansas Lava

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.

3voto

trav1s Points 240

Le problème, c'est que vous êtes à l'aide de plusieurs non-blocage des déclarations affecter le signal.

  sig_2_o0 <= '0';
  sig_2_o0 <= '1';

Cela se traduit par:

at next event assign '0' to sig_2_o0.
at next event assign '1' to sig_2_o0.

C'est différent que d'utiliser le blocage de travaux:

  sig_2_o0 := '0';
  sig_2_o0 := '1';

Ce qui se traduirait par:

assign '0' to sig_2_o0.
assign '1' to sig_2_o0.

Le blocage des affectations

Lorsque vous utilisez le blocage des attributions de la valeur est clairement défini. D'abord, il sera mis à '0', puis de la remplacer par '1'. Dans cet exemple, il devrait y avoir aucun effet à partir de la première blocage de cession, soit de la simulation ou de synthèse de matériel. Vous pouvez y penser comme il y a 0 délai entre la première et la deuxième. Cela signifie que vous avez une impulsion de 0 largeur, qui est en fait rien. C'est équivalent à la dernière affectation, avec la première omise. Un inconvénient est que si vous mettez un retard sur les affectations, par exemple, "après 1 ns" ensuite, vous remarquerez que la première mission de suivi de la seconde dans la simulation. Dans le matériel, les retards sont ignorées et donc il n'y aurait pas de changement à partir de l'ajout des retards. En fait, l'insertion des retards dans RTL, qui est destiné à être synthétisé est fortement déconseillée pour cette raison. Il est hautement souhaitable que le matériel correspond à la simulation, et en ajoutant des retards peuvent introduire des différences.

Non-blocage des affectations

Mais lorsque vous utilisez le non-blocage des affectations le simulateur a deux affectations prévues pour le prochain événement. Régler le signal à " 1 " et dans le même temps, mis à '0'. De sorte que prévu de cession sera le signal de la prendre? Il n'y a aucun moyen de savoir. Il peut être soit de valeur, car il est correctement attribué. Toutes les peluches vérificateur et un outil de synthèse sur la planète devrait jeter une erreur lors de la rencontre de plusieurs non-blocage des attributions de ce genre. Il peut être possible de le simuler, mais il y a clairement un problème avec le RTL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X