Pygears - 实例化组件时未解析的数组参数

Pygears - Unresolved array argument when instantianting component

我正在尝试实现和模拟一个简单的加法器组件,将输入值加倍。下面是我的代码。

from pygears.typing import Uint
from pygears.hdl import *
from pygears.sim import sim
from pygears.lib import drv

@gear
def add(x):
    return x + x
    
    
@gear
async def collect(din, result):
    async with din as val:
        result.append(val)
    
    
result = []
drv(t=Uint[16], seq=[0, 1, 2, 3]) | add() | collect(result=result)

hdlgen('/adder', outdir='sv/adder_svlib')

sim('/adder')

尝试 运行 这段代码后,出现以下错误:

 File "test.py", line 34, in <module>
    drv(t=Uint[16], seq=[0, 1, 2, 3]) | add() | collect(result=result)
GearArgsNotSpecified: [0], Unresolved argument "[]" connected to the input "result"
 - when instantiating "collect"

为什么这个争论没有得到解决?我在“回声”示例中看到了类似的实现,其中在函数 wav_echo_sim 中将一个空数组传递给收集装置以存储值。

提前谢谢你。

PyGears 中有两种类型的齿轮(函数)参数:

  • 接口 - 可以使用位置或关键字(命名)参数指定,并且
  • compile-time 参数 - 需要声明为 keyword-only

在您的示例中,collect 齿轮需要 Python 列表作为 result 参数,但 result 参数未声明为 keyword-only ,因此 PyGears 期望在那里获得一个接口,因此出现错误消息。您的装备应声明如下(注意两个参数之间的星号“*”):

@gear
async def collect(din, *, result):
    async with din as val:
        result.append(val)

换句话说,接口和 non-interface 参数应该用星号“*”分隔。

接下来,您的 hdlgen 调用将不起作用,因为没有名为“adder”的齿轮实例。我猜您想为 add 齿轮实例生成 HDL 文件。默认情况下,实例与齿轮定义函数同名,因此在您的情况下,实例将被命名为“add”。您可以像这样显式指定实例名称:

drv(t=Uint[16], seq=[0, 1, 2, 3]) | add(name="adder") | collect(result=result)

或将 hdlgen 指定的路径更改为:

hdlgen('/add', outdir='sv/adder_svlib')

最后,sim 调用的第一个参数是应放置仿真工件(如波形、生成的 HDL 文件、日志...)的目录路径,因此您应该“ =19=]

  • 留空 - 在这种情况下将使用临时文件夹,或者
  • 指定有效的绝对或相对路径