2012-04-20 19 views
1

Verilogのcase文でいくつかの条件を生成しようとしています。Verilog alwaysブロックで 'generate'を使用する際の問題

私はMANT_WIDTHとして知られているパラメータとcase文での条件の数を持っているが、私は

always @(*) begin 
    case (myvariable) 
    {MANT_WIDTH{1'b1}}: 
    begin new_variable = {1'b0, {MANT_WIDTH{1'b1}}};  end 

    genvar n; 
    generate 
    for (n = 2; n <= MANT_WIDTH-1; n = n+1) begin: NORMALIZE 
     {(MANT_WIDTH-n){1'b0}},{n{1'b1}}}: 
     begin new_variable = {{n{1'b1}},1'b0; 
    end 


    endgenerate 


    default: 
    begin new_variable = {(MANT_WIDTH+1){1'b0}};   end 
endmodule 
end 
を持っ例えばMANT_WIDTH

の値に依存

このコードではいくつかの条件があるかもしれません意味がない(不正なビット幅など)が、私がしようとしていることの要点はここにあります。

私が午前問題は、私はncverilogを使用してこのコードをシミュレートしようとすると、私は次のエラーを取得していますということです。

 for (n = 2; n <= MANT_WIDTH-1; n = n+1) begin: NORMALIZE 
      | 

ncvlog:* E、ILLPRI(fpmodule.v、278 | 6):違法な表現の主要[4.2(IEEE)]

も私は私が先頭にゼロをカウントする必要が違法な左辺値の構文[9.2 [IEEE)]

を取得します。私は実際に私の実際のコードを貼り付けていない、ちょうど先行ゼロを数えるためにいくつかの方法が必要ですが、私はforループの外に置く必要がありますいくつかの特殊なケースがあります。

大変ありがとうございます!

答えて

0

私は、次のコンパイラディレクティブを使用してに頼っ:

`ifdef 
`else 
`endif 

をしたがって、私はブロックにようなコードを定義することができます。

`define MYMACRO 1; 

`ifdef MYMACRO 

// some code 

`else 
`ifdef ANOTHERMACRO 
// different code 
`endif 
`endif 
2

alwaysブロックでgenerateを使用することはできません。それらはモジュール宣言スコープでのみ有効です。

module; 
//Valid here 
endmodule 

私はcase文がMANT_WIDTH

直接case文の数を制御する方法はありませんの値に依存 でMANT_WIDTHとして知られているパラメータと条件の数を持っていますパラメータを使用します。

計算しようとしているものはわかりませんが(new_variable = {myvariable,1'b0}?)、何らかのシフトを達成するためにループを生成する必要はほとんどなく、ここに先行ゼロが必要なようです。

+0

を私は先頭のゼロをカウントする必要があります。私は実際に私の実際のコードを貼り付けていない、ちょうど先行ゼロを数えるためにいくつかの方法が必要ですが、私はforループの外に置く必要がありますいくつかの特殊なケースがあります。 – Veridian

関連する問題