PyGears qrange gear - ValueError: [0], too many values to unpack (expected 2)

PyGears qrange gear - ValueError: [0], too many values to unpack (expected 2)

下面是 PyGears 中的代码,想法是让 DUT 将 Array 转换为 Queue,但是 dut gear 正在丢弃错误“VelueError too many values”。据我了解 qrange 应该输出具有数据队列类型的 DTI。我试图在数据和 EOT 上解压这个队列,但我一直收到这个错误。

for i, last in qrange(len(din.dtype)): ValueError: [0], too many values to unpack (expected 2), in the module "/dut"

from pygears import gear
from pygears.typing import Uint, bitw, Queue, Array
from pygears.lib import qrange, drv
from pygears.sim import sim


@gear
async def dut(din: Array) -> Queue['din[0]']:
   i = Uint[bitw(len(din.dtype) - 1)](0)

   async with din as val:
       print(len(din.dtype))
       for i, last in qrange(len(din.dtype)):
           print(i)
           print(last)
           yield val[i], last

@gear
async def check(dut_res, *, ref):
   for ref_transaction in ref:
       for element in ref_transaction:
           async with dut_res as (data, eot):
               assert element == data

seq=[[1,2,3,4,5,6,7,8],[10,20,30,40,50,60,70,80]]
drv(t=Array[Uint[8], 8], seq=seq) \
   | dut \
   | check(ref=seq)

sim()

我找不到此 qrange 的文档,但它是什么 return?它像 range 和 return 是一个数字序列吗?这将解释错误:

for i, last in qrange(len(din.dtype)): 期望 qrange return 是两个元素序列的序列。这会引发 ValueError。

i,last 解压变量 ilast 中的 2 个元素的序列 - 通常使用此模式和迭代器生成对,如 enumeratefor i,element in enumerate(some_sequence):

我想通了。

  • 可以使用 async withasync for
  • 访问队列输入数据
  • Async forQueue 接口 解压为 dataEOT 变量
  • 通过发出 ready 信号并阻止执行直到 valid 被设置
  • 来完成读取
  • 循环体执行后,检查EOT循环终止

因此在循环中的 for 之前添加简单的 async 解决了我的问题。

@gear
async def dut(din: Array) -> Queue['din[0]']:
   i = Uint[bitw(len(din.dtype) - 1)](0)

   async with din as val:
       async for i, last in qrange(len(din.dtype)):
           yield val[i], last