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?
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.
Le choix du nom reg
s’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
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
.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:
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).
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.
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.