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
解压变量 i
和 last
中的 2 个元素的序列 - 通常使用此模式和迭代器生成对,如 enumerate
:for i,element in enumerate(some_sequence):
我想通了。
- 可以使用 async with 或 async for
访问队列输入数据
- Async for 将 Queue 接口 解压为 data 和 EOT 变量
- 通过发出 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
下面是 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
解压变量 i
和 last
中的 2 个元素的序列 - 通常使用此模式和迭代器生成对,如 enumerate
:for i,element in enumerate(some_sequence):
我想通了。
- 可以使用 async with 或 async for 访问队列输入数据
- Async for 将 Queue 接口 解压为 data 和 EOT 变量
- 通过发出 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