Error de restricción de temporización interna de FPGA

0

Actualmente estoy intentando implementar un IP-Core en un Cyclone V 5CSEBA6U23I7 del sistema FPGA-HPS con Altera Quartus II y TimeQuest Analyzer.
El código Verilog pegado a continuación produce un problema de tiempo, es decir, la asignación fifo_wdata_289[255:0] <= {fifo_out,fifo_wdata_289[255:16]}; , que escribe la salida de un FIFO en otra matriz de registros FIFO.
Los FIFO en uso son asíncronos, pero las señales utilizadas están en el mismo dominio de reloj.
Se está colocando en el chip con un sesgo de reloj de -2.255 ns , que es un poco menos que un período completo ( 288 MHz clock = > 3.47 ns ) , y hace que TimeQuest se queje, de que se están violando las restricciones.
La recomendación de TimeQuest es Reducir los niveles de lógica combinacional para la ruta (Emitir Ruta combinada larga ) con niveles adicionales de lógica combinacional = 1.

El reloj de 288 MHz se genera a través de PLL y estoy usando archivos de Timeconstraint (sdc) con los comandos derive_pll_clocks y derive_clock_uncertainty.

Mi pregunta ahora es cómo resolver este problema, ya que solo tengo una capa de lógica combinatoria (Demuxer y enrutamiento, como lo sugiere la asignación) y, por lo tanto, no tengo idea de cómo reducir eso. ¿Hay alguna otra manera en que pueda asegurarme de que se cumpla el requisito de tiempo, o hay una mejor manera de programar esta máquina de estadísticas? Gracias por tu ayuda.

            case(stateProc)
                2'b00:
                begin
                    if(~fifo_empty&~fifo_full_289)
                    begin
                        fifo_wdata_289[255:0] <= {fifo_out,fifo_wdata_289[255:16]};
                        fifo_wdata_289[287:256] <= {2'b11,fifo_wdata_289[287:258]};
                        if(imgSize >= maxImgSize - 32'd2)//image done, transmit data and fire irq
                        begin
                            fifo_wdata_289[288] <= 1;
                            stateProc <= 2'b01;
                            imgSize <= 32'd0;
                        end
                        else if(fifo_wdata_289[258])//process transfer without irq //258 high means that 256 has been written in this cycle and 258 in the previous cycle
                        begin
                            fifo_wdata_289[288] <= 0;
                            stateProc <= 2'b01;
                            imgSize <= imgSize + 32'd2;
                        end
                        else//accumulate more data
                        begin
                            fifo_wdata_289[288] <= 0;
                            stateProc <= 2'b00;
                            imgSize <= imgSize + 32'd2;
                        end
                    end
                    else
                    begin
                        fifo_wdata_289 <= fifo_wdata_289;
                        imgSize <= imgSize;
                        stateProc <= 2'b00;
                    end
                end
                2'b01:
                begin
                    fifo_wdata_289 <= fifo_wdata_289;
                    imgSize <= imgSize;
                    stateProc <= 2'b11;
                end
                2'b11:
                begin
                    fifo_wdata_289 <= 0;
                    imgSize <= imgSize;
                    stateProc <= 2'b00;
                end
            endcase

EDITAR:

Las rutas que fallan en TimeQuest se ven así:
Slack:
-3.178

Desde el nodo:
soc_system: u0 | CamConnector: camconnector_0 | FIFO_289: FIFO_inst_289 | dcfifo: dcfifo_component | dcfifo_6up1: auto_generated | wrptr_g [0]

Al nodo:
soc_system: u0 | CamConnector: camconnector_0 | fifo_wdata_289 [267]

EDIT2:
Actualmente estoy usando celdas MLAB como almacenamiento FIFO, que están clasificados para 290 MHz.
Ambos FIFO son asíncronos y tienen una configuración de sincronización de 3.
El tiempo de cierre Las recomendaciones de TimeQuest informan los dos problemas siguientes:

  1. lógica combinacional desequilibrada
  2. Senda Combinacional Larga
pregunta Krustenkaese

2 respuestas

2
  

ya que solo tengo una capa de lógica combinacional (Demuxer y enrutamiento, como lo sugiere la asignación)

No, no tienes eso. También existe la compensación en stateProc == 2'b11. Pero supongo que las LUT de ciclón son lo suficientemente grandes como para que puedan abarcar una puerta AND adicional al mismo tiempo.

Pero le sugiero que también publique la ruta de acceso errónea según lo informado por la herramienta. Porque algo no se suma aquí. La ruta para el fifo_wdata_289 [288] es más compleja y usted dice que sí pasa el tiempo. No me sorprendería si las señales de control mux: fifo_empty, fifo_full_289, stateProc, etc., también se encuentren en la ruta de tiempo de falla junto con el árbol de la unidad mientras controla muchas FF de una señal.

Si no, realmente solo puedes correr a una velocidad más baja. No es útil jugar con el reloj ya que el circuito usa sus propias señales ( fifo_wdata_289 [255: 0] < = {fifo_out, fifo_wdata_289 [255: 16] } ;) Por lo tanto, si inclinas o inviertes el reloj, fifo_wdata_289 [255: 16] saldrá más tarde y, por lo tanto, volverá a fallar el tiempo. Puede que tenga suerte y el fifo_out llegue tarde y cause el error de tiempo, pero nuevamente vea el informe de tiempo de la ruta que falla.

De todos modos, sesgar un reloj es algo que se puede hacer en un ASIC, pero no lo intentaría con un FPGA. No creo que tengas el control fino para sesgar un reloj ~ 300ps contra otro. Pero no nos tienen los ciclones así que tal vez ...

Actualización:
Justo lo que esperaba: el camino comienza en wrptr_g ... Supongo que es el puntero de escritura que probablemente se compara con el puntero de lectura que hace que las marcas fifo_full / empty que controlan el mux.

La mejor manera de deshacerse del problema del tiempo es hacer una versión registrada de las banderas llenas / vacías. Eso puede significar que tienes que rediseñar algo del resto del circuito.

Si el FIFO es sincrónico, hay un truco para generar indicadores sincrónicos llenos / vacíos. Verifica si el nivel es UNO y en una lectura, pero no escribe, establece sincrónicamente el indicador 'vacío'. Consulte aquí para obtener un código de ejemplo gratuito de FIFO que tiene esa función. Desafortunadamente eso no funciona con FIFOs sincrónicos.

    
respondido por el Oldfart
0

Si ambos FIFO se están alimentando en la misma fase de reloj, entonces se están violando los tiempos de configuración y de espera para el segundo FIFO, como por ejemplo, llegar demasiado pronto. Su programa está insinuando que necesita reducir la velocidad, es decir, su reloj.

Puede agregar un inversor para bloquear el segundo FIFO en el flanco descendente mucho después de que los datos se hayan asentado. Una mejor opción si su software puede hacer esto es poner un movimiento en la línea del reloj antes de que llegue al segundo FIFO. Un software como Specctra puede hacer los cálculos para esto.

Al no tener nada mejor, un resistor de bajo valor en serie con el reloj al segundo FIFO creará un retraso natural. Averigüe la capacitancia del pin del reloj y calcule lo que se necesita para un retardo nS. Pensaría que 100 ohms como máximo, pero más de 10 ohms.

    
respondido por el Sparky256

Lea otras preguntas en las etiquetas