1

テストベンチの場合、外部名を使用して DUT 内の信号を読み取ろうとしています。これらの信号を DUT の外部にエクスポートすることは望ましくないため、ここでは外部名を使用することが最善の選択肢であると結論付けました。

残念ながら、for generateDUT にはいくつかのステートメントがあり、これにより、何らかの理由で 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;
4

2 に答える 2

0

配列信号を参照しないのはなぜですか? 相対パスでは、次のとおりです。

alias signal_name is <<DUT_block.signal_name : std_logic_vector>> ; 

std_logic_vector のインデックス範囲を指定する必要がないことに注意してください。

絶対パス(私がよく使用するもの)では、次のとおりです。

alias signal_name is <<.tb_name.DUT_block.signal_name : std_logic_vector>> ; 

また、これらをテストベンチに配置する場合は、DUT のインスタンスの後 (プロセスまたはブロックの宣言領域) に配置する必要があることに注意してください。

于 2020-10-21T15:05:20.520 に答える