零模拟时间

马尔科·科佐莫拉(Marko Kozomora)

我正在创建某种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_model_drv模块中,您将使用他们的yield语句在两个输出接口上同步输出数据对于PyGears,这意味着您需要在继续操作之前确认这两个接口上的数据。ram_write_op模块通过write_addrwrite_data参数连接到这两个接口在该模块内部,write_addr只有接口读取了多个数据后,您才接口确认数据write_data,因此存在死锁,并且PyGears模拟器检测到无法进行进一步的模拟步骤,并在步骤0结束时退出。

驱动程序中还有两个其他问题:

  1. 它永远不会eot为输出数据生成一个Queue相反,eot应在时生成i == matrix[command_id].size - 1
  2. 这些async模块由PyGears无限循环地运行,因此ram_model_drv除非您明确生成GearDone异常,否则将无休止地生成数据。

好,回到主要问题。有几种方法可以绕过它:

  1. 使用去耦

    为此,您首先需要将数据输出分成两个yield语句,一个用于write_addr,另一个用于write_data,因为ram_write_op每几个写入数据将只使用一个地址。

    @gear
    async def ram_model_drv(*, addr_bus_width, data_type) -> (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):
            yield (command_id, None)
            for i in range(matrix[command_id].size):
                yield (None, (matrix[command_id][i], i == matrix[command_id].size - 1))
    
        raise GearDone
    

    您可以使用dregdecouple模块之一临时存储来自的输出数据,ram_model_drv然后再将其使用ram_write_op

    out = ram_model(stimul[0] | decouple, stimul[1] | decouple)

  2. 将驱动程序分为两个模块,一个驱动两个接口

  3. 对接口使用低级同步API

    yield机制下有一个用于通过PyGears接口进行通信的较低级别的API。可以通过module().dout字段获取输出接口的句柄数据可以通过接口发送,而无需等待使用put_nb()方法进行确认以后,为了等待确认,ready()可以等待方法。最后,put()方法将两者结合在一个调用中,因此它将发送数据并等待确认。

    @gear
    async def ram_model_drv(*,
                            addr_bus_width=b'asize',
                            data_type=b'dtype') -> (Uint[8], Queue['data_type']):
    
        addr, data = module().dout
    
        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):
            addr.put_nb(command_id)
    
            for i in range(matrix[command_id].size):
                await data.put((matrix[command_id][i], i == matrix[command_id].size - 1))
    
            await addr.ready()
    
        raise GearDone
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

节省特定的模拟时间

来自分类Dev

模拟包装时间功能

来自分类Dev

非零均值的ar(1)模拟

来自分类Dev

秒表时间始终为零

来自分类Dev

Windows模拟令牌过期时间

来自分类Dev

按时间正确缩放模拟

来自分类Dev

AS3思考时间模拟

来自分类Dev

R中的时间序列模拟

来自分类Dev

pytest - 模拟过程和时间

来自分类Dev

Slack bot的零宕机时间部署

来自分类Dev

弹出时间为零的dispatch_after()

来自分类Dev

PHP的日期时间差异返回零

来自分类Dev

设置超时时间为零秒

来自分类Dev

归零问题-超出时间导致错误

来自分类Dev

Flutter:从时间格式中删除前导零

来自分类Dev

熊猫按时间序列计数零

来自分类Dev

按产品和时间分组,并包含零

来自分类Dev

设置超时时间为零秒

来自分类Dev

Angular App的零停机时间部署

来自分类Dev

在日期和时间中添加前导零

来自分类Dev

归零问题-超出时间导致错误

来自分类Dev

从最近的零交叉开始的R时间

来自分类Dev

时间格式和前导/后缀零/空格

来自分类Dev

哪些模拟框架允许对遗留代码进行零更改?

来自分类Dev

如何从rnorm函数中消除模拟数据中的零

来自分类Dev

如何从rnorm函数中消除模拟数据中的零

来自分类Dev

如何从rnorm函数中消除模拟数据中的零

来自分类Dev

如何从rnorm函数中消除模拟数据中的零

来自分类Dev

模拟零重力风格的玩家移动