同时读取和写入文件

时间:2013-04-13 20:09:44

标签: python file-io system-verilog

我有一个用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()

这就是阅读。

任何建议都表示赞赏。

3 个答案:

答案 0 :(得分:2)

从多个进程读取和写入文件可能无法预测。

如果您在类Unix系统上运行,可以使用mkfifo创建一个类似文件的对象,您可以同时写入和读取数据,并且数据将保持正确的顺序。

在Windows上,您需要一个NamedPipe - 您可以从Python创建,然后通过在SystemVerilog中作为普通文件打开来连接(我相信!)

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

答案 1 :(得分:1)

我建议使用VPI直接从模拟中直接访问SRAM的内容。这也开启了动态调整刺激的可能性(例如,在FIFO已满之前发送数据),而不是依赖文件进行输入/输出。

由于您使用的是Python,因此可以查看Cocotb,这是一个开源Python协同仿真框架。基本上,您可以使用python'dot'表示法遍历设计层次结构并提取值:

# 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开发者之一。

答案 2 :(得分:0)

你可以使用管道,在这个例子中,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;