2016-10-27 1 views
4

私は、レコードのstd_logic_vector表現を返すVHDL関数を持っており、そのstd_logic_vectorの長さが必要です。私は長さの属性を関数上で直接使用することができます。 ModelSimで警告が表示されるのはなぜですか?微妙な問題を招いていますか?私が理解しているものは、警告テキストをグーグルで見つけても役に立たなかった。VHDL - 長さ属性を直接関数に使用すると警告が表示されるのはなぜですか?

my_function_returns_slv(my_record)'length; 

**警告:../src/my.vhd(line#):(VCOM-1515が事前定義された属性 "長さ" の)接頭辞は、関数呼び出し "my_function_returns_slv"

私は、レコード要素のstd_logic_vector表現を連結して出力​​をアセンブルする関数を書いています。レコードの長さはコンパイル時に固定されていますが、長さをハードコードしたくありません。関数出力を使用するための信号を作成するためには長さが必要です。したがって、出力を保持するために拘束されていない信号を宣言することはできないため、関数の出力(たとえば、関数の出力を保持する信号の長さを呼び出すこと)で 'length'を呼び出すことはできません。私はstd_logic_vectorの長さを計算するために同様の関数を書くことができますが、それは私が持っているレコードの数について、特に重要なコードを追加します。私はModelSimの警告を受け入れ続けなければなりませんか?レコードのビット幅を組み立てるための関数を書く余分なコードを扱うべきですか?もっと良い解決策はありますか?私が利用しています

参考記録パック/アンパックサブプログラム:

http://www.eda-twiki.org/twiki/pub/P1076/RecordReflectionToSlv/standard_functions.vhd

ありがとう!

答えて

2

'lengthの属性を関数に直接使用することは、関数の結果のうちの主要な出力よりも別の部分を取ったものとみなすことができます。したがって、概念的な観点からは何も問題はありません。

私はModelSimの警告に同意しますが、ツールが建設を心配していることを示すために使用します。合成ツールとコードチェッカーは、関数呼び出しで直接この属性の使用を受け入れます。

function len(slv : std_logic_vector) return natural is 
begin 
    return slv'length; 
end function; 

と、これはModelSimの警告にはなりません:

はあなたのように機能させることにより、ModelSimの警告を避けることができると思わ

signal MY_LEN : natural := len(slv_not(CONST)); 

ので、避けることができることこのようなカプセル化を使用した警告は、最初は警告が少し薄れていることを確認します。

+1

'my_function_returns_slv(my_record) 'length'が正当であるかどうかは、長さ属性接頭辞の要件をAda 83 LRMの-1987 LRMに転記することに起因します。 [Issue Report 1005(-1993)](http://web.archive.org/web/20120217010956/http://www.eda.org/isac/IRs-VHDL-93/IR1005.txt) - タイプミス意味が一致する必要はないはずであり、「配列オブジェクトには適切」であるべきではないという論理的根拠はどこでも定義されていません。 – user1155120

+0

ありがとう@ user1155120!私はちょうどLRMと標準プロセスに精通し始めています。この歴史的な情報は私にとってとても興味深いものです。 –

+1

ありがとう@モルテン!長さの呼び出しを関数でカプセル化すると、私の環境でも警告が取り除かれます。割り当てようとしている信号を制約する必要があると私は考えていました。どのような創造的な解決策!私は、私の合成ツール(Quartus)がmy_func()の長さに警告を表示していないことを後世にも報告すると思った。 –

1

"関数出力を使用するための信号を作成するには長さが必要です。したがって、関数の出力に長さを呼び出すことはできません(例:関数出力を保持する信号の長さを呼び出します)。出力を保持するために拘束されていない信号を宣言することはできません。

サイズの信号の周りに楽しい作品です:

constant MY_CONST : std_logic_vector := my_function_returns_slv(my_record) ; 
signal MySig : std_logic_vector(MY_CONST'range) := MY_CONST ; 

我々は信号が制約されていないことと、初期からその制約を取得することができますVHDL-2017のためのLCSを持っています。

関連する問題