2017-10-03 13 views
0

場合によっては、スライスの幅がゼロでない場合に配列スライスと照合したい状況がパラメータ化されたコードになります。私はこのようなものを書くかもしれません:到達不可能な評価でVerilogが無効/無効なスライス範囲

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 
logic [my_array_size : 0] my_array; 
//... 
always_ff @ (posedge clk) begin 
    if (SLICE_WIDTH==0 || my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin 
    //alternately "if (SLICE_WIDTH==0 || my_array[SLICE_WIDTH+SLICE_BASE-1:SLICE_BASE]==0) begin" 
     //do something 
    end 
    else begin 
     //do something else 
    end 
end 

これは私がVHDLを書くときにこれらの状況を扱う方法でした。無効なアレイの範囲が評価されるのを防ぐために、一定の評価における短絡に頼っています。書かれているようにシステムのVerilogでは、これはQuestaSimの "range select of parted is reversed"エラーと "range width is zero"エラーをスローします。

//do somethingの内容をいくつかのif-generate構造に複製せずに、ほとんどのツールが受け入れるヌル範囲をきれいに処理する方法はありますか?あなたは何ができるか

答えて

0

はMASKは、あなたが私の式を用いてプレイする必要がある場合がありますので、0

は、これをテストしていないときに

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 
localparam logic [my_array_size : 0] MASK) = 2**SLICE_WIDTH - 1 << SLICE_BASE; 
logic [my_array_size : 0] my_array; 
//... 
always_ff @ (posedge clk) 
    if (my_array&MASK) begin 
     //do something 
    end 
    else begin 
     //do something else 
    end 

合成ツールが離れてロジックを最適化するマスキングパラメータを作成しています。

+0

このインスタンスでは、マスキングのバリエーションを使用することができましたが、一般的なケースはより洗練されていません。私は、一連の論理的な行を複製せずに中間のネットにコンディショニングするためにgenerateを使うことができると思います。 – QuantumRipple

0

Verilogでそれを処理する通常の方法はブロックを生成することです。

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 

logic [my_array_size : 0] my_array; 
//... 

// generate 
if (SLICE_WIDTH==0) begin 
    // do something here 
end 
else begin 
    always_ff @ (posedge clk) begin 
     if (my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin 
     //do something 
     end 
     else begin 
     //do something else 
     end 
    end 
end // endgenerate 

generate/endgenerateキーワードを使用する必要はありません。

+0

OPは、*何かのコードブロックを複製することを含まないソリューションを特に求めました。 –

+0

このソリューションは、Verilogでこのような問題を解決するきれいで実績のある唯一の方法です。残りはちょうどいくつかの特定のケースで動作するかもしれないハックとトリックです。 – Serge

関連する問題