Ejemplo de Tcl Quartus® II: Niveles de lógica de informe

author-image

Por

Cuando está optimizando un diseño, es útil ver información acerca de los niveles de lógica entre registros. El siguiente script genera un valor separado por comas (. csv) con el número de rutas con distintos niveles de lógica en su diseño. Puede charte estos datos o crear un histograma en Excel que muestra la distribución de las rutas por niveles de lógica.

Si dos registros tienen varias rutas lógicas entre ellos, este script solo cuenta la ruta con la mayoría de los niveles de lógica. Por ejemplo, dos registros con una ruta de cuatro niveles y una ruta de dos niveles se contarían como una ruta de cuatro niveles.

El script genera un archivo CSV denominado < nombre derevisión>.levels_of_logic.csv.

Suponiendo que guarda el script en un archivo denominado report_levels_of_logic.tcl,puede ejecutarlo con el siguiente comando:

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

Puede utilizar la opción -name_pattern para restringir el acceso directo a una jerarquía específica en su diseño. Especifique una cadena que coincida con una coincidencia de texto de comando de herramienta (Tcl). Si no especifica un valor para la opción -name_pattern, el valor predeterminado es *. Por ejemplo, si desea informar sobre niveles de lógica entre registros en la jerarquía mult:inst6|lpm_mult:lpm_mult_component de su diseño, especifique mult:inst6|lpm_mult:lpm_mult_component* para el valor de la opción -name_pattern.

load_package advanced_timing paquete
requieren opciones de conjunto cmdline

{\
    { "project...."" "" "Nombre del proyecto" } \
    { "revision.exclam" "" "Nombre de revisión" } \
    { "name_pattern...."" "*" "Restringir a registros que coincidan con este patrón"} } opts de conjunto de

matrices [::cmdline::get renombres quartus($options] conjunto de
matrices num_levels [list] # Abra el proyecto y obtenga el nombre de

la revisión si {
[cadena igual a "" $opts (revisión)] } {
    project_open $opts(proyecto) -current_revision
} else {
    project_open $opts(proyecto) -revision $opts(revision)
}
set rev [get_current_revision] # Prepare la lista de redes de

temporización si {
[catch { create_timing_netlist; create_p2p_delays } res] } { $res de error de
    tipo post_message project_close
    qexit -error
} Cantidad de

iteración por cada registro en el diseño
foreach_in_collection dest [get_timing_nodes -type reg] {

    # Obtenga una lista de portadores (registros,  pines, relojes)
    # que alimentan al nodo de registro establecido delays_from_keepers [get_delays_from_keepers $dest] # Si el nombre del registro de destino no coincide con
    el
    
    patrón, # simplemente vaya a la
    siguiente.
    establezca dest_name [get_timing_node_info -info name $dest]
    si { ! [coincidencia de cadena $opts(name_pattern) $dest_name] } {
        continue
    }
    #Walk through all keepers". El nombre del nodo de registro para
    demoras $delays_from_keepers {

        set src [lindex $delay

        0] # Keeper puede incluir pines y relojes, y solo queremos  registros.
        if { ! [cadena igual a "reg" [get_timing_node_info -info tipo $src]] } { continue } # Si el nombre del registro de origen no coincide con
        el

        patrón, simplemente vaya al siguiente
        conjunto
        src_name [get_timing_node_info -info name $src]
        if { ! [coincidencia de cadena $opts(name_pattern) $src_name] } {
            continue } Cantidad En este

        punto, tanto los nombres de origen como de destino
        # coinciden con el patrón, y es una ruta de registro a registro.
        # El comando get_delay_path devuelve una lista de nodos en
        # a ruta de acceso. La longitud de la ruta es la longitud de la lista.
        # La lista incluye los registros de origen y destino,
        # así que los niveles de lógica entre registros son: 2 ruta de conjunto
        [get_delay_path -type más long-from $src -to $dest]
        set levels_of_logic [expr { [llength $path] - 2 } ]
        
        # Guarde la información en una matriz if {
        [info existe num_levels($levels_of_logic)] } {
            incr num_levels($levels_of_logic)
        } else { set
            num_levels($levels_of_logic) 1
        } } }

project_close

# Escriba la información en un archivo
si { [catch {open ${rev}.levels_of_logic.csv w} fh] } {
    post_message error de tipo $fh } else { # Escriba un encabezado

    descripto en el archivo
    pone $fh "Niveles de lógica para el proyecto $opts(proyecto) revisión $rev" pone $fh
    "Archivo generado por Quartus® II $quartus(versión) en \
        [formato de reloj [segundos de reloj]]"
    pone $fh "\nReporting paths for register names matching $opts(name_pattern)"
    pone $fh "Niveles de lógica, número en diseño"

    para el nivel de lsort -integer [nombres de matriz num_levels]] { if {

        [catch { pone $fh "$level,$num_levels($level)" } res] } {
            post_message error de tipo $res
            interrupción } catch {
        cerrar $fh }
}

El contenido de esta página es una combinación de la traducción humana y automática del contenido original en inglés. Este contenido se ofrece únicamente para su comodidad como información general y no debe considerarse completa o precisa. Si hay alguna contradicción entre la versión en inglés de esta página y la traducción, prevalecerá la versión en inglés. Consulte la versión en inglés de esta página.