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')))
Вместо того, чтобы печатать совпадения, вы можете добавить его в словарь или сделать что-то еще.