2012-01-28 9 views
3

返された型/値の属性を、何らかの形で、拘束のない型を返す関数の中から参照できるかどうかは疑問です。私が知っている関数の戻り値の型の属性を参照することは可能ですか?

function f return std_logic_vector is begin 
    -- how do we access attributes of what we are returning? 
    -- "return_type" is a placeholder for it here, it would be nice if 
    -- this information propagated up into the function based on the way 
    -- the function's result is used when invoked 
    return (return_type'high - 2 downto return_type'low + 1 => '0', others => '1'); 
end function; 
signal x: std_logic_vector(7 downto 0); 
signal y: std_logic_vector(11 downto 0); 
[...] 
x <= f; -- expect x = "11000001" 
y <= f; -- expect y = "110000000001" 

:たとえば(?制約も、何かがそうではない私に語った、と戻り値の型の制約が実際に関数の内部で返されているものによって決定されていることをすべての機能にまで伝播してください)これはそうのように、パラメータとして関数に所望のタイプのものを渡すことによって、周りのハッキングすることができますが、私は可能であればそれを避けるしたいと思います:それは問題にした場合

function f(hint: std_logic_vector) return std_logic_vector is 
    variable retval: std_logic_vector(hint'range); 
begin 
    retval := (hint'high - 2 downto hint'low + 1 => '0', others => '1'); 
    return retval; 
end function; 
signal x: std_logic_vector(7 downto 0); 
signal y: std_logic_vector(11 downto 0); 
[...] 
x <= f(x); -- x = "11000001" 
y <= f(y); -- y = "110000000001" 

、私は、Quartusを使用していますし、この合成する必要があります。コードの2番目のブロックはうまく動作すべきです(私は間違いを犯していないと仮定します)。しかし、これを達成するためのよりよい方法があるのだろうかと思います。

これらは、人為的な例であり、もちろんこれらの値を割り当てる簡単な方法があります。私は一般的に余分なパラメータを渡すハックを避ける良い方法があるかどうか尋ねています。

+0

誰でもLRMトラフ掘ると関連する何かを見つけましたか?最初のコードを実行しようとすると、あなたのシミュレータは何を言っていますか? – Philippe

答えて

1

戻り値の型として拘束されていない配列を使用すると、関数は入力値の範囲に基づいて、返す値を決定する責任があります。戻り値の範囲は入力範囲と同じでもかまいません(複数の配列を連結したり、結果のオーバーフローを避けるためにビット幅を増やしているなど)。

あなたの関数には入力がないので、これは簡単にはできません。私は定数にすると思います。 :)

それはあなたのコードが変更された場合何をする必要があるか、もう少し明らかです:

-- from: 
x <= f; 

-- to: 
x <= f(x); 
+0

OK、これは、私がケースであったと思われるものと完全に同意します。 –

+0

引数のない関数は定数ではありません。 VHDLは機能に副作用を許します! – Philippe

関連する問題