Diseño de depuración JTAG para un procesador [cerrado]

0

Mi profesor está diseñando un procesador basado en OpenRisc. Me ha dicho que configure un entorno de depuración JTAG en su procesador. Ahora, me dio algunos documentos que contienen el controlador TAP, la Interfaz de depuración avanzada, el módulo AXI y un núcleo de CPU interconectados entre sí. Hice mi investigación en internet. Aprendí que el controlador TAP generalmente está en un chip que se interconecta con los pines TDI y TDO del procesador. ¿Podría alguien explicarme qué es la unidad de depuración interna en el procesador?

    
pregunta Yash Karundia

1 respuesta

2

La interfaz JTAG está estandarizada, por lo que no queda mucho por diseñar. Debe implementar la máquina de estado estándar que maneja TMS y el manejo de los diversos registros de turnos que se pueden conectar a TDI y TDO .

La implementación de un circuito de depuración generalmente implica aceptar datos que se desplazan a través de TDI , generalmente hay un registro de longitud fija, el IR y uno o más registros de longitud variable que se pueden conectar al DR ruta.

En general, desea implementar al menos los siguientes comandos en el IR :

  • BYPASS (todos): conecte un registro de un bit sin función durante DR .
  • BOUNDARY_SCAN (normalmente, todos los ceros): conecte un registro que contenga un bit para cada pin de E / S en el paquete a DR , cargue el estado actual durante CAPTURE-DR y escriba el nuevo estado durante UPDATE-DR .

Para procesadores con capacidades de depuración más inteligentes, también desea un tercer modo en el que la interfaz de depuración esté conectada a DR , e idealmente un cuarto modo en el que pueda leer un código de identificación para identificar el chip. También puede usar valores IR adicionales si eso es útil, pero para un diseño simple, empezaría con

  • BOUNDARY_SCAN (0b00)
  • IDCODE (0b01)
  • DEBUG (0b10)
  • BYPASS (0b11)

Precargue IR con la instrucción IDCODE durante CAPTURE-IR , lo que facilitará el escaneo del bus (para que funcione, IDCODE debe ser todo cero, excepto para el LSB; mire el < a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0413c/Babeagge.html"> Implementación ARM para un ejemplo).

El DR para el comando DEBUG es lo que necesita diseñar. Tiene total libertad para crear cualquier asignación que desee, y la asignación ideal depende de la arquitectura de su procesador. Su interfaz de depuración puede ignorar el cambio, y simplemente implementar un bus de datos paralelo síncrono: cada vez que ingresa el estado CAPTURE-DR mientras el IR es DEBUG , se transfiere una palabra desde el FIFO saliente y cada vez que ingresa UPDATE-DR en el modo DEBUG , una palabra se transfiere al FIFO entrante.

En general, desea al menos la siguiente funcionalidad:

  • Definir puntos de interrupción de código
  • Definir puntos de interrupción de datos
  • Defina las instrucciones de punto de interrupción (para que obtenga puntos de interrupción infinitos al reemplazar las instrucciones)
  • Lee y altera el estado de la CPU
  • Copie los valores de registro al depurador
  • Copie los datos del depurador a los registros
  • Copie los datos de la memoria al depurador
  • Copie los datos del depurador a la memoria
  • Ejecutar instrucciones arbitrarias
  • Probar si la CPU se está ejecutando actualmente
  • Detener ejecución
  • Ejecutar instrucciones individuales desde el estado actual
  • Reiniciar ejecución
  • Anule si las interrupciones están habilitadas (esto hace su vida mucho más fácil cuando tiene un temporizador periódico pero desea depurar otra cosa)

Algunos de estos pueden superponerse. Una vez más, ver la forma en que se implementa en ARM tal vez no sea la peor idea:

  • La memoria de escritura se puede lograr escribiendo en los registros, y luego ejecutando una instrucción de "almacenamiento" normalmente.
  • Los registros de escritura pueden lograrse conectando el bus de datos a la interfaz de exploración de límites y emitiendo una instrucción de "carga"
  • Se puede detener la CPU definiendo un punto de interrupción que se activará en cualquier instrucción
  • La instrucción de punto de interrupción se puede definir con un punto de interrupción de datos que se activa en un valor específico durante una transferencia de datos que está etiquetada como una búsqueda de instrucciones

Si tiene un diseño canalizado en el que es posible que deba completar las instrucciones antes de que se establezca el estado de la máquina, use el estado RUN-TEST/IDLE para eso: genere un impulso de reloj cada vez que pase por allí y tenga una forma de averiguarlo el DR en el modo DEBUG si la canalización está vacía. Es completamente aceptable requerir que un depurador pase por RUN-TEST/IDLE cuatro veces después de dar un comando para detener la ejecución, que solo se convierte en parte de la interfaz.

En general, es preferible mantener la implementación en el chip lo más simple posible y manejar toda la complejidad en el lado del host, por ejemplo, el ARM incrementa el PC con cada instrucción que ejecuta, por lo que el controlador de depuración debe mantener un registro de cuántas instrucciones emitió y corregir el PC antes de reiniciar.

    
respondido por el Simon Richter

Lea otras preguntas en las etiquetas