Ejemplo de Tcl de Quartus® II: número de versión automática

author-image

Por

Es útil que se haya incorporado un número de versión o marca de tiempo en su diseño de FPGA. Un número de versión o marca de tiempo elimina cualquier confusión acerca de la versión de su diseño actualmente programada en el FPGA. Para que dicho número sea útil, debe actualizarse automáticamente en el flujo de compilación del diseño. Además, el número debe almacenarse en el hardware de diseño, como en la memoria o en un banco de registros.

Este ejemplo de Tcl describe diferentes maneras de generar un número de versión o marca de tiempo, así como diferentes maneras de almacenarlo en un diseño. A continuación, se muestra un marco de script que puede utilizar para crear un script de Tcl que genera y almacena el número de versión automáticamente, cada vez que compila un diseño. Por último, muestra un ejemplo de un script completo.

Obtener un número

La siguiente lista muestra cómo puede generar un número de versión:

Almacenar el número

Además de obtener el número, debe escribirlo en un archivo de diseño. A continuación, se incluyen ejemplos de cómo almacenar el número:

Marco de script

Puede combinar métodos para obtener y guardar un número que se adapte a su flujo de diseño. En los ejemplos anteriores, elija un método para obtener un número y un método para almacenar el número. Copie los procedimientos apropiados en un archivo Tcl y agregue comandos para llamar a los procedimientos. El siguiente marco de trabajo de script muestra cómo se debe escribir el script. Por último, agregue una asignación (descrita a continuación) a su archivo de configuración de Quartus II (. qsf ) para permitir que el script se ejecute automáticamente.

# Procedimiento de inserción para obtener un número aquí 
# Insert procedimiento para almacenar el número aquí # Esta línea da cabida a la automatización de 
script, descrita más tarde 
foreproces { revisión de proyecto de flujo } $quartus(repetición) { interrupción } # Procedimiento de 
   llamada para obtener un número aquí # Realice cualquier conversión de formato de número necesario # Procedimiento de llamada para almacenar el número 
aquí

Automatización de script

Agregue la siguiente línea al QSF del proyecto para permitir que el script se ejecute automáticamente antes de cada compilación. Reemplace <script name > con el nombre del archivo Tcl.

nombre set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:<script>

Consulte Ejecución automática de script para obtener más información acerca de la asignación y otras maneras de ejecutar secuencias de comandos automáticamente.

Ejemplo

El siguiente ejemplo de script utiliza los procedimientos de los siguientes dos ejemplos:

# Obtiene el número de revisión de SVN para el get_subversion_revision de proceso de archivo especificado
{ file_name } { global done # El número máximo de segundos que debe esperar el comando

    svn info # para completar
    el set timeout_seconds
    30

    # El comando svn info con nombre de archivo que se ejecuta
    set cmd "svn info ${file_name}"

    # Intento de obtener la información
    de la versión. # Si no se puede ejecutar el comando, devuelva un error.
    # De lo contrario, configure un evento de archivo para procesar el resultado del comando.
    if { [catch {open "|$cmd"} input] } { error de código de
        devolución $input } else {
        file$input legible [list get_revision_info $input ] # Configure un tiempo de espera para que el proceso no

        se pueda bloquear si el repositorio # está
        inactivo.
        establezca el tiempo de espera [después de [ expr { $timeout_seconds * 1000 } ]  [list set done -1] ] # No continúe hasta que se encuentre el número de

        revisión,
        el número o los tiempos de espera de la operación. Cancelar el tiempo de espera de todos modos.
        vwait se realiza después de
        cancelar $timeout } } procedimiento de procedimiento de procedimiento
    Despreotable para el procedimiento anterior proc get_revision_info {
inp }  { global done revision_number if {

    [eof $inp] } {
        catch {close $inp}
        set done 1 }
    elseif { $done } {
        obtiene $inp línea } else { obtiene $inp línea # Utilice una expresión
    regular para coincidir con la línea con el número de revisión
        .
        if { [regexp {^Revision:\s+(\d+)\s*$} $line coincidencia revision_number] } { conjunto realizado 1 } } } # Crea un banco de registro en un archivo de

verilog con la generate_verilog proc de valor hex especificado { hex_value } { establecer num_digits [longitud de

    cadena $hex_value]
    establezca bit_width [expr { 4 * $num_digits } ]
    establecer high_index [expr { $bit_width - 1 } ]
    establecer reset_value [string repeat "0" $num_digits]

    if { [catch { set fh
        [open "version_reg.v" w ]
        pone $fh "version_reg del módulo (reloj, reinicio, data_out)".
        pone $fh    "reloj de entrada".
        pone $fh    "reinicio de entrada".
        pone $fh "    salida \[$high_index:0\] data_out;"
        pone $fh "    reg \[$high_index:0\] data_out;"
        pone $fh "    always @ (remarcado en el reloj o reinicio de restablecimiento de 10.000 caracteres) comienza"
        pone $fh " if        (!reset)"
        pone $fh " data_out < =            ${bit_width}'h${reset_value}".
        pone $fh "        else " pone $fh " data_out < =            ${bit_width}'h${hex_value};"
        pone $fh    "end"
        pone $fh "endmodule"
        cerrar $fh } res ] } { error de código de
    devolución $res } else { devolución 1 } } # Esta línea admite la automatización de script foreconferenc { revisión de proyecto de flujo
        }
$quartus(rogas) { break }

set file_name ${project}.qpf set done 0 conjunto revision_number "" #
Procedimiento
   de llamada para obtener el número de revisión del archivo y gestionar cualquier error si { [catch { get_subversion_revision $file_name } exclamación ] } { post_message -type critical_warning "No se pudo ejecutar el comando para obtener el número de revisión. $msg" } 
else { 
   si { -1 == $done } { post_message -type critical_warning "Tiempo de espera obtener el número de 
      revisión." 
   } elseif {[string igual a "" $revision_number] } { 
      post_message -type critical_warning "No se pudo encontrar el número de revisión en la salida de svn info $file_name." 
   } else { 
      procedimiento de llamada para almacenar el número si { 
       [catch { generate_verilog $revision_number } res] } { 
         post_message -type critical_warning \ "No se pudo generar el archivo Verilog. $res" } 
      else { post_message "Número de versión actualizado correctamente 
         a\ versión 0x${revision_number}" 
      } } 
}

Si nombra el script update_version.tcl,debe agregar la siguiente línea a su QSF:

set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl

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.