私はかなり一般的なVHDLコードを書こうとしていますが、私は十分に標準を十分に理解していない状況である に入っています。 (私はVHDL-2008を使用して です。)VHDL:エンティティポートへの入力として関数によって返された制約のない配列を処理する方法は?
私は拘束されない STD_LOGIC_VECTOR(S)上で動作し、制約のない STD_LOGIC_VECTORを返す関数を書かれています。しかし、 (constrained)std_logic_vectorsを2つ渡すと、この 関数を自分のエンティティのポートへの入力として使用できないように思えます( my exampleプログラムのtest_2のインスタンス化を参照してください)。しかし、何らかの理由で私が ビット文字列リテラルを渡すとうまくいくように思えます(test_1のインスタンス化を参照)。
は、test_1のインスタンス化で非常によく似た構文を使用することが許可されている間に、私はconcatenate() 関数をtest_2のインスタンス化の入力として使用できない理由を説明できますか?
あなたの関数呼び出しは、変換機能ではなく、また、暗黙的な信号宣言を惜しまするための要件を満たしていないvcom -2008 unconstrained_example.vhd
-- test entity/architecture
library ieee;
use ieee.std_logic_1164.all;
entity test is
port (value : in std_logic_vector);
end entity;
architecture a of test is
begin
-- Intentionally empty
end architecture;
library ieee;
use ieee.std_logic_1164.all;
-- Test instantiation
entity testit is
end entity;
architecture a of testit is
signal my_constrained_slv1 : std_logic_vector(5 downto 0);
signal my_constrained_slv2 : std_logic_vector(9 downto 0);
function concatenate(value1 : std_logic_vector; value2 : std_logic_vector) return std_logic_vector is
begin
return value1 & value2;
end function;
begin
process begin
-- Using the function in this context seems to work ok
report "Value is " & to_string(concatenate(my_constrained_slv1, my_constrained_slv2));
wait;
end process;
-- This instantiation seems to work
test_1: entity work.test
port map (
value => concatenate("000000", "1111111111"));
-- For this entity instantiation I'm getting an error from ModelSim:
-- ** Error: unconstrained_example.vhd(43): (vcom-1383) Implicit signal in port map for port "value" is not fully constrained.
test_2: entity work.test
port map (
value => concatenate(my_constrained_slv1, my_constrained_slv2));
end architecture;
あなたは、私がサブタイプを定義した場合、それが動作することを右ですが、その解決策がすぐに全体以来、非常に有用ではありません私が書こうとしている関数の考え方は、最初にビット幅を指定する必要がないようにすることです。 (もっとも私を混乱させるのは、既知の幅のビットストリングリテラルが許されていますが、既知の幅のstd_logic_vectorsはこの関数への入力として許可されていません)。 – tamyrlin
ローカルおよびグローバル静的規則に関連する必要があります。 'test_1'の式は' test_2'の式とは別のものです。最初のものはローカルで静的なオペランドを持ち、局所的に定義された*純粋な関数なので、局所的な静的性を保持する必要があります。私は 'test_1'では、中間の暗黙のシグナルは含まれていないと思います。私は一致するLRMの段落を検索していません... – Paebbels