0
votes

Comment puis-je exécuter ce module Verilog séquentiellement?

Je veux faire fonctionner une testeuse de manière séquentielle. Ce que je m'attendais à exécuter AES_Input au début et après sa fin, le deuxième module AES_TOP fonctionne. J'ai fait un paramètre i_out1, et si AES_Input I_out devient de 0 à 1, puis le deuxième module exécuté

J'ai vérifié cela compilé avec succès, mais j'ai découvert que c'est une connexion illégale. Je ne sais pas comment je résous ce problème. Y a-t-il une autre façon d'exécuter ce module séquentiellement? xxx


1 commentaires

Vous n'avez pas besoin générer . Toute la logique dont vous avez besoin, ils sont juste là. Si vous voulez lequel fonctionne et lequel non, créez un signal d'activation.


3 Réponses :


-1
votes

Fondamentalement, vous ne pouvez pas avoir une exécution séquentielle de modules dans la conception du système numérique. Tous sont exécutés parallèlement. Dans une logique Gates env, vous ne pouvez pas avoir un à un d'être exécuté.

Mais ici dans ce cas, ce que vous pouvez faire est d'avoir un signal d'activation et de finition pour chacun du module. Donc, pour le premier module, vous pouvez fournir l'activation de la testbench, puis pour les modules suivants, attachez le signal de finition de la précédente. De cette façon, vous pouvez gérer une exécution en cascade.


0 commentaires

1
votes

Verilog est une "langage de description du matériel", ce n'est pas un langage de programmation générique. En tant que tel, il permet une description de la structure des systèmes matériels. Il n'y a rien de séquentiel dans le matériel lui-même. Il est massivement parallèle. Le résultat de l'évaluation matérielle dépend des signaux d'entrée, des connexions entre les éléments et l'état précédent.

Verilog essaie de imiter le comportement matériel en fournissant du matériel . Les modules décrivent la hiérarchie matérielle par hiérarchie des instances et rien d'autre. Ils ne peuvent pas être "exécutés" ni ne peuvent être exécutés dans une "séquence". Les instances de module sont connectées les unes avec les autres par des "fils" qui transfèrent des valeurs de signal de transfert.

module lui-même est décrit en termes de missions continues et de blocs de procédure, par exemple, "toujours" blocs. Ils décrivent les connexions à l'intérieur des modules et des périphériques matériels de niveau bas. Ils sont également connectés par un ensemble de fils à l'intérieur du module. L'unique pièce de programmation séquentielle dans Verilog existe dans des blocs de procédure décrivant le comportement des périphériques matériels.

Afin de simuler le comportement parallèle du matériel Verilog utilise Technique . Cela signifie qu'un certain bloc procédural est évalué si et uniquement si au moins une de ses modifications de valeur de son entrée. En conséquence, la séquence d'évaluation des modèles de périphériques dépend des valeurs des signaux du modèle. Les modules ne sont que des conteneurs uniquement pour ces modèles de périphérique et ne sont jamais évalués dans son ensemble.

Dans votre cas, vous instaniez quelques modules multiples de plusieurs fois qui passent le même fil que le fil de sortie. Verilog est très difficile sur la manière dont ces fils sont évalués. Très probablement, vous avez «X» sur de tels fils dans votre cas. La raison en est que Verilog les évalue en fonction des règles et des chiffres ci-dessus sur le fait que le même fil est entraîné par plusieurs périphériques avec des valeurs différentes. Dans le monde matériel parallèle, il ne contient aucune idée de la valeur correcte, il met donc "x" là-bas.

Pour décrire une séquence d'affectations dans Verilog, vous devez fournir davantage de fils pour le faire, par exemple xxx

de cette façon, vous pouvez utiliser "dans" comme entrée de stimulus et sortir [2] comme un fil d'intérêt pour votre banc d'essai.


0 commentaires

0
votes

HDLS vous permet de créer des structures qui fonctionnent simultanément - la structure existe et la seule nature séquentielle est dans les données qui lui sont transmises. Ci-dessous, j'ai ajouté une source d'horloge de sorte que votre logique interne puisse avoir une horloge pour le traitement séquentiel, et a également ajouté une instruction initiale, de sorte que vous pouvez modifier séquentiellement les valeurs d'entrée. Vos blocs semblent avoir aucune entrée - la plupart des blocs des HDLS sont des fonctions de transfert - une fonction fonctionnant sur un ensemble d'entrées pour produire une sortie. J'ai supprimé les déclarations générales - commencez par commencer à trois instances et connectez-les comme vous le souhaitez. Ensuite, si vous avez besoin de plus après son fonctionnement, ajoutez les énoncés générateurs.

`timescale 1ns / 1ps

module AES_TB;

// Inputs
reg clk=0; //initialize clock, otherwise you will just have x's (red)
always #4 clk=!clk; // define clock function

parameter i_out1 = 1'b0;
wire [258943:0] p_out;
wire a_out;
wire [258943:0] dataout;

reg i0, i1, i2;
initial begin // this creates sequential vector assignment
  i0=0; // initialize values
  i1=0;
  i2=0;
  #5;
  i0=1;//after some time, assign values
  i1=1;
  i2=1;
  @(posedge clk);
  i0=0;//after clock, assign values
  i1=0;
  i2=0;



end


AES_input t1 (
   .some_control_input(i0),
   .p_out(p_out), 
   .i_out(i_out1));
AES_input t2 (
   .some_control_input(i1),
   .p_out(i_out1), 
   .i_out(i_out2));
AES_output t3 (
   .some_control_input(i2),
   .dataout(dataout), 
   .a_out(a_out)
);



endmodule


0 commentaires