#python #pygears
#python #pygears
Вопрос:
Я пытаюсь реализовать и смоделировать простой компонент сумматора, который удваивает входное значение. Ниже приведен мой код.
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"
Почему этот аргумент неразрешен? Я видел аналогичную реализацию в примере «echo», где в функции wav_echo_sim пустой массив был передан в механизм сбора, чтобы сохранить значения.
Заранее благодарю вас.
Ответ №1:
Существует два типа аргументов передачи (функции), которые различаются в PyGears:
- интерфейсы — которые могут быть указаны с использованием либо позиционных, либо ключевых (именованных) аргументов, и
- параметры времени компиляции, которые должны быть объявлены только как ключевые слова
В вашем примере collect
механизм ожидает список Python для result
аргумента, но result
аргумент не объявлен как только для ключевых слов, поэтому PyGears ожидает получить там интерфейс, отсюда и сообщение об ошибке. Ваш механизм должен быть объявлен следующим образом (обратите внимание на звездочку ‘*’ между двумя аргументами):
@gear
async def collect(din, *, result):
async with din as val:
result.append(val)
Другими словами, интерфейсы и неинтерфейсные аргументы должны быть разделены звездочкой ‘*’.
Далее, ваш вызов hdlgen не будет работать, поскольку нет такого экземпляра gear с именем «сумматор». Я предполагаю, что вы хотели сгенерировать файлы HDL для экземпляра add
gear. По умолчанию экземпляры получают то же имя, что и функция определения передач, поэтому в вашем случае экземпляр будет называться «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, журналы …), Поэтому вам следует либо»
- оставьте его пустым — в этом случае будет использоваться временная папка или
- укажите допустимый абсолютный или относительный путь