Leer y escribir en un archivo simultáneamente.

Tengo un módulo escrito en System Verilog que descarga el contenido de la SRAM en un archivo. Me gustaría leer este archivo y usar los datos en un progtwig separado escrito en python, pero en tiempo real. No tengo mucho control sobre la escritura del código verilog. ¿Es posible gestionar de alguna manera las dos lecturas y escrituras? Actualmente, cuando se lee en el archivo, hay un número (aparentemente) aleatorio insertado al comienzo de cada línea y que arroja el análisis. Asumo que estos prefijos solo aparecen cuando están leyendo y escribiendo al mismo tiempo porque si los ejecuto muy lentamente, funciona bien.

window = Tk() canvas = Canvas(window, width=WIDTH, height=HEIGHT, bg="#000000") canvas.pack() img = PhotoImage(width=WIDTH, height=HEIGHT) canvas.create_image((WIDTH/2, HEIGHT/2), image=img, state="normal") def redraw(): fp = open('test_data.txt','r') lines=fp.readlines() for i in range(len(lines)): #do stuff fp.close() window.after(35,redraw) window.after(35,redraw) mainloop() 

Esto es lo que está leyendo.

Cualquier sugerencia es apreciada.

Es probable que la lectura y escritura de un archivo de varios procesos sea impredecible.

Si está ejecutando un sistema similar a Unix, podría usar mkfifo para crear un objeto mkfifo a un archivo en el que pueda escribir y leer simultáneamente y los datos permanecerán en el orden correcto.

En Windows, necesita un NamedPipe, que puede crear desde Python y luego conectarse abriéndolo como un archivo normal en SystemVerilog (¡creo!)

http://docs.activestate.com/activepython/2.4/pywin32/win32pipe.html

Sugeriría utilizar VPI para acceder directamente a los contenidos de la SRAM directamente desde la simulación. Esto también abre la posibilidad de ajustar dinámicamente su estímulo (p. Ej., Enviar datos hasta que la FIFO esté completa) en lugar de confiar en los archivos para entrada / salida.

Ya que estás usando Python, puedes mirar Cocotb , un framework de código libre de Python. Básicamente, puede usar la notación de ‘punto’ de python para atravesar la jerarquía de diseño y extraer valores:

 # Pull out the values from the simulation for index in range(len(dut.path.through.hierarchy.ram)): val = dut.path.through.hierarchy.ram[index].value.integer # do stuff 

Creé un ejemplo rápido en EDA Playground con un ejemplo simplista: http://www.edaplayground.com/s/57/565

Descargo de responsabilidad : Soy uno de los desarrolladores de Cocotb.

Puede usar pipe, en este ejemplo, una línea de comando cmd (windows) escribe en el pipe, luego el progtwig muestra su salida del mismo pipe:

 import subprocess,sys p = subprocess.Popen("netsatat",shell=False ,stdout=subprocess.PIPE) while True: out = p.stdout.readline() if out == '' and p.poll() != None: break if out != b'': print(out.decode('ascii','backslashreplace')) else : break;