Ejemplo de Tcl de Quartus® II: Haga que todos los pines sean virtuales

author-image

Por

Si utiliza un flujo de diseño modular de la región de bloqueo lógico en su proyecto, puede elegir crear todos los pines de E/S en pines de E/S virtuales del módulo como una forma de importar fácilmente el módulo en un diseño de nivel superior. Además, si desea compilar un núcleo de PI para ver cuántos recursos utiliza, pero utiliza demasiados pines para el dispositivo de destino, hacer que los pines sean virtuales puede permitir que el núcleo quepa.

El siguiente procedimiento simple hace que todos los pines en sus pines de E/S virtuales de diseño. En primer lugar, el diseño se utiliza para determinar qué nodos son pines. A continuación, se establece una colección de identificadores de nombre que corresponde a los pines del diseño, a continuación, se aplica una asignación de VIRTUAL_PIN a cada pin. Por último, el comando export_assignments escribe todas las nuevas asignaciones al archivo de configuración de Quartus II del proyecto (.qsf).

En el ejemplo se utilizan los comandos get_names y get_name_info, que están disponibles a partir de la versión 4.0 del software Quartus II (versión 2.0 del paquete ::quartus::p roject). Consulte el último ejemplo de esta página para obtener un código que funcione a partir de la versión 3.0 del software Quartus II y que tenga capacidades más avanzadas.

load_package flow

proc make_all_pins_virtual {} { execute_module

    -tool map set name_ids

    [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        set pin_name [get_name_info -info full_path $name_id]
        post_message "Realización de VIRTUAL_PIN asignación a $pin_name"
        set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON }
    export_assignments
}

Mejora del código de muestra

Hay una variedad de maneras en que se puede mejorar el código de ejemplo.

Elimine las asignaciones VIRTUAL_PIN existentes

Puede agregar el siguiente comando al comienzo del procedimiento para eliminar todas las asignaciones de VIRTUAL_PIN existentes. Este es un paso útil para garantizar que las asignaciones estén en un estado conocido. Agregue este comando antes del comando execute_module.

remove_all_instance_assignments -name VIRTUAL_PIN

Excluir manualmente ciertos pines, como relojes

Para que el software Quartus II realice la optimización de la sincronización según se adapte a un diseño, los relojes deben conectarse a pines de E/S de nivel superior en el dispositivo de destino, y los relojes deben aplicar la configuración de reloj. Esto es cierto incluso si todos los demás pines de un diseño son pines de E/S virtual. Por lo tanto, el ejemplo básico anterior impide que el software Quartus II optimice la sincronización durante la compilación, ya que todos los pines, incluidos los relojes, tienen una asignación VIRTUAL_PIN aplicada.

Puede agregar un parámetro al procedimiento que acepta una lista de señales para excluir del VIRTUAL_PIN las asignaciones. Esta lista suele ser los nombres de los pines de reloj en el diseño. El siguiente ejemplo acepta una lista de nombres que se excluirán. También incluye el comando para eliminar las asignaciones de VIRTUAL_PIN existentes, que se debatieron anteriormente.

load_package paquete de flujo
requieren

cmdline proc make_all_pins_virtual { eros } { opciones de

    conjunto {\
        { "exclude.exclam" "" "Lista de señales a excluir" } \
    } array set
    opts [::cmdline::get infinizs quartus(rogas) $options]

    remove_all_instance_assignments -name VIRTUAL_PIN execute_module
    -tool map set name_ids
    [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        set pin_name [get_name_info -info full_path $name_id]

        if { -1 == [lsearch -exact $opts(excludes) $pin_name] } {
            post_message "Realización de VIRTUAL_PIN asignación a $pin_name" set_instance_assignment
            -to $pin_name -name VIRTUAL_PIN ON
        } else { post_message
            "Asignación de VIRTUAL_PIN de orientación a $pin_name"
        } } export_assignments
}

Puede llamar al procedimiento con este comando. Este ejemplo da por sentado que tiene dos relojes en su diseño, denominados clk_a y clk_b.

