ジェネリックを評価し、それに応じて属性を作成する (または作成しない) コード セグメントを作成するにはどうすればよいですか?
例 :
if G_MY_GENERIC then
attribute my_attribute_typ : string;
attribute my_attribute_typ of signal_having_an_attr : signal is "value";
else
--nothing is created
end if;
ジェネリックを評価し、それに応じて属性を作成する (または作成しない) コード セグメントを作成するにはどうすればよいですか?
例 :
if G_MY_GENERIC then
attribute my_attribute_typ : string;
attribute my_attribute_typ of signal_having_an_attr : signal is "value";
else
--nothing is created
end if;
それに似たものを書くことは完全に可能ですが、属性は generate ステートメントのスコープ内でしか見えません。
g_something: if test_condition generate
attribute my_attribute_typ : string;
attribute an_attribute of my_attribute_typ: signal is "value";
begin
-- attribute is visible in this scope
p_my_process: process(clk)
begin
-- attribute is also visible here
end process;
end generate;
-- but not here
代わりに、次のようなものを使用して条件付きで属性を設定する必要があります (面倒ですが、結果は得られます)。
signal asvRam : svRam_at(0 to gc_nFifoDepth-1) := (others => (others => '0'));
type svStr_at is array(boolean) of string(0 to 10);
constant c_svRamStyle : svStr_at := (false => " ", true => "distributed");
attribute ram_style : string;
attribute ram_style of asvRam : signal is c_svRamStyle(gc_bDistributedRam);
IEEE VHDL Working Groupで、より一般化された条件付きコンパイルについて説明しました。議論は白熱した。コンパイル時間のアプローチ ('C' に類似) を希望する人もいれば、精緻化時間のアプローチを希望する人もいました。定数はコンパイル時オブジェクトでもあるため、コンパイル時アプローチは C でうまく機能しますが、VHDL では、コンパイル時アプローチは VHDL 環境内のものを理解しないため、ジェネリックを使用することはできません。OTOH、コンパイル時のオプションは、おそらくベンダー名、ツールタイプ(シミュレーター、合成など)を提供します...
あなたのコードを要件として提案ページに追加しました。http://www.eda.org/twiki/bin/view.cgi/P1076/ConditionalCompilationにあります。
あなたのアプリケーションに関する追加の洞察を喜んで共有する場合は、それも提案に追加したいと思います.
基本的に、これはまさに VHDL が機能しない方法です。VHDL では、ハードウェアの特定のビットを使用する意図を宣言すると、シンセサイザーはそれらのハードウェアのビットを接続しようとします。ループのようなハードウェアを動的に作成する類似性for ... generate
は、本質的には類似性にすぎません。痛みを取り除くための構文糖衣です。
できることは、条件付きでシグナル/変数に割り当てることです。
process (sig1, sig2, enable) is
begin
if enable = '1'
then
out <= sig1;
else
out <= sig2;
end if;
end process;