Configuración de pines FPGA como virtuales

Tengo un módulo Verilog para el que quiero verificar su tiempo de forma aislada con respecto al resto del sistema. El problema es que la FPGA tiene un número limitado de pines físicos y mi módulo tiene más bits de entrada que pines físicos, por lo que Quartus II no puede compilar (el instalador se queja de que la FPGA no tiene suficientes pines).

Según tengo entendido, para hacer feliz a Quartus II, necesito algunos pines de entrada de mi módulo como virtuales. Estas son las restricciones en mi .sdcque he probado:

set_input_delay -clock clk_i 0 [large_bus]
set_instance_assignment -name VIRTUAL_PIN ON -to large_bus

Incluso con esas limitaciones, Quartus II todavía se queja. ¿Cómo puedo hacer una "síntesis ficticia" de mi módulo Verilog para verificar el tiempo?

Respuestas (5)

Altera admite IO virtual y para que funcione, debe asignarles la propiedad VIRTUAL_IO on (como lo ha hecho), pero si estos pines están conectados a alguna señal en su diseño, ya no funcionará.

Consulte este sitio web que describe los pasos necesarios para que esto funcione:

Declarar pines virtuales en Quartus

Cuando dice "conectado a cualquier señal en su diseño", ¿quiere decir "conectado a cualquier señal de entrada o salida de su módulo de nivel superior"?
Sí, Altera Quartus (al menos el que usé el año pasado) no los veía como pines virtuales y si las señales no tenían un controlador o una fuente, las eliminaba del diseño incluso con la configuración Virual IO en esos señales Me dijeron que esto estaba arreglado, pero no lo he probado yo mismo. Usé VIO en muchas IP con hasta 900 IO y funcionan muy bien.
Gracias. Cuando hago eso, recibo advertencias de "Asignación de PIN virtual ignorada".
Consulte esta respuesta en Altera: altera.com/support/kdb/solutions/rd03092009_568.html , es posible que tenga tales IO en su diseño.

Altera tiene un buen ejemplo en su sitio web con un script que hará que todos los pines sean virtuales. Lo uso mucho en sistemas complejos con muchos módulos para la estimación de tiempos de subsistemas.

  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 "Making VIRTUAL_PIN assignment to $pin_name"
        set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON
     }
     export_assignments
  }

https://www.intel.com/content/www/us/en/programmable/support/support-resources/design-examples/design-software/tcl/all_virtual_pins.html

La forma en que he hecho esto en el pasado es crear un envoltorio con un solo pin de entrada y un solo pin de salida, junto con pines de reloj y reinicio.

Luego conecte un gran registro de desplazamiento hasta el pin de entrada y conecte las entradas reales de su módulo a los bits de ese registro de desplazamiento. Haga lo mismo con sus salidas y un registro de desplazamiento de salida.

De esa manera, solo necesita 4 pines: la funcionalidad de su diseño no será correcta, pero puede obtener información de tiempo.

Si bien esto funcionará, creo que todos los pines virtuales son para evitar este truco.
Sí, estoy seguro de que tienes razón. Desafortunadamente, nunca he tenido mucha alegría :(
Altera fue el primero con E/S virtual para FPGA y Xilinx, seguido de un enfoque similar en su versión 14.3 de Vivado.

En Vivado, cuando desea realizar un análisis de módulo, es decir, implementar un módulo en un enfoque ascendente para la estimación de recursos, por ejemplo, puede ejecutar la síntesis con la siguiente opción:

synth_design -mode out_of_context -flatten_hierarchy rebuilt -top <top_module_name> -part <part>

La opción -modo fuera_de_contexto garantiza que la colocación de E/S esté deshabilitada. Permite, por ejemplo, la síntesis de módulos con un número de pines superior a la disponibilidad de pines del dispositivo. En Quartus, ¿establecer la opción de pin virtual es la forma equivalente? ¿O hay una forma más apropiada?

Tuve el problema de que necesitaba volver a ejecutar el mapa en cuarto para aceptar las asignaciones antes de poder ejecutar el instalador. Entonces, un mapa para obtener los nombres de los nodos, establecer las asignaciones de pines, otro mapa para aceptar las asignaciones y luego ejecutar el ajustador:

load_package flow
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 "Making VIRTUAL_PIN assignment to $pin_name"
    set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON
}
export_assignments
execute_module -tool map
execute_module -tool fit