Conservar Lógica Durante la Síntesis con Synplify

Al emplear Synplify para la síntesis lógica, la herramienta aplica optimizaciones automáticas al diseño. Si bien esto puede ser beneficioso, también presenta desafíos, especialmente al necesitar depurar señales internas usando herramientas como Chipscope. En tales casos, es común observar que los nombres de las señales se modifican o, peor aún, algunas señales desaparecen por completo del listado debido a la optimización.

Para abordar este problema, se han propuesto directivas de síntesis. Una solución común es utilizar el atributo de síntesis /* synthesis syn_keep = 1 */. Una búsqueda más profunda revela directivas adicionales en la documentación de Synopsys y Microsemi.

El manual de referencia de atributos de síntesis de Synopsys FPGA menciona tres directivas principales:

  • syn_keep: Aplicable a redes (nets) y lógica combinacional. Mantiene los cables (wires) sin optimización y puede preservar registros (registers) sin convertirlos en macros.
  • syn_preserve: Asegura que los registros no sean optimizados.
  • syn_noprune: Evita que las cajas negras (blackboxes) sin salidas conectadas sean eliminadas.

Una revisión más detallada en la Guía del Usuario de Synplify Pro para Microsemi, en la sección "Preserving Objects from Being Optimized Away", proporciona una visión más clara:

Elemento a Preservar Directiva Adjunta Resultado
Redes (Nets) syn_keep (para wire/reg en Verilog, signal en VHDL) Mantiene la red en simulación, síntesis o P&R.
Red para Sondeo (Probing) syn_probe (para wire/reg en Verilog, signal en VHDL) Conserva la red interna para propósitos de observación.
Registros Compartidos (Shared Registers) syn_keep (para el cable de entrada o señal del registro compartido) Preserva las celdas de conducción duplicadas.
Componentes Secuenciales syn_preserve (para reg/module en Verilog, signal/architecture en VHDL) Mantiene registros controlados por un valor constante.
Máquinas de Estados Finitos (FSM) syn_preserve (para reg/module en Verilog, signal en VHDL) Conserva el registro de estado con salidas o señales internas de valor fijo.
Instancias de Componentes syn_noprune (para module/component en Verilog, architecture/instance en VHDL) Mantiene la isntancia incluso si tiene puertos no utilizados.

En resumen:

  • syn_keep es la directiva más versátil, aplicable a cables, registros y registros compartidos.
  • syn_probe es útil para propósitos de depuración y sondeo de señales internas.
  • syn_preserve se utiliza para registros alimentados por valores constentes o registros de máquinas de estados.
  • syn_noprune se aplica a módulos instanciados para asegurar que no se eliminen, incluso si tienen puertos sin conectar.

Registros Compartidos (Shared Registers)

Los registros compartidos, también conocidos como lógica redundante, ocurren cuando múltiples salidas se derivan de la misma operación lógica. Por defecto, la herramienta de síntesis optimizará esto creando una única instancia de la lógica compartida.

Ejemplo sin optimización forzada:


module redundant1(ina,inb,out1);
   input ina,inb;
   output out1,out2;

   wire out1;
   wire out2;

   assign out1 = ina & inb;
   assign out2 = ina & inb;

endmodule
 

En este caso, la herramienta de síntesis creará una sola puerta AND para generar tanto out1 como out2.

Ejemplo forzando la duplicación con syn_keep:


module redundant1d(ina,inb,out1,out2);
   input ina,inb;
   output out1,out2;

   wire out1;
   wire out2;
   wire in1a /*synthesis syn_keep = 1*/;
   wire in1b /*synthesis syn_keep = 1*/;
   wire in2a /*synthesis syn_keep = 1*/;
   wire in2b /*synthesis syn_keep = 1 */;

   assign in1a = ina ;
   assign in1b = inb ;
   assign in2a = ina;
   assign in2b = inb;

   assign out1 = in1a & in1b;
   assign out2 = in2a & in2b;

endmodule
 

Al aplicar syn_keep a las señales de entrada de las asignaciones (in1a, in1b, in2a, in2b), se fuerza a la herramienta a mantaner dos instancias de la puerta AND.

Nota importante: La directiva syn_keep debe aplicarse a las señales que alimentan una instancia o una operación lógica para tener efecto. Aplicarla a las señales de salida directamente (como out1, out2 en el primer ejemplo) no producirá el resultado deseado para este caso de registros compartidos.

Controlado por Valor Constante (Constant-Driven)

Un registro controlado por valor constante es un flip-flop cuya entrada está permanentemente conectada a un valor lógico fijo (por ejemplo, '1' o '0'). La herramienta de síntesis normalmente optimizaría y eliminaría tales registros, conectando directamente la señal a VCC o GND.

La directiva syn_preserve puede usarse para evitar la eliminación de estos registros y mantenerlos en el diseño final.

Etiquetas: synplify synthesis Verilog VHDL optimization

Publicado el 8-21 00:12