Python 零模拟时间
我正在创建某种RAM内存。这个想法首先是创建RAM“写”功能,正如您在下面的代码中所看到的。除了RAM内存之外,还有RAM模型驱动程序,用于将数据写入RAM(只是为了简要验证写入功能是否正常工作)。 RAM模型驱动程序和RAM模型相互连接,应该会发生一些事务,但问题是模拟在零模拟秒内完成。 有人知道什么是问题吗Python 零模拟时间,python,pygears,Python,Pygears,我正在创建某种RAM内存。这个想法首先是创建RAM“写”功能,正如您在下面的代码中所看到的。除了RAM内存之外,还有RAM模型驱动程序,用于将数据写入RAM(只是为了简要验证写入功能是否正常工作)。 RAM模型驱动程序和RAM模型相互连接,应该会发生一些事务,但问题是模拟在零模拟秒内完成。 有人知道什么是问题吗 @gear def ram_model(write_addr: Uint, write_data: Queue['dtype'],*,
@gear
def ram_model(write_addr: Uint,
write_data: Queue['dtype'],*,
ram_mem = None,
dtype = b'dtype',
mem_granularity_in_bytes = 1) -> (Queue['dtype']):
if(ram_mem is None and type(ram_mem) is not dict):
ram_mem = {}
ram_write_op(write_addr = write_addr,
write_data = write_data,
ram_memory = ram_mem)
@gear
async def ram_write_op(write_addr: Uint,
write_data: Queue,*,
ram_memory = None,
mem_granularity_in_bytes = 1):
if(ram_memory is None and type(ram_mem) is not dict):
SystemError("Ram memory is %s but it should be dictionary",(type(ram_memory)))
byte_t = Array[Uint[8], mem_granularity_in_bytes]
async with write_addr as addr:
async for data, _ in write_data:
for b in code(data, byte_t):
ram_memory[addr] = b
addr += 1
@gear
async def ram_model_drv(*,addr_bus_width = b'asize',
data_type = b'dtype') -> (Uint[8], Queue['data_type']):
num_of_w_comnds = 15
matrix = np.random.randint(10, size = (num_of_w_comnds, 10))
for command_id in range(num_of_w_comnds):
for i in range(matrix[command_id].size):
yield (command_id, (matrix[command_id][i], i == matrix[command_id].size))
stimul = ram_model_drv(addr_bus_width = 8, data_type = Fixp[8,8])
out = ram_model(stimul[0], stimul[1])
sim()
以下是输出消息:
python ram_model.py
- [INFO]: Running sim with seed: 3934280405122873233
0 [INFO]: -------------- Simulation start --------------
0 [INFO]: ----------- Simulation done ---------------
0 [INFO]: Elapsed: 0.00
是的,这个有点复杂。问题的要点是,在
ram\u model\u drv
模块中,您在其两个输出接口上同步输出数据,它们yield
语句。对于PyGears,这意味着您希望在继续之前确认这两个接口上的数据。ram\u write\u op
模块通过write\u addr
和write\u data
图形连接到这两个接口。在该模块内,只有在从write_data
接口读取多个数据后,您才确认write_addr
接口的数据,因此出现死锁,PyGears模拟器检测到不可能执行进一步的模拟步骤,并在步骤0结束时退出
驱动程序中还有两个附加问题:
队列
生成eot
。相反,当i==matrix[command\u id].size-1时,应该生成eot
async
模块,因此您的ram\u model\u drv
将无休止地生成数据,除非您显式生成GearDone异常yield
语句,一个用于write\u addr
,另一个用于write\u data
,因为ram\u write\u op
只会对多个写入数据使用一个地址
@gear
异步定义ram_模型_drv(*,地址总线宽度,数据类型)->(Uint[8],队列['data_type']):
总数量=15
矩阵=np.random.randint(10,大小=(共有个数,10))
对于范围内的命令id(命令的数量):
产量(命令id,无)
对于范围内的i(矩阵[command\u id]。大小):
产量(无,(矩阵[command_id][i],i==矩阵[command_id].size-1))
升起齿轮
您可以使用dreg
或decouple
模块临时存储ram\u model\u drv
的输出数据,然后再由ram\u write\u op
使用
out=ram\u模型(stimul[0]|解耦,stimul[1]|解耦)
yield
机制下,有一个用于通过PyGears接口进行通信的低级API。输出接口的句柄可以通过module().dout
字段获得。可以使用put\u nb()
方法通过接口发送数据,而无需等待确认。稍后,为了等待确认,可以等待ready()
方法。最后,put()
@gear
异步定义ram_模型_drv(*,
地址总线宽度=b'asize',
数据类型=b'dtype')->(Uint[8],队列['data'u type']):
地址,数据=模块().dout
总数量=15
矩阵=np.random.randint(10,大小=(共有个数,10))
对于范围内的命令id(命令的数量):
地址put\u nb(命令id)
对于范围内的i(矩阵[command\u id]。大小):
等待数据.put((矩阵[command\u id][i],i==矩阵[command\u id].size-1))
等待地址就绪()
升起齿轮