2012-04-06 14 views
2

の一部に私はModelSimでのVerilogを使用していますが、私は別のREG変数の異なる部分にREG変数を割り当てるしようとすると、私は次のエラーを取得:ここVerilogレジスタの割り当て別のREG

** Error: Range width must be greater than zero. 
** Error: Range width must be constant expression. 

は、関連するコードです:

integer f; //zd, qd, R and Q are regs 

    always @ * begin 
    f = 52 - zd; 
    R = qd[f +:0]; 
    Q = qd[63 -:f+1]; 
    end 

I Rは(F + 1から63まで)(REST)QDことがQD(0からFまで)及びQを含めます。どうやってするの?ありがとう。あなたの警告は、あなたが可変長部分の選択を持つことができない、すなわち、Range width must be constant expression、言うように何をしようとする

+0

ここには[回答](http://stackoverflow.com/questions/7543592/verilog-barrel-shifter/ 7543745#7543745)を同様の問題に置き換えます。 –

答えて

3

は、Verilog 2001

では合法ではありません。

あなたは固定長部分は、それが出発点(すなわちfから出発して8ビットを選択)変化するが、そのための構文は、このある選択有することができる:バスのサイズがなければならないハードウェアで

vector_name[starting_bit_number +: part_select_width] 
vector_name[starting_bit_number -: part_select_width] 

固定サイズでは、レジスタの内容に基づいてシリコンのワイヤ数を変更することはできません。

+0

AKA: "索引パート選択" – Marty

+0

それは本当ですが、私が本当に欲しいものを達成していません。 select_widthの部分が残りのビットより大きい場合はどうなりますか?残りのビットはすべて問題なく選択されますか? – mj1261829

+0

@ user1261829:パーツ選択がバスをオーバフローさせるように開始ビットを選択した場合、おそらく無効なデータが生成されます。あなたはより高い概念レベルで何をしようとしているのか記述できますか?たぶん、あなたがやろうとしていることよりももっと良い方法があります。 – Tim