Чтение и запись в файл одновременно

У меня есть модуль, написанный в System Verilog, который выгружает содержимое SRAM в файл. Я хотел бы прочитать из этого файла и использовать данные в отдельной программе, написанной на питоне, но в режиме реального времени. У меня нет большого контроля над написанием кода Verilog. Можно ли как-то управлять двумя операциями чтения и записи? В настоящее время, когда он читает из файла, в начале каждой строки вставляется (по-видимому) случайное число, которое прерывает синтаксический анализ. Я предполагаю, что эти префиксы появляются только тогда, когда они читают и пишут одновременно, потому что, если я запускаю их очень медленно, они работают нормально.

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()

Это то, что читает.

Любые предложения приветствуются.


person Free_D    schedule 13.04.2013    source источник
comment
Мне это кажется плохой идеей, и вам нужен какой-то другой способ контролировать, когда один процесс может читать данные, созданные другим в файле, например, с помощью fifo. Случайный материал, который вы читаете, может быть вызван тем, что вы читаете строки. Если полное содержимое ab\ncd\nef\n, это три строки; но если неполный файл содержит ab\nc, он будет прочитан как две строки, а когда позже появится больше, d\nef\n будет прочитан как две дополнительные строки.   -  person Armin Rigo    schedule 14.04.2013
comment
Как насчет использования sqlite, очень простой автономной базы данных. Python изначально говорит на нем с помощью sqlite3 , но вам придется связать его на C /C++ код в ваш симулятор Verilog в качестве системной задачи или вызова DPI, чтобы заставить Verilog говорить на нем.   -  person Ross Rogers    schedule 15.04.2013
comment
Использование файлов для общения в режиме реального времени звучит как плохая идея. Можете ли вы изменить код SystemVerilog для вызова функции DPI вместо записи в файл?   -  person dwikle    schedule 15.04.2013


Ответы (3)


Чтение и запись файла из нескольких процессов, вероятно, будут непредсказуемыми.

Если вы работаете в Unix-подобной системе, вы можете использовать mkfifo для создания файлового объекта, в который вы можете одновременно записывать и читать, и данные останутся в правильном порядке.

В Windows вам нужен NamedPipe, который вы можете создать из Python, а затем подключиться, открыв его как обычный файл в SystemVerilog (я полагаю!)

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

person Martin Thompson    schedule 16.04.2013

Я бы предложил использовать VPI для прямого доступа к содержимому SRAM прямо из моделирования. Это также открывает возможность динамической настройки вашего стимула (например, отправки данных до тех пор, пока FIFO не заполнится), вместо того, чтобы полагаться на файлы для ввода/вывода.

Поскольку вы используете Python, вы можете изучить Cocotb, платформу совместного моделирования Python с открытым исходным кодом. По сути, вы можете использовать нотацию «точка» Python для обхода иерархии дизайна и извлечения значений:

# 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

Я создал быстрый пример на EDA Playground с упрощенным примером: http://www.edaplayground.com/s/57/565

Отказ от ответственности: я один из разработчиков Cocotb.

person Chiggs    schedule 11.12.2013

Вы можете использовать канал, в этом примере командная строка cmd (windows) пишет в канал, затем программа показывает свой вывод из того же канала:

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;
person Ayoub Benayache    schedule 27.09.2017