Rendre UVM plus rapide grâce à un nouveau système de configuration - Semiwiki

Rendre UVM plus rapide grâce à un nouveau système de configuration – Semiwiki

Nœud source: 3036575

La méthodologie de vérification universelle (UVM) est un moyen populaire de vérifier les conceptions SystemVerilog et comprend un système de configuration qui présente malheureusement quelques problèmes de vitesse et d'utilisation. Rich Edelman de Siemens EDA a écrit un article détaillé de 20 pages sur la manière d'éviter ces problèmes, et je l'ai parcouru pour en résumer les points saillants pour vous. Les ingénieurs de vérification utilisent une base de données de configuration UVM pour définir des valeurs, puis pour obtenir les valeurs ultérieurement dans leur test UVM. Un exemple de définition et d'obtention d'une valeur « T » est :

uvm_config#(T)::set(scope, instance_path_name, field_name, value); uvm_config#(T)::get(scope, nom_chemin_instance, nom_champ, valeur);

La connexion du banc de test UVM au périphérique testé utilise la base de données de configuration pour transmettre les interfaces virtuelles. Il existe trois problèmes liés à l'utilisation de la configuration UVM :

  • Gros code, quelque 2,600 XNUMX lignes de code
  • Nécessite une correspondance de type exacte, donc « int » et « bit » ne sont pas identiques
  • Code lent

Prenons le cas d'un code lent, car avec des milliers d'appels à set() utilisant des noms avec des caractères génériques, cela peut prendre jusqu'à 30 minutes pour terminer les phases « set » et « get ».

Temps écoulé min

Rich propose une nouvelle solution aux configurations UVM qui offre des vitesses beaucoup plus rapides, ne prenant que quelques secondes en comparaison.

nouvelle solution min

Si votre code UVM évite d'utiliser des caractères génériques et comporte peu de commandes « set », alors votre code s'exécutera plus rapidement.

Les solutions possibles aux problèmes de configuration UVM sont :

  • Utilisez plutôt une variable globale
  • Utiliser la configuration UVM avec un set()
  • Utilisez la configuration UVM avec quelques set()
  • Utiliser une arborescence de configuration
  • Essayez quelque chose de différent

Cette dernière approche consistant à essayer quelque chose de différent est la nouvelle solution, et elle continue d'utiliser les API set() et get(), puis simplifie en supprimant le paramétrage des configurations, supprime la priorité et supprime le changement d'algorithme de recherche. Les résultats de cette nouvelle approche sont des vitesses rapides.

Votre nouvel élément de configuration est défini dans la classe dérivée de « config_item », et l'exemple ci-dessous montre « int value » comme propriété définie. À des fins de débogage, vous ajoutez la fonction Pretty-Print.

la classe my_special_config_item étend config_item ; function new(string name = "my_special_config_item"); super.new(nom); valeur int de la fonction finale ; chaîne de fonctions virtuelle convert2string(); return $sformatf("%s - value=%0d <%s>", get_name(), value, super.convert2string()); classe de fin de fonction finale

Le 'config_item' a un attribut name, et ce nom est recherché, ainsi que le nom de l'instance. L'objet de configuration possède également une fonction get_name() pour renvoyer le nom. Pour trouver n'importe quel « nom_instance.nom_champ », la base de données de configuration utilise un tableau associatif pour des vitesses de recherche et de création rapides.
Pour la traçabilité, vous pouvez savoir qui a défini ou qui a appelé get, car un nom de fichier et un numéro de ligne sont des champs dans les appels de fonction set() et get().

set(null, "top.ab*", "SPEED", my_speed_config, `__FILE__, `__LINE__) get(null, "top.abcdmonitor1", "SPEED", speedconfig, `__FILE__, `__LINE__)

La file d'attente des accesseurs peut être imprimée pendant le débogage pour voir qui a appelé set() et get().

Pour prendre en charge les caractères génériques, il fallait ajouter un mécanisme de recherche à l'aide de conteneurs. Considérez le nom d'instance « top.abcd*_0 ».

arbre de conteneur min
Arbre de conteneurs

La partie générique du nom de l'instance est gérée à l'aide de l'arborescence des conteneurs, au lieu du tableau associatif.

Résumé

Le partage de données entre le module/instance et le monde basé sur les classes dans un banc de test UVM peut être effectué à l'aide de la base de données de configuration UVM, soyez simplement conscient des ralentissements de vitesse. Si votre méthodologie utilise de nombreuses configurations, envisagez d'utiliser la nouvelle approche introduite, qui propose un package utilisant environ 300 lignes de code au lieu des 2,600 XNUMX lignes de code du fichier de base de données de configuration UVM.

Lisez l'article complet de 20 pages, Éviter la folie des configurations en toute simplicité chez Siemens EDA.

Blogs connexes

Partagez cet article via:

Horodatage:

Plus de Semiwiki