我有一个用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()
这就是阅读。
任何建议都表示赞赏。
答案 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;