Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 零模拟时间_Python_Pygears - Fatal编程技术网

Python 零模拟时间

Python 零模拟时间,python,pygears,Python,Pygears,我正在创建某种RAM内存。这个想法首先是创建RAM“写”功能,正如您在下面的代码中所看到的。除了RAM内存之外,还有RAM模型驱动程序,用于将数据写入RAM(只是为了简要验证写入功能是否正常工作)。 RAM模型驱动程序和RAM模型相互连接,应该会发生一些事务,但问题是模拟在零模拟秒内完成。 有人知道什么是问题吗 @gear def ram_model(write_addr: Uint, write_data: Queue['dtype'],*,

我正在创建某种RAM内存。这个想法首先是创建RAM“写”功能,正如您在下面的代码中所看到的。除了RAM内存之外,还有RAM模型驱动程序,用于将数据写入RAM(只是为了简要验证写入功能是否正常工作)。 RAM模型驱动程序和RAM模型相互连接,应该会发生一些事务,但问题是模拟在零模拟秒内完成。 有人知道什么是问题吗

@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
  • PyGears以无休止的循环运行
    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]|解耦)

  • 将驱动程序分为两个模块,分别驱动两个接口

  • 对接口使用低级同步API

    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))
    等待地址就绪()
    升起齿轮