Python 同时读取和写入文件

Python 同时读取和写入文件,python,file-io,system-verilog,Python,File Io,System Verilog,我有一个用系统Verilog编写的模块,它将SRAM的内容转储到一个文件中。我想从这个文件中读取数据,并在用python编写的单独程序中实时使用这些数据。我无法控制verilog代码的编写。是否有可能以某种方式管理这两个读写操作?当前,当它从文件中读取时,在每一行的开头插入一个(似乎)随机数,这会中断解析。我假设这些前缀只有在读写同时出现时才会出现,因为如果我把它们都运行得很慢,效果会很好 window = Tk() canvas = Canvas(window, width=WIDTH, he

我有一个用系统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()
这就是阅读


感谢您的建议。

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

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

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


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

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

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


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

因为您使用的是Python,所以可以研究一个开源的Python协同模拟框架。基本上,您可以使用python“点”表示法遍历设计层次结构并提取值:

#从模拟中取出值
对于范围内的索引(len(dut.path.to.hierarchy.ram)):
val=dut.path.through.hierarchy.ram[index].value.integer
#做事
我在EDA游乐场上创建了一个简单的示例:


免责声明:我是Cocotb开发人员之一。

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

因为您使用的是Python,所以可以研究一个开源的Python协同模拟框架。基本上,您可以使用python“点”表示法遍历设计层次结构并提取值:

#从模拟中取出值
对于范围内的索引(len(dut.path.to.hierarchy.ram)):
val=dut.path.through.hierarchy.ram[index].value.integer
#做事
我在EDA游乐场上创建了一个简单的示例:


免责声明:我是Cocotb开发人员之一。

您可以使用管道,在本例中,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;

您可以使用管道,在本例中,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;

在我看来,这似乎是一个坏主意,您需要一些其他方法来控制一个进程何时可以读取文件中另一个进程生成的数据——例如使用fifo。你阅读的“随机内容”可能是因为你在读台词。如果完整内容为“ab\ncd\nef\n”,则为三行;但是,如果部分文件包含“ab\nc”,则它将被读取为两行,当以后出现更多行时,“d\nef\n”将被读取为两行额外的行。如何使用这是一个非常简单的独立数据库。Python本机使用,但您必须将C/C++代码作为系统任务或DPI调用链接到您的verilog模拟器中,才能让verilog使用它。使用文件进行实时通信听起来不是个好主意。你能修改SystemVerilog代码来调用DPI函数而不是写入文件吗?在我看来,这似乎是个坏主意,你需要一些其他方法来控制一个进程何时可以读取文件中另一个进程生成的数据——例如使用fifo。你阅读的“随机内容”可能是因为你在读台词。如果完整内容为“ab\ncd\nef\n”,则为三行;但是,如果部分文件包含“ab\nc”,则它将被读取为两行,当以后出现更多行时,“d\nef\n”将被读取为两行额外的行。如何使用这是一个非常简单的独立数据库。Python本机使用,但您必须将C/C++代码作为系统任务或DPI调用链接到您的verilog模拟器中,才能让verilog使用它。使用文件进行实时通信听起来不是个好主意。您能否修改SystemVerilog代码以调用DPI函数而不是写入文件?