Exemple de Quartus® II Tcl : Niveaux de logique de rapport

author-image

Par

Lorsque vous optimisez une conception, il est utile de consulter les informations sur les niveaux de logique entre les registres. Le script suivant génère une valeur séparée par une virgule (. csv) fichier avec le nombre de chemins avec différents niveaux de logique dans votre conception. Vous pouvez cartographier ces données ou créer un histogramme dans Excel montrant la distribution des chemins par niveaux de logique.

Si deux registres ont plusieurs chemins logiques entre eux, seul le chemin possédant le plus de niveaux de logique est un pare-ment par ce script. Par exemple, deux registres possédant un chemin à quatre niveaux et un chemin à deux niveaux seraient considérés comme un chemin à quatre niveaux.

Le script génère un fichier CSV nommé <nom de révision>.levels_of_logic.csv.

En supposant que vous enregistrez le script dans un fichier nommé report_levels_of_logic.tcl,vous pouvez l’exécuter avec la commande suivante :

quartus_tan -t report_levels_of_logic.tcl -project <project name> [-revision <revision name>] [-name_pattern <string to match>]

Vous pouvez utiliser l’option -name_pattern pour restreindre l’accès à une hiérarchie spécifique de votre conception. Spécifiez une chaîne à correspondre à la mise en correspondance d’une wildcard dans le langage de commande de l’outil (Tcl). Si vous ne spécifiez pas la valeur de l’option -name_pattern, *. Par exemple, si vous souhaitez signaler des niveaux de logique entre les registres dans le mcul:inst6|lpm_mult:lpm_mult_component hiérarchie de votre conception, précisez mcul:inst6|lpm_mult:lpm_mult_component* pour la valeur de l’option -name_pattern.

load_package advanced_timing package nécessitent des options de
jeu de cmdline

{\ { « project.arg » « » « Nom du projet » } { « revision.arg » « » « Nom de révision »
    } \ { «
    name_pattern.arg » » « * » « Restrict to registers matching this pattern »
} } array set

opts [. :::cmdline::getoptions quartus(args) $options]
ensemble de batterie num_levels [list]

# Ouvrez le projet et obtenez le nom de révision si
{[string equal «  » $opts(révision)] } {
    project_open $opts(project) -current_revision
}
    {project_open $opts(project) -revision $opts(revision) }
définir rév [get_current_revision]

# Préparer la liste de synchronisation si
{capture {create_timing_netlist ; create_p2p_delays } res] } { erreur
    de type post_message $res project_close
    qexit-error
} #

Iterate dans chaque registre de la conception
foreach_in_collection dest [get_timing_nodes -type reg] {

    # Obtenir une liste de keepers (registres,  broches, horloges)
    # qui se alimente vers le nœud de registre
    défini delays_from_keepers [get_delays_from_keepers $dest] # Si le nom du registre de destination ne correspond pas au
    
    schéma,
    # passez simplement à celui suivant.
    définissez dest_name [get_timing_node_info-info name $dest] si
    { ! [string match $opts(name_pattern) $dest_name] } {
        continue } # Walk through all
    keepers feeding the register
    noeach delay $delays_from_keepers {

        set src [$delay 0]

        # Keeper peut inclure des broches et des horloges, et nous ne voulons que  des registres.
        si { ! [chaîne égale « reg » [get_timing_node_info -info type $src]] } {
            continuer } # Si le nom du registre source ne correspond pas au

        schéma, # passez simplement au suivant
        défini src_name
        [get_timing_node_info -nom d’info $src]
        si { ! [string match $opts(name_pattern) $src_name] } {
            Continuer } # À ce stade, les noms de la source et de la destination correspondent au
        schéma, et il s’agit d’un chemin d’inscription.
        # La commande get_delay_path renvoie une liste de nœuds sur
        le chemin # un. La longueur du chemin correspond à la longueur de la liste.
        # La liste inclut les registres de destination et de source,
        # afin que les niveaux de logique entre les registres soient les suivants :
  
  


2
        voies définies [get_delay_path -type le plus long -de $src -à $dest]
        réglée levels_of_logic [expr { [llength $path] - 2 } ]
        
        # Enregistrez les informations dans une batterie
        si {[info existe num_levels($levels_of_logic)] }
            {incr num_levels($levels_of_logic)
        } d’autre
            {set num_levels($levels_of_logic) 1
        } } }

project_close

Nb. Écrivez les informations dans un fichier
si {[capture {open {rev}.levels_of_logic.csv w} fh] }
    {post_message-type d’erreur $fh
} d’autre

    {# Écrivez un en-tête descriptif dans le fichier met $fh « Niveaux de logique pour le projet $opts () $rev de révision du projet »
    met $fh « Fichier généré par
    Quartus® II $quartus (version) sur \
        [format d’horloge [secondes d’horloge]] »
    met $fh « \nReporting paths for register names matching $opts(name_pattern) »
    met $fh « Niveaux de logique, nombre de conception » au niveau de la

    préasque [lsort -integer [array names num_levels]] {

        {[catch {puts $fh « $level,$num_levels($level) » } } {
            erreur de type post_message $res break } } capture { fermer $fh }
}

Le contenu de cette page est une combinaison de traduction humaine et informatique du contenu original en anglais. Ce contenu vous est fourni pour votre commodité et à titre informatif seulement et ne saurait être totalement exact ou complet. En cas de contradiction entre la version anglaise de cette page et la traduction, c'est la version anglaise qui prévaut. Afficher la version anglaise de cette page.