web-dev-qa-db-fra.com

Quand faut-il insérer un signal dans la liste de sensibilité d'un processus

Je suis confus quant au moment où un signal déclaré dans une architecture doit être inséré dans la liste de sensibilité d'un processus. 

Existe-t-il une loi générale pouvant être suivie dans n'importe quelle situation? 

J'ai de réelles difficultés à comprendre quand je dois inclure un signal dans une liste de sensibilité de processus.

22
Mazzy

La "loi générale" est que 

tout ce que votre processus doit savoir sur les modifications de doit figurer dans la liste de sensibilité.


Pour un registre synthétisable typique avec une réinitialisation synchrone:

process (clk) is
begin
    if rising_Edge(clk) then
        if reset = '1' then
             -- do reset things
        else
             -- read some signals, assign some outputs
        end if;
    end if;
end process;

Seule l'horloge doit figurer dans la liste, car tout le reste est uniquement examiné lorsque l'horloge change (en raison de l'instruction if rising_Edge(clk).


Si vous avez besoin d'un asynchrone reset:

process (clk, reset) is
begin
    if reset = '1' then
        -- do reset things
    elsif rising_Edge(clk) then
        -- read some signals, assign some outputs
    end if;
end process;

alors le signal reset doit également figurer dans la liste de sensibilité, car votre conception doit en vérifier la valeur chaque fois qu'elle change, indépendamment de ce que fait l'horloge.


Pour la logique combinatoire, j’évite d’utiliser complètement les processus à cause des problèmes de mise à jour de la liste de sensibilité et du potentiel de simulation se comportant alors différemment du code synthétisé. Le mot clé all dans VHDL-2008 a facilité ce processus, mais je ne me suis toujours pas trouvé à vouloir écrire une logique combinatoire longue et compliquée, telle qu'un processus aiderait.

22
Martin Thompson

Si un signal figure dans la liste de sensibilité d'un processus, celui-ci "se réveille" et est évalué chaque fois que la valeur de ce signal change. Si ce n'est pas dans la liste de sensibilité, un signal peut changer, mais un processus ne sera pas réévalué pour déterminer quelles devraient être les nouvelles sorties.

Pour la logique combinatoire: / Vous voulez probablement que tous vos signaux d'entrée soient inclus dans la liste de sensibilité. S'ils ne sont pas inclus dans la liste de sensibilité, votre sortie ne changera pas, même si le signal d'entrée change. C'est une erreur courante (due à la négligence). Notez que dans VHDL 2008, vous pouvez utiliser le mot clé "all" pour inclure automatiquement tous les signaux nécessaires dans votre processus et éviter de créer des verrous.

Pour la logique synchrone: Vous ne voulez probablement que votre signal d'horloge (et peut-être votre réinitialisation) dans la liste de sensibilité. En effet, la valeur de vos signaux (autres que l'horloge) ne vous préoccupe que lorsque votre horloge système a changé. En effet, vous décrivez généralement des registres (composés de bascules) qui permettent uniquement de modifier leur valeur de sortie sur une horloge Edge.

Tout cela peut être déroutant dans le cas de l'utilisation de HDL pour la synthèse car seul un sous-ensemble des circuits que vous décrivez en VHDL peut réellement être implémenté dans un FPGA. Par exemple, vous ne pouvez pas avoir un élément de mémoire primitif sensible à deux fronts d'horloge indépendants, même si vous pouvez décrire un tel circuit en incluant deux horloges dans une liste de sensibilité.

14
Josh

De plus, les outils de synthèse (dans ce cas, parlant du Xilinx XST) ne respectent pas nécessairement la liste de sensibilité du processus. Si vous ne parvenez pas à répertorier tous les processus dont les valeurs sont évaluées dans le corps du processus, le XST émettra un avertissement indiquant qu'il supposera que les signaux dont les valeurs sont évaluées figurent sur la liste de sensibilité. Cela peut entraîner des différences entre les simulations comportementales et le matériel réel. Garde le en mémoire.

1
Daniel Kamil Kozar

De plus, la liste de sensibilité n'a aucune influence sur le comportement de votre conception une fois celle-ci synthétisée. Il n'est utilisé que pendant la simulation. Il est donc très facile d’introduire une différence de comportement entre RTL et le code synthétisé en modifiant la liste de sensibilité.

Les règles que Josh donne sont bonnes, mais surtout, lisez les avertissements donnés par vos outils et agissez en conséquence. Ils vérifient normalement que la liste de sensibilité est correcte et signalera tout problème. Le mode VHDL d’Emacs a également une commande pour mettre à jour la liste de sensibilité, et c’est normalement très bon.


Hmmmm, Ninja'd

0
Paul S