component のライブラリを作成したいのですが、コンポーネントは内部で 2 つの supcomponentsとにC
分割されており、これらはジェネリックによって構成可能です。サブモジュールは、ジェネリックに依存するレコードで接続する必要があります。レコードは、コンポーネント内でも使用する必要があります。通常、レコードを でインスタンス化し、サブコンポーネントのファイルとコンポーネントのファイルでパッケージを使用します。ジェネリックなので、ジェネリック パッケージ (VHDL-2008) を使用すると解決策が得られる可能性があると考えました。c1
c2
package
問題は、サブコンポーネント内からもレコードにアクセスする必要があることです。そのためには が必要ですがuse thePackage
、一般的なパッケージを使用するには、初期値を渡す必要があります (私の知る限り)。
だから私は試しました(注:ここではレコードを扱っていません。コンポーネントのパラメーターを使用してパッケージをパラメーター化(?)する汎用コンポーネントから汎用パッケージにアクセスしようとしています):
entity genericPackagePart is
generic(
outputValue : integer
);
port(
result: out integer
);
end entity;
architecture behav of genericPackagePart is
package test is new work.genericPackage
generic map(
genSize => outputValue
);
use work.test.all;
begin
result <= dummy; -- dummy is a constant from genericPackage set to the value genSize (generic parameter)
end architecture;
ただし、modelsim から次のエラーが発生します。
** Error: (vcom-11) Could not find work.test.
** Error: genericPackagePart.vhd(17): (vcom-1195) Cannot find expanded name "work.test".
** Error: genericPackagePart.vhd(17): Unknown expanded name.
** Error: genericPackagePart.vhd(19): (vcom-1136) Unknown identifier "dummy".
** Error: genericPackagePart.vhd(20): VHDL Compiler exiting
更新:
をジェネリック パッケージにラップして、そのパッケージ内からジェネリックをgenericPackagePart
使用してインスタンス化 しようとしましgenericPackage
たが、これも機能しませんでした。
フローは次のようになります。
- テストベンチ => インスタンス
genericPackagePart
化genericPackage
し、ジェネリック パラメーターを使用 - レコードは、次のテストベンチで利用できます。
genericPackage
- 内部
genericPackagePart
genericPackage
は渡されたパラメータでインスタンス化されますgenericPackagePart
- レコードは内部で利用可能です
genericPackagePart
Modelsim は Errors を返しました (はintest
のパラメーター化されたインスタンスに付けた名前です。これは のコンパイルからのものです):genericPackage
genericPackagePart
genericPackagePart
** Error: (vcom-11) Could not find work.test.
** Error: genericPackagePart.vhd(11): (vcom-1195) Cannot find expanded name "work.test".
** Error: genericPackagePart.vhd(11): Unknown expanded name.
** Error: genericPackagePart.vhd(13): near "entity": expecting END
Passing Generics to Record Port Typesを見ましたが、ジェネリックに基づくパッケージのインスタンス化の問題は解決しません。
完全を期すために、パッケージとテストベンチを以下に示します。
パッケージ:
package genericPackage is
generic(genSize : integer := 1);
constant dummy : integer := genSize;
end package;
テストベンチ:
package myGenericPackage is new work.genericPackage
generic map(
genSize => 5
);
use work.myGenericPackage.all;
entity genericPackageTestbench is
end entity;
architecture testbench of genericPackageTestbench is
signal testsignal : integer;
signal testsignal2 : integer;
signal dummy : integer := 12;
component genericPackagePart is
generic(
outputValue : integer
);
port(
result: out integer
);
end component;
begin
test : process is
begin
wait for 20 ns;
testsignal <= dummy;
wait for 20 ns;
testsignal <= work.myGenericPackage.dummy;
wait;
end process;
testPart: genericPackagePart
port map(result => testsignal2)
generic map(outputValue => 128);
end architecture;