Неиспользуемые имена модулей с оператором generate в cocotb
Я использую cocotb v1.0 и ghdl 0.35-dev (llvm и gcc backend).
Верхний уровень содержит простое выражение для генерации:
gen_pe : for i in 1 to 4 generate
...
end generate gen_pe;
Я попытался получить доступ к первому сгенерированному модулю в моем тестовом стенде cocotb с помощью: "dut.gen_pe[1]". Выдает ошибку:
10000.00ns WARNING Failed to find a hdl at index 1 via any registered implementation
10000.00ns ERROR Send raised exception: gen_pe contains no object at index 1
При прохождении через dut он обнаруживает следующие подмодули из оператора generate:
10000.00ns INFO Found something: (1)(GPI_MODULE)
10000.00ns INFO Found something: (2)(GPI_MODULE)
10000.00ns INFO Found something: (3)(GPI_MODULE)
10000.00ns INFO Found something: (4)(GPI_MODULE)
К сожалению, невозможно получить к ним доступ с помощью "dut.(1)", потому что это недопустимый синтаксис Python.
Затем я попытался выполнить тестовый массив тестового массива из cocotb/tests/test_cases/test_array с помощью:
make -s SIM=ghdl TOPLEVEL_LANG=vhdl
Почти все тесты не пройдены:
*************************************************************************************************
** TEST PASS/FAIL SIM TIME(NS) REAL TIME(S) RATIO(NS/S) **
**************************************************************************************************
** test_array.test_direct_constant_indexing FAIL 2001.00 0.00 1640180.24 **
** test_array.test_direct_signal_indexing FAIL 2001.00 0.00 1048707.02 **
** test_array.test_discover_all FAIL 1001.00 0.01 145412.61 **
** test_array.test_extended_identifiers PASS 2001.00 0.00 5155283.97 **
** test_array.test_gen_loop FAIL 1001.00 0.00 1166573.58 **
** test_array.test_read_write FAIL 1000.00 0.00 860546.57 **
**************************************************************************************************
9005.00ns INFO cocotb.regression regression.py:358 in _log_sim_summary
*************************************************************************************
** ERRORS : 5 **
*************************************************************************************
** SIM TIME : 9005.00 NS **
** REAL TIME : 0.05 S **
** SIM / REAL TIME : 173326.30 NS/S **
Вывод test_gen_loop:
7004.00ns INFO cocotb.regression regression.py:287 in execute Running test 5/6: test_gen_loop
7004.00ns INFO ..tine.test_gen_loop.0x7fa35db6d4d0 decorators.py:191 in send Starting test: "test_gen_loop"
Description: Test accessing Generate Loops
8004.00ns WARNING cocotb.gpi GpiCommon.cpp:353 in gpi_get_handle_by_index Failed to find a hdl at index 20 via any registered implementation
8004.00ns ERROR ..tine.test_gen_loop.0x7fa35db6d4d0 result.py:51 in raise_error Send raised exception: asc_gen contains no object at index 20
File "/home/Programme/cocotb/cocotb/decorators.py", line 197, in send
return self._coro.send(value)
File "/home/Programme/cocotb/tests/test_cases/test_array/test_array.py", line 189, in test_gen_loop
asc_gen_20 = dut.asc_gen[20]
File "/home/Programme/cocotb/cocotb/handle.py", line 342, in __getitem__
raise IndexError("%s contains no object at index %d" % (self._name, index))
8005.00ns ERROR cocotb.regression regression.py:263 in handle_result Test Failed: test_gen_loop (result was TestError)
Это похоже на ошибку в моем дизайне. Так что я думаю, что проблема с именами модулей.
Любая идея, как получить действительные имена модулей или исправить ошибку полностью?
редактировать: минимальный пример
Папка: /home/Programme/cocotb/examples/generate
/home/Programme/cocotb/examples/generate/hdl/top.vhd
:
library ieee;
use ieee.std_logic_1164.all;
entity top is
port (
clk : in std_logic;
A : in std_logic_vector(4 downto 1);
B : out std_logic_vector(4 downto 1)
);
end top;
architecture rtl of top is
begin
gen_pe : for i in 1 to 4 generate
test : process (clk) is
begin
if (rising_edge(clk)) then
B(i) <= A(i);
end if;
end process test;
end generate gen_pe;
end rtl;
/home/Programme/cocotb/examples/generate/tests/top_cocotb.py
:
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import Timer
@cocotb.test()
def test_gen(dut):
cocotb.fork(Clock(dut.clk, 1000).start())
yield Timer(1000)
for i in dut:
print i._log.info("Found something: %s" % i._fullname)
/home/Programme/cocotb/examples/generate/tests/Makefile
:
CWD = $(shell pwd)
COCOTB = $(CWD)/../../..
TOPLEVEL_LANG = vhdl
VHDL_SOURCES = $(CWD)/../hdl/top.vhd
SIM = ghdl
CMD_BIN = ghdl
TOPLEVEL=top
MODULE=$(TOPLEVEL)_cocotb
include $(COCOTB)/makefiles/Makefile.inc
include $(COCOTB)/makefiles/Makefile.sim
sim: $(MODULE).py
После выполнения с make
, имена gpi-модуля (1) ... (4)
вместо gen_pe(1) ... gen_pe(4)
выводятся на консоль.
Обновить:
Имена gpi-модулей исправлены в новейшей версии ghdl. Однако тестовые наборы тестового массива cocotb по-прежнему не работают.