Estimados,
Van algunos detalles sobre el funcionamiento de master_read_8 y sus efectos en la práctica 4.
En el caso de una *lectura* con master_read_8 lo que termina pasando es que el sistema termina haciendo una lectura de 32 bits y descartando los bytes que no se necesitan.
Eso quiere decir que, por ejemplo, si hacen un master_read_8 $jtag_master 0x03 1 con el objetivo de leer un byte de la dirección 0x03, lo que termina sucediendo es lo siguiente:
- La consola toma la dirección alineada a 32 bits que contiene la dirección 0x03; es decir la dirección 0x00.
- Hace una lectura de 32 bits a la direccion alineada, es decir, lee 4 bytes en las direcciones 0x00, 0x01, 0x02, 0x03 respectivamente. Esto se refleja en 4 lecturas del lado wishbone.
- La consola se queda solo el dato correspondiente a la direccion 0x03 y descarta el resto.
Noten entonces que al hacer un master_read_8 a una direccion en particular, en realidad el sistema va a estar haciendo lecturas a otras tres direcciones más.
Por ejemplo, en el mapeo de dispositivos de la práctica 4:
0x00 (REG), 0x01(fifo), 0x02(signal_rd) 0x03(???)
Si uno hace un master_read_8 a la dirección 0x02 para leer signal_rd, lo que sucederá será que hay una lectura a la 0x00 (registro), otra a la 0x01 (fifo!), otra a signal_rd y otra a la dirección 0x03 ("vacia", cuya decodificación depende de su lógica de interconexión).
Esto deja ver dos (posibles) inconvenientes:
- 1. Una lectura *desde la consola* a signal_rd termina generando además una lectura al fifo. Esto es un problema porque ese dato del fifo se perdió. Obviamente no es problema para el registro ya que la lectura a un registro es idempotente.
- 2. Una lectura *desde la consola* a cualquiera de las direcciones 0x00, 0x01 o 0x02 terminará tambien generando un ciclo de lectura WB a la dirección 0x03. Dependiendo de como hayan armado ustedes su sistema, podría suceder que nadie responda al pedido de lectura del maestro con un ACK=1, con lo cual el maestro (y por tanto la consola) quedarán esperando hasta la eternidad un dato que nunca va a llegar.
La solución a 1., que no es realmente un problema sino mas bien un detalle del funcionmiento de la consola, puede ser mapear el fifo en un rango de direcciones alineado a 32 bits en el cual no existan otros esclavos. No es necesario que lo hagan, pero sean conscientes de lo que está ocurriendo.
La solución a 2, bueno, esa les queda para pensar. :-)
Finalmente vale aclarar que todo esto *NO* es problema en el caso de *escrituras*. Un master_write_8 solo genera un único ciclo de escritura a la dirección especificada.
Saludos,
Leonardo.