2013-04-13 234 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++代碼作爲系統任務或DPI鏈接到您的Verilog模擬器打電話讓Verilog說出來。 –

+1

使用文件實時通信聽起來像一個壞主意。您可以修改SystemVerilog代碼來調用DPI函數而不是寫入文件? – dwikle

回答

2

從多個進程讀取和寫入文件很可能是不可預測的。

如果您在類Unix系統上運行,您可以使用mkfifo來創建一個類似文件的對象,您可以同時寫入和讀取該對象,並且數據將保持正確的順序。

在Windows,你需要一個NamedPipe - 你可以從Python中創建,然後通過打開連接到如SystemVerilog中一個正常的文件(我相信!)

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

1

我會建議使用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遊樂場一個簡單的例子有一個簡單的例子: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;