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

这就是阅读。

任何建议表示赞赏。

4

3 回答 3

2

从多个进程读取和写入文件可能是不可预测的。

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

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

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

于 2013-04-16T08:29:32.740 回答
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 开发人员之一。

于 2013-12-11T14:25:59.373 回答
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;
于 2017-09-27T23:34:55.210 回答