cocotb v1.0 と ghdl 0.35-dev (llvm と gcc バックエンド) を使用しています。
最上位には、単純な for generate ステートメントが含まれています。
gen_pe : for i in 1 to 4 generate
...
end generate gen_pe;
「dut.gen_pe[1]」を使用して、cocotb テストベンチで最初に生成されたモジュールにアクセスしようとしました。次のエラーが発生します。
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)
残念ながら、有効な Python 構文ではないため、"dut.(1)" でそれらにアクセスすることはできません。
次に、cocotb/tests/test_cases/test_array からテスト配列 testcase を実行しようとしました:
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-module 名がコンソールに出力されます。(1) ... (4)
gen_pe(1) ... gen_pe(4)
アップデート:
gpi モジュール名は、最新バージョンの ghdl で修正されています。ただし、cocotb テスト配列のテストケースはまだ失敗しています。