テストベンチの場合、外部名を使用して DUT 内の信号を読み取ろうとしています。これらの信号を DUT の外部にエクスポートすることは望ましくないため、ここでは外部名を使用することが最善の選択肢であると結論付けました。
残念ながら、for generate
DUT にはいくつかのステートメントがあり、これにより、何らかの理由で DUT の外部に信号を割り当てることが非常に困難になっているようです。
これらの生成システムの 1 つが次のようになります。
gen_block : for i in 0 to gen_loops generate
entity_block : entity_name
port map(
signal_name => signal_name
);
end generate;
最初の生成の外部名の定義は、次のようにして std_logic_vector 信号に入れることができますalias_signal
。
alias_signal(0) <= <<DUT_name.gen_block(0).entity_block.signal_name : std_logic>>
これは正しく動作します。ただし、 の値が大きいgen_loops
ため、関連する生成インデックスに対応するインデックスを使用して、外部 std_logic 信号を std_logic_vectors に割り当てたいと考えています。
私が最初に試したのは、インデックスを除外し、外部名を std_logic_vector として定義することでした。
alias_signal <= <<DUT_name.gen_block.entity_block.signal_name : std_logic_vector>>
Sigasi によると、これはまったく問題ありませんが、Questasim でコンパイルすると、これを行う行ごとに次のエラーが発生します。
# ** Error: [location][line]: (vopt-1571) Index required for FOR GENERATE "gen_block".
これは、何があってもインデックスを使用する必要があることを意味すると思います。
次の明らかなステップは、変数for_val
を指定した for ループを使用して、 のすべての反復に対処することですentity_block
。
for for_val in 0 to gen_loops loop
alias_signal(for_val) <= <<DUT_name.gen_block(for_val).entity_block.signal_name : std_logic>>
end loop;
奇妙なことに、これにより Sigasi でエラーが発生し、「に対応する宣言が見つかりませんでした」と主張しますfor_val
。どういうわけか、外部名内で for_val の値が失われ、外部名の定義がコードの残りの部分から何らかの形で分離されています。for_val の代わりに数値を書くことですべてが正常に機能することを覚えておいてください。ただし、 の値が大きいためgen_loops
、これはかなり骨の折れる作業です。
誰かが私が間違っていることを見ることができますか? この方法よりも良い方法の提案はありますか? Sigasi はばかですか、それとも私ですか? よろしくお願いします:)
以下の最小限の再現可能な例: tb_name:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity tb_name is
end entity tb_name;
architecture RTL of tb_name is
constant gen_loops : integer := 10;
signal alias_signal : std_logic_vector(gen_loops downto 0) := (others => '0');
signal clk : std_logic := '0';
begin
-- for loop approach
-- p_clk : process is
-- begin
-- loop
-- clk = '0'
-- wait for 1 ns;
-- clk = '1'
-- wait for 1 ns;
-- end loop;
-- end process p_clk;
--
-- p_alias : process(clk) is
-- begin
-- for for_val in 0 to gen_loops loop
-- alias_signal(for_val) <= << signal ^.DUT_block.gen_block(for_val).entity_block.signal_name : std_logic >> ;
-- end loop;
-- end process p_alias;
-- std_logic_vector approach
-- alias_signal <= <<signal ^.DUT_block.gen_block.entity_block.signal_name : std_logic_vector>>
-- working with index
alias_signal(0) <= << signal ^.DUT_block.gen_block(0).entity_block.signal_name : std_logic >> ;
DUT_block : entity work.DUT_name
generic map (gen_loops)
end entity DUT_block;
end architecture RTL;
DUT_名:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity DUT_name is
generic(gen_loops : natural := 10);
end entity DUT_name;
architecture RTL of DUT_name is
signal signal_name : std_logic_vector (gen_loops downto 0) := (others => '0');
begin
gen_block : for i in 0 to gen_loops generate
entity_block : entity work.entity_name
port map(
signal_name => signal_name(i)
);
end generate;
end architecture RTL;
エンティティ名:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity entity_name is
port(
signal_name : out std_logic
);
end entity entity_name;
architecture RTL of entity_name is
begin
signal_name <= '1';
end architecture RTL;