make_all_pins_virtual -exclude { clk_a clk_b }

Identificar automáticamente & manejar relojes

El ejemplo anterior para excluir ciertas señales tiene la desventaja de que deben ingresarse manualmente. Es posible determinar las señales de reloj con comandos en el paquete ::quartus::advanced_timing. Este paquete está disponible para la carga solo en el archivo quartus_tan, por lo que debe utilizar quartus_tan para ejecutar secuencias de comandos en el siguiente ejemplo. Todos los comandos de este ejemplo son compatibles, comenzando con la versión 3.0 del software Quartus II.

La identificación automática de relojes tiene la ventaja de permitirle automatizar la aplicación de la asignación de USE_CLK_FOR_VIRTUAL_PIN. Puede utilizar la asignación USE_CLK_FOR_VIRTUAL_PIN en conjunto con la asignación VIRTUAL_PIN para asociar la configuración de reloj con relojes en su diseño. Esto proporciona al ajustador Quartus II información precisa sobre los requisitos de temporización cuando compila un diseño con pines de E/S virtuales. Para obtener más información acerca de esta asignación, consulte el tema de la opción de lógica de reloj de pin virtual en la Ayuda de Quartus II.

El siguiente procedimiento de ejemplo hace que todos los pines de E/S en sus pines de E/S virtuales de diseño. También realiza las asignaciones de reloj de pin virtual cuando sea apropiado.

El código de ejemplo identifica primero su diseño. A continuación, intenta eliminar cualquier lista de redes de tiempo existente antes de crear una nueva. Los comandos get_timing_nodes crean dos recopilaciones de nodos a partir de la lista de redes de temporización: pin_ids y clk_ids. Las dos recopilaciones son exclusivas; ningún nodo de la colección clk_ids se encuentra en la colección pin_ids, a pesar de que el reloj puede estar en un pin de E/S.

El primer ciclo foreach_in_collection obtiene el nombre de cada pin en el diseño (excluidos los pines de reloj) y hace una asignación VIRTUAL_PIN a él.

El segundo ciclo foreach_in_collection obtiene el nombre de cada reloj en el diseño. El comando get_instance_assignment recupera la configuración de reloj correspondiente, si existe. Si existe una configuración de reloj para el reloj (la cadena no está vacía), el script realiza una asignación USE_CLOCK_FOR_VIRTUAL_PIN al nombre del reloj con el valor del nombre de configuración del reloj.

load_package tiempo de load_package flujo
load_package advanced_timing proc make_all_pins_virtual { } { remove_all_instance_assignments

    -name VIRTUAL_PIN
    remove_all_instance_assignments -name USE_CLK_FOR_VIRTUAL_PIN execute_module

    -tool map catch
    { delete_timing_netlist } create_timing_netlist
    -post_map establecer pin_ids
    
    [get_timing_nodes -type pin]
    establecido clk_ids [get_timing_nodes -type clk]
    
    # Realice VIRTUAL_PIN asignaciones a cada pin en el design
    foreach_in_collection pin_id $pin_ids {

        establecer pin_name [get_timing_node_info -info name $pin_id]
        post_message "Cómo hacer VIRTUAL_PIN asignación a $pin_name"
        set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON
    } Para cada

    reloj del diseño, compruebe si tiene el 
    número correspondiente CLOCK_SETTINGS asignación.
    foreach_in_collection clk_id $clk_ids {

        establezca clk_name [get_timing_node_info -info name $clk_id]
        clk_stgs [get_instance_assignment -to $clk_name -name \ CLOCK_SETTINGS] # Si hay una configuración de 
           reloj para este

        reloj, realice la asignación
        # USE_CLK_FOR_VIRTUAL_PIN si {
        ![ cadena igual a "" $clk_stgs] } {
            post_message "Cómo asignar USE_CLK_FOR_VIRTUAL_PIN \
                a $clk_name con el valor $clk_stgs"
            set_instance_assignment -to $clk_name \
                -name USE_CLK_FOR_VIRTUAL_PIN $clk_stgs
        } } export_assignments
}

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.