Altifigence Academy

10 / 37 · Concept

RTL combinatoire et affectations complètes

Exprimer la même fonction avec l'opérateur conditionnel et always_comb, puis repérer les omissions créant un verrou.

Une sortie combinatoire dépend des entrées actuelles

La forme directe du MUXMultiplexeur Circuit combinatoire reliant une entrée parmi plusieurs à la sortie selon une sélection. La correspondance entre bits de sélection et numéro d'entrée doit être spécifiée. En savoir plus est assign y = sel ? b : a;. Pour calculer plusieurs sorties ensemble, utilisez always_comb.

SystemVerilog
always_comb begin
  y = a;
  if (sel) y = b;
end

L'affectation par défaut définit aussi le chemin sel=0. Garder seulement if (sel) y = b; impose de conserver l'ancien y quand sel=0 : ce n'est plus une fonction purement combinatoire. N'ignorez pas les avertissements et ne faites pas confiance au seul mot-clé always_comb.

Définir y=a par défaut puis choisir b si sel=1 donne la même fonction 0/1 que le circuit ci-dessous. La sortie est définie même pour sel=0.

Deux chemins couverts par l'affectation par défaut

y = sel ? b : a

Ne pas lire la syntaxe procédurale uniquement comme du logiciel

Dans un bloc combinatoire, l'affectation bloquante = calcule généralement les résultats intermédiaires. Si une expression lit un résultat affecté plus haut, cette dépendance forme un chemin combinatoire. Distinguez-la de l'affectation non bloquanteAffectation non bloquante Affectation <= du RTL séquentiel : le membre droit est évalué puis la mise à jour planifiée, permettant aux registres du même front de calculer à partir de l'ancien état. En savoir plus <= utilisée pour actualiser les registresRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus.

SystemVerilog
always_comb begin
  next_y = sel ? b : a;
  inverted_y = ~next_y;
end

Une autre règle fondamentale est de ne pas commander une même sortie depuis plusieurs blocs. Lors du découpage en modules, identifiez l'unique pilote de chaque signal dans l'interface.

Aligner d'abord les largeurs des données

Pour sélectionner entre huit et douze bits, précisez la largeur de y et l'extension de signe. Définissez les plages dès la conception plutôt que d'espérer vérifier par hasard une extension implicite sur un chronogramme. Hors du modèle 0/1, lorsque sel=X, l'opérateur conditionnel peut différer d'un simple if ; ne généralisez pas les résultats à deux états à tous les cas à quatre états.

Essayez vous-même

Un always_comb contient seulement if(en) y=d;. Comment obtenir un circuit combinatoire donnant 0 lorsque enable est inactif ?

Lire l’explication

Affectez 0 à y au début du bloc puis remplacez-le par d si en, ou utilisez une expression de largeur explicite équivalente à assign y = en ? d : 0. Conserver l'ancienne valeur à en=0 est un autre contrat de registre/verrou, pas une sortie nulle.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.