2017-09-25 1 views
0

J'essaye d'implémenter le retard inertiel dans SystemVerilog pour générer un signal valid_inputs avec le critère suivant 1. valid_inputs devrait aller à '1' après un certain délai (disons 15 unités) si aucune entrée n'est X/Z 2. valid_inputs devrait aller à '0' immédiatement si atleast une entrée devient X/Zmettre en œuvre le retard inertiel de plusieurs façons

J'essaie ci-dessus avec 2 implémentations:

module test (a, b, y); 

    input a, b; 
    output y; 

    wire temp; 
    assign temp = ^{a,b}; 
    bit valid_inputs_temp, valid_inputs_2; 
    wire valid_inputs; 

    always @(temp) 
    begin 
     if (temp === 1'b1 || temp === 1'b0) 
     begin 
      valid_inputs_temp <= 1'b1; 
     end 
     else 
     begin 
      valid_inputs_temp <= 1'b0; 
     end 
    end 
    assign #(15,0) valid_inputs = valid_inputs_temp; 

    always @(temp) 
    begin 
     if (temp === 1'b1 || temp === 1'b0) 
     begin 
      #15 valid_inputs_2 <= 1'b1; 
     end 
     else 
     begin 
      valid_inputs_2 <= 1'b0; 
     end 
    end 

endmodule 

Alors que le signal valid_inputs fonctionne parfaitement, mais je Ne suis pas tout à fait sûr pourquoi valid_inputs_2 ne fonctionne pas exactement la même chose? Y a-t-il un moyen de mettre en œuvre le délai inertiel en utilisant toujours le code de procédure?

Veuillez noter que bien que je puisse modifier l'instruction d'affectation dans le code ci-dessus de telle sorte que j'élimine totalement le bloc toujours-début correspondant, pour quelque raison je dois utiliser le style de codage toujours-début.

Merci, Vinayak

+1

est un moyen de vérifier plus concise et significative pour x/z dans un signal. Reportez-vous à la norme IEEE Std 1800-2102, Fonctions du système vectoriel 20,9 bits – toolic

+1

Des délais peuvent également être ajoutés en utilisant un bloc 'specified'. – toolic

+0

Quelle est la raison de l'utilisation de l'expression min/max dans le délai? au lieu de '# (15,0)', vous pouvez juste utiliser '# 15'. Il devrait vous rapprocher de la deuxième mise en œuvre. Aussi, ne ** pas ** utiliser des assighments non-bloquants dans ces blocs, utilisez '=' au lieu de ''<='. ce n'est pas vhdl. Et dans le premier cas, vous avez un délai imposé pour '1' et '0', pensant que dans le second cas, seul '1' est retardé. Ajouter # 15 à la deuxième clause aussi bien. – Serge

Répondre

0

La raison pour laquelle le deuxième bloc always ne fonctionne est que vous avez pas un blocage délai #15. Cela suspend le processus toujours et manque un changement sur temp s'il se produit en moins de 15 unités de temps. Vous devez déplacer le délai de l'autre côté du <= pour qu'il devienne un délai d'attribution non bloquant.

valid_inputs_2 <= #15 1'b1; 

Et si vous êtes confus au sujet de la façon dont un always exécution d'un bloc, voir this link. `isunknown` de $

+0

Si 'temp' est valide pour moins de 15 unités de temps, les deux méthodes se comporteront différemment – Greg

+0

Vous avez raison, NBA a un délai de transport –

+0

@ dave_59 Un délai intra-affectation ferait-il d'un retard de transport plutôt que de l'inertie? Je ne sais pas si je comprends bien, mais pour mettre en œuvre un retard inertiel, j'essaie de faire une évaluation retardée, aidez-moi à comprendre si je me trompe –