Cocotb, используя дженерики / параметры в симуляции уровня ворот

Я успешно настроил среду проверки Cocotb для своего дизайна, и я счастлив, что она работает для RTL (в моем случае VHDL).

Мой дизайн использует дженерики, и я получаю значение этих дженериков в нескольких местах кода Python (в основном в run_test и в модели), следуя шаблону:
my_generic = dut.GEN_NAME.value

К сожалению, это не работает в случае имитации уровня затвора, так как мой синтезированный дизайн больше не имеет обобщений, и поэтому dut.GEN_NAME.value не существует.

Должен ли я двигаться в направлении получения значений параметров / обобщений из потока моделирования (make-файл Cocotb)?

Если так, какой самый чистый способ сделать это? Используете переменную env?

(Кстати, я использую Questa, даже если я не ожидаю, что этот аспект будет зависеть от симулятора...)

Спасибо за вашу помощь и ваши советы...

1 ответ

Решение

Передача конфигурации в код Python Cocotb может быть возможной, но она подвержена ошибкам, поскольку необходимо убедиться, что переданы те же значения, которые использовались для синтеза.

Другое решение состоит в том, чтобы иметь пакет конфигурации для объекта верхнего уровня, хранящийся в отдельном файле, например, top_config.vhdl с содержанием:

library ieee;
use ieee.std_logic_1164.all;

package top_config is

  constant AA : positive := 5;
  constant BB : integer := 10;

end package top_config;

Определенные здесь константы затем используются в качестве значений по умолчанию для обобщений сущности верхнего уровня или непосредственно внутри сущности верхнего уровня.

Теперь пакет можно проанализировать с помощью некоторого кода Python в тестовом стенде Cocotb:

from re import compile as re_compile

constantRegExpStr  = r"^\s*constant\s*"   # keyword and spaces
constantRegExpStr += r"(?P<name>\w+)"     # name fo constant
constantRegExpStr += r"\s*:\s*"           # divider and spaces
constantRegExpStr += r"(?P<type>\w+)"     # type name
constantRegExpStr += r"\s*:=\s*"          # assignment and spaces
constantRegExpStr += r"(?P<value>[0-9]+)" # value
constantRegExpStr += r"\s*;"              # end of statement

constantRegExp = re_compile(constantRegExpStr)


with open("top_config.vhdl") as f:
    for line in f.readlines():
        m = constantRegExp.match(line)
        if m is not None:
            print("constant '{0}' with value '{1}'".format(m.group('name'), m.group('value')))

Вместо того, чтобы печатать совпадения, вы можете добавить его в словарь или сделать что-то еще.

Другие вопросы по тегам