2013-04-13 3 views
0

У меня есть модуль, написанный в System Verilog, который сбрасывает содержимое SRAM в файл. Я хотел бы прочитать из этого файла и использовать данные в отдельной программе, написанной на python, но в режиме реального времени. У меня нет большого контроля над написанием кода 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() 

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

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

+2

Это мне кажется плохой идеей, и вам нужен другой способ контроля, когда один процесс может читать данные, созданные другим в файле, например, используя fifo. «Случайный материал», который вы читаете, может быть вызван тем фактом, что вы читаете * строки. * Если полный контент «ab \ ncd \ nef \ n», это три строки; но если частичный файл содержит «ab \ nc», он будет считаться двумя строками, а когда больше будет позже, «d \ nef \ n» будет считаться двумя дополнительными строками. –

+0

Как насчет использования [sqlite] (http://www.sqlite.org/), который является очень простой автономной базой данных. Python говорит об этом с помощью [sqlite3] (http://docs.python.org/2/library/sqlite3.html), но вам нужно будет связать код C/C++ с вашим симулятором verilog в качестве системной задачи или DPI позвоните, чтобы заставить Verilog говорить об этом. –

+1

Использовать файлы для общения в режиме реального времени звучит как плохая идея. Можете ли вы изменить код SystemVerilog для вызова функции DPI вместо записи в файл? – dwikle

ответ

2

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

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

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

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

1

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

Поскольку вы используете Python, вы можете посмотреть в Cocotb, структуру косимуляции с открытым кодом 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 площадке с упрощенным например: http://www.edaplayground.com/s/57/565

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

0

Вы можете использовать трубу, в этом примере CMD (окна) из командной строки пишет в трубе, то программа показывает свой выход из той же трубы:

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; 
Смежные вопросы