2017-05-04 21 views
1

私は標準形式(64ビット数の場合はIEEE 754浮動小数点標準)で与える必要がある52ビット乗算器のコードを記述しました。だからその後、私は、いくつかのビットが64から超過しているかどうかをチェックしています。その数字を指数部に入れます。Verilogコードエラー:範囲は定数式で囲まなければなりません

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) 
begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) 
    begin 
    if(y[i]) 
     p=p+a; // must be a blocking assignment 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) 
    begin 
    if (p[i]) 
     c=p[i:i-51]; 
     break; 
    end 

    end 
endmodule 

それがエラーを与えている:範囲はラインの定数式で囲まれなければならない:C = P [I:I-51]。 どうすればこの問題を解決できますか?

+0

[Verilog: "... is not a constant"](http://stackoverflow.com/questions/29815974/verilog-is-not-a-constant)の可能な複製 – Qiu

答えて

0

可変部分/スライス選択(可変幅)を使用することはできません。代入を変数cの観点から考える。 cは52ビット幅なので、52ビットのpを割り当てる必要があります。ループは、どの52ビットを選択する必要があります。これは、可変部分選択演算子のためのものです。それは次のようになります Indexing vectors and arrays with +:

:ここで良い説明があります

意味
c=p[i+:52] 

、(下位ビット)iは+ 52-1まで行くから始まるPから選択し、Cに割り当てます。

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) begin 
    if(y[i]) begin 
     p=p+a; // must be a blocking assignment 
    end 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) begin 
    if (p[i]) begin 
     c=p[i+:52]; 
     break; 
    end 
    end 
end 
endmodule 

また、2番目のループで 'if'の後に 'begin'、alwaysブロックを閉じるには 'end'が必要です。上記のコードは私のためにコンパイルされます。

関連する問題