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 } }