Accede al coprocesador NEON desde la lógica programable en Zynq

Durante los últimos días he estado pensando en el coprocesador de neón en el SoC de Zynq y tengo una pregunta, ¿es posible enviar instrucciones al neón desde el lado PL del SoC?

Imagine que tengo una aplicación con muchas operaciones matemáticas y he usado todos los segmentos DSP en la lógica programable. Supongo que podría descargar algunas operaciones al PS, o encontrar una manera de compartir segmentos DSP entre operaciones (unos pocos ciclos para cada uno). Empecé a pensar que tal vez podría descargarlo al PS y el PS lo enviaría al coprocesador de neón, que seguiría haciendo lo que tiene que hacer y cuando los datos estén listos, los enviaría de vuelta al PL (probablemente no cómo funciona el coprocesador de neón, pero es solo por ejemplo).

Como es posible ver, mi siguiente pensamiento fue averiguar si tal vez podría enviar instrucciones al coprocesador de neón desde el lado PL de las cosas. Sería muy útil si es posible, pero no he encontrado ninguna documentación que indique si esto es posible, y tampoco he podido encontrar a alguien que haya intentado experimentar con esto.

Probablemente podría decir que si tengo una aplicación que no se puede cumplir adecuadamente con los 220 segmentos DSP disponibles, entonces debería obtener otra que satisfaga mis necesidades. Pero este pensamiento me vino en la ducha y es completamente hipotético. No existe tal aplicación que exija tantos cálculos (bueno... las hay, pero no ninguna aplicación que quiera desarrollar).

Entonces, ¿alguien sabe si esto es posible?

Esta es una muy buena pregunta.
@stacey Gracias. Espero que alguien sepa cómo responder
@stacey Encontré lo que estaba buscando. Verifica la respuesta. Recibí dos respuestas, ambas excelentes, pero la marcada como la respuesta correcta me dio una muy buena manera de hacer esto (perdón por mi inglés ... no es mi primer idioma)

Respuestas (2)

Dudo que esto sea posible puramente con lógica programable ya que el motor NEON SIMD accede a los registros internos y las instrucciones provienen del flujo de instrucciones principal. No hay forma de acceder a ninguno de estos desde PL. Sin embargo, lo que podría hacer es configurar las instrucciones de carga/almacenamiento de NEON para leer y escribir en el espacio de direcciones asignadas de PL y luego escribir código para controlar el coprocesador de NEON.

La respuesta a esto es: "más o menos, pero es mucho trabajo".

El PS y el PL en el zynq están interconectados mediante una serie de interfaces AXI4, con distintas velocidades y capacidades de coherencia. Estas interfaces se pueden utilizar como mecanismo para implementar una interfaz de registro o transferir datos entre el PS y el PL. No existe una forma intrínsecamente nativa de transferir el procesamiento al PS simplemente debido a las naturalezas opuestas del PS y el PL, pero sería posible diseñar un mecanismo intermedio para convertir las tareas del PL en aquellas que el PS podría realizar. llevar a cabo. Aquí es donde entra el "mucho trabajo".

Sería necesario dividir el trabajo de forma lógica de modo que el procesamiento realizado sea mayormente adecuado para la arquitectura (PS o PL) y que en su mayoría se mantengan separados unos de otros. Por ejemplo, el PL puede pasar algunos datos al PS para su procesamiento, mientras continúa con la siguiente ronda de datos.

Este es un tema de diseño más que otra cosa. Es necesario utilizar las interfaces proporcionadas entre PS y PL para optimizar el uso de ambos conjuntos de recursos de la manera óptima para su aplicación.