web-dev-qa-db-fra.com

Différence entre les types de données SystemVerilog (reg, logic, bit)

Il existe différents types de données dans systemverilog qui peuvent être utilisés comme suit:

reg [31:0] data;
logic [31:0] data;
bit [31:0] data;

Comment les trois d'entre eux diffèrent?

18
e19293001

reg et wire étaient les types d'origine. Les fils sont constamment assignés et les regs sont évalués à des points particuliers. L'avantage ici est que le simulateur peut effectuer des optimisations.

wire w_data;
assign w_data = y;

// Same function as above using reg
reg r_data;
always @* 
  r_data = y ;

Une erreur courante lors de l’apprentissage de Verilog est de supposer que le type a reg implique un registre dans le matériel. L'optimisation antérieure du simulateur peut s'effectuer via le contexte de son utilisation.

Ceci introduit logic qui peut être utilisé à la place de wire et reg.

logic  w_data;
assign w_data = y;

// Same function as above using reg
logic r_data;
always @* 
  r_data = y ;

Les types bit et byte ont également été créés et ne peuvent contenir que 2 états 0 ou 1 non x ou z. byte implique bit [7:0]. L'utilisation de ces types offre une légère amélioration de la vitesse, mais je vous recommande de ne pas les utiliser dans RTL car votre vérification risque de manquer des valeurs non initialisées ou des réinitialisations critiques.

L'utilisation de bit et byte serait plus courante dans les composants de banc d'essai, mais peut entraîner des problèmes en cas de nécessité de conduire des x pour stimuler la corruption et la récupération de données.


Mettre à jour

Au moment de la rédaction de cet article, j’avais l’impression que logic ne pouvait pas être utilisé pour les trois états, je suis incapable de trouver le document original sur lequel je me suis basé. Jusqu'à ce que d'autres mises à jour, commentaires ou modifications soient apportés, je révoque mon assertion selon laquelle logic ne peut pas être utilisé pour créer des lignes à trois états.


Le type tri a été ajouté pour définir explicitement une ligne à trois états. Il est basé sur les propriétés de wire, logic est basé sur les propriétés de reg.

tri t_data;
assign t_data = (drive) ? y : 1'bz ;

Si vous n'avez plus besoin de prendre en charge la compatibilité ascendante Verilog, je vous recommanderais de passer à logic et tri. L'utilisation de logic facilite la re-factorisation et et tri reflète l'intention de conception d'une ligne à trois états.

26
Morgan
  • Le choix du nom regs’est avéré être une erreur , car l’existence de registres est plutôt déduite de la manière dont les assignations sont effectuées. Pour cette raison, l'utilisation de reg est essentiellement déconseillée au profit de logic, qui est en fait du même type.

  • logic est un type de données 1 bit, 4 états

  • bit est un type de données 1 bit, 2 états qui peut simuler plus rapidement que logic
  • Si une logic est également déclarée en tant que wire, elle a la capacité supplémentaire de prendre en charge plusieurs pilotes. Notez que par défaut wire est équivalent à wire logic.
  • En général, les " réseaux " (tels que wire et tri) conviennent mieux à la conception de bus de communication.

En pratique, pour RTL , peu importe que vous déclariez avec reg, ou logic ou wire. Cependant, si vous devez déclarer explicitement un type à 4 états (par opposition à quand vous ne le faites pas ), vous devriez généralement choisir logic, puisque c'est ce que le langage vise.


Articles Liés:

5
nobar

Comme je ne peux pas ajouter de commentaire, je dois écrire ce qui ressemble à une nouvelle réponse mais ne l’est pas. Soupir!

@ e19293001, @Morgan, logic définit une variable à 4 états contrairement à bit. Par conséquent, une variable logic peut être utilisée pour stocker 1'bz afin que le code suivant soit valide et compile:

logic t_data;
assign t_data = (drive) ? y : 1'bz ;

Mais je conviens que dans ces cas, il convient d'utiliser tri pour refléter l'intention de conception logic (bien que je dois dire que je ne vois pas les gens utiliser tri au lieu de logic/wire trop souvent).

2
Paddu

Le type de données logique n'autorise pas plusieurs pilotes. La dernière affectation gagne en cas d'affectation multiple. Le type de données Reg/Wire donne X si plusieurs pilotes essaient de les piloter avec une valeur différente. Le type de données logique affecte simplement la dernière valeur d’affectation.

0
Prasanjit Bengani

reg et la logique sont exactement les mêmes. Ces types de données apparaissent dans les blocs permanents ou initiaux et stockent des valeurs, c'est-à-dire toujours @ (a) b <= a ;, le registre b est évalué uniquement lorsque 'a' est modifié, sinon il stocke simplement la valeur qui lui a été attribuée en dernier.

les câbles ne sont que des connexions et doivent être entraînés en permanence. Je conviens qu'ils peuvent se comporter de la même manière que @Morgan, mais ils peuvent être imaginés comme un morceau de fil dur dont la valeur ne change que la valeur à l'autre bout ou la source.

0
Vinayak Bhat