2017-03-24 16 views
0

最近、単純な数学的方程式を使用して必要なすべてのパラメータを事前計算してから、ロジックユニットを生成構造体でインスタンス化することを考えています。 2-Dパラメータが必要な場合は、2次元配列が固定値のセットであれば簡単です(関数を使用した多次元パックドパラメータ宣言

parameter para_1[1:0][2:0] = '{2{3{0}}};など)。

しかし、私が望むのは、パラメータに戻り値を割り当てる前に複雑な方程式を関数内で実装できるように、値を指示する関数です。

理想的には、次のように私が何かをしたい:

function func01 [1:0][1:0] (input int test); 
    int index; 
    for (index=0; index<=2; index++) begin 
    func01[index] = index + $floor(index/2) + $mod(index, 2) + test; 
    end 
endfunction 

parameter test1 = 1; 
parameter logic test2 [1:0][1:0] = func01(test1); 

をしかし、ModelSimのは、コード、すぐの最初の行に文句を言う - ** Error: (vlog-13069) near "[": syntax error, unexpected '[', expecting ';' or '('.

最終的にアイデアが精緻で、すべてのパラメータ/定数を算出し、ブロックを持つことですそれらをインスタンス化のために生成ブロックで使用することができます。

ご迷惑をおかけいたします。ありがとうございます。

ベスト、 Taihai

答えて

0

まずあなたがパックされた配列をしたい場合は、次元が配列名の左に行くの範囲です。明示的なデータ型を使用することをお勧めします。

parameter bit [1:0][2:0] para_1 = '{2{3{0}}};. 

次に、関数宣言の戻り型が関数名の前に来ます。

function bit [1:0][1:0] func01 (input int test); 

ところであなたは、関数の戻り値の型がアンパックの寸法を持つようにしたい場合、あなたはどのような場合では良い習慣ですtypedefを、使用する必要があります。

typedef bit [1:0] myParam_t [2:0]; 
parameter myParam_t para_1 = '{default:0}; 
function myParam_t func01 (input int test); 
+0

この@ dave_59にはありがとうございます。タイトルと内容は、パックされていないアンパックされた配列と関係していました。ごめんなさい。そしてあなたの解決策は、私が 'typedef'側でやっているようです。しかし、ModelSimは、機能ブロック「システム機能は定数機能で使用できないかもしれません。」ではシステム機能(例えば$フロア)を好きではありません。回避策はありますか? – Tidus

+0

SystemVerilogの等価演算子(modには '%')を使用するか、置換式( 'let floor(val)= int '(val)> val?int'(val)-1:int ' ); 'for floor) –

+0

Daveに感謝します。今私のために働いています。 – Tidus

関連する問題