1

Verilog の case ステートメントでいくつかの条件を生成しようとしています。

MANT_WIDTH というパラメーターがあり、case ステートメントの条件の数は MANT_WIDTH の値によって異なります。

たとえば、私は持っています

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

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

私が抱えている問題は、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 ループの外に配置する必要がある特殊なケースがいくつかあります。

どうもありがとうございます!

4

2 に答える 2

2

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

module;
//Valid here
endmodule

MANT_WIDTH というパラメーターがあり、case ステートメントの条件の数は MANT_WIDTH の値によって異なります。

パラメータを使用して case ステートメントの数を直接制御する方法はありません。

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

于 2012-04-20T23:22:13.387 に答える
0

私は次のコンパイラ指令を使用することにしました。

`ifdef
`else
`endif

したがって、ブロックを次のようにコードとして定義できます。

`define MYMACRO 1;

`ifdef MYMACRO

// some code

`else
 `ifdef ANOTHERMACRO
// different code
`endif
`endif
于 2012-04-23T15:34:22.130 に答える