2017-05-04 6 views
0

入力ベクトルを最大にしようとしています。すべての入力が符号なしで、ビット幅と配列の長さの範囲で動作する必要があると仮定します。 私はパラメータと入力と出力のロジックをそのまま保つ必要があります。ここに私が持っているものがありますが、if文で構文エラーが発生します。Verilogで入力ベクトルの最大値を求める

module max 
#(parameter int bW=16, 
    parameter int eC=8) 
    (input logic [bW-1:0] a[eC-1:0], 
    output logic [bW-1:0] z); 

logic i=0; 

always @* begin 

    for (i=0; i<size; i++) { 
     if(a[i] >z) 
      z = a[i]; 
     } 
end 
endmodule 

多分、case文を使用する方が良いでしょうか?知りません。どんな助けもいいだろう!

答えて

1

2つの単純な問題。

begin/endの代わりに角括弧{/}を使用してループ文を折り返しました。とにかく1つのステートメントをラップする必要はありません。

iを1ビットとして定義しました。 intを使用してください。

0

また、初期値としてデフォルト値を使用し、そこからmaxを計算することもできます。例えば

:他のコメントに加えて

module max 
#(parameter int bW=16, 
    parameter int eC=8) 
    (input logic [bW-1:0] a[eC-1:0], 
    output logic [bW-1:0] z); 

always @(*) begin 
    // defaults 
    z = 0; 

    for (int i=0; i<size; i++) begin 
     if (a[i] > z) 
      z = a[i]; 
    end 
end 
endmodule 
0

は、私が比較値のための「EC」、ではない「サイズ」であるべきと考えています。これは私のためにコンパイルされます(もちろん、スミログラムの旗で):

module max #(
    parameter int bW = 16, 
    parameter int eC = 8 
) 
(
    input logic [bW-1:0] a [eC-1:0], 
    output logic [bW-1:0] z 
); 

always @* begin 

    z = a[0]; 
    for (int i=1; i<eC; i++) begin 
     if(a[i] > z) begin 
      z = a[i]; 
     end 
    end 
end 
endmodule 
関連する問題