Comprendre et Afficher les Timescales Verilog à Toute Portée
Timescale par Défaut
Bien que les modules Verilog soient censés avoir un timescale défini avant le module, les simulateurs peuvent insérer un timescale par défaut. Le timescale réel qui est appliqué à toute portée dans une hiérarchie Verilog élaborée peut être affiché en utilisant la tâche système $printtimescale qui accepte la portée comme argument.
module tb;
initial begin
// Afficher le timescale de ce module
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
On voit que même si une directive timescale n'a pas été placée avant ce module, le simulateur a fini par appliquer une valeur de timescale 1ns/1ns.
Journal de Simulation
xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Portée de Timescale Standard
Par défaut, une directive timescale placée dans un fichier est appliquée à tous les modules qui suivent la directive jusqu'à la définition d'une autre directive timescale.
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
module alu;
endmodule
`timescale 1ns/10ps
module des;
endmodule
Dans l'exemple ci-dessus, tb et alu se retrouvent avec un timescale de 1ns/1ns tandis que des obtient un timescale de 1ns/10ps à cause du placement de la directive avant la définition du module des.
Journal de Simulation
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Portée entre Fichiers Verilog
D'autres fichiers peuvent être inclus dans le fichier courant en utilisant une directive `include qui est une directive de préprocesseur et fait que le compilateur place le contenu du fichier inclus avant la compilation. Donc, c'est équivalent à simplement coller tout le contenu de l'autre fichier dans ce fichier principal.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
`include "file_alu.v"
`include "file_des.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
On voit que les résultats sont exactement les mêmes que dans l'exemple précédent. alu obtient un timescale de 1ns/1ps parce que c'était la dernière directive qui est restée valide jusqu'à ce que le compilateur trouve la définition de alu en dépit de la placer dans un fichier différent. des obtient un timescale de 1ns/10ps parce que la directive a été remplacée avant sa définition.
Journal de Simulation
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
L'échange de fichiers peut changer le timescale
L'ordre d'inclusion des fichiers joue un rôle important dans la redéfinition des directives timescale, ce qui est évident dans l'exemple ci-dessous.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
// NOTE! Ordre d'inclusion échangé
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
On voit que le module alu obtient maintenant un timescale de 1ns/10ps.
Journal de Simulation
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 10ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
C'est une des raisons d'avoir une directive timescale en haut des fichiers pour que tous les modules dans ce fichier assumment le bon timescale indépendamment de l'inclusion de fichiers.
Cependant cette approche peut rendre difficile la compilation avec une précision de timescale différente (valeur suivant l'oblique) sans altérer chaque fichier. Beaucoup de compilateurs et simulateurs fournissent aussi une option pour remplacer les valeurs de timescale par défaut qui seront appliquées à tous les modules.
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Maîtriser la Portée de Référence Hiérarchique Verilog : Éviter les Collisions de Noms dans les Modules et Blocs
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace