Verilogで式のビット幅を切り捨てる方法は?


11

次のような式について考えてみます。

assign x = func(A) ^ func(B);

funcの出力は32ビット幅で、xは16ビットのワイヤです。結果のxorの最下位16ビットのみを割り当てます。

上記のコードはすでにそれを実行していますが、警告も生成します。「明白な」アプローチは機能しません。

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected

回答:


8

別の変数を使用できますが、これは特にエレガントではありません。

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

より良いアプローチは、関数を使用することです。

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));

私はそれよりももっと良いものがあることを望んでいました...ええと、私は大量の打ち切り関数を作成します。
user23106 2013

5

あなたの例では、ビットを暗黙的に切り捨てています。

多くの場合、トランケーションを明示的にすると、シミュレーション/ lint /合成の警告が削除されます。

これをインラインで実行する1つの方法は、キャスト演算子を使用することです。例:

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

このアプローチは、ドロップされるすべてのビットが0であることがコンテキストから明らかである場合に意味があります。

一部のビットがゼロ以外の場合は、以前の回答で提案された@dwikleのような中間ネットを使用することをお勧めします。これにより、実際にビットを破棄していることがより明確になります。ここでも参照用です。

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

1
これはSystemVerilogでのみ機能すると思います。それ以外は興味深い。
トムカーペンター、

@TomCarpenter、新しい統一されたIEEE Std 1800リビジョンの1つで利用可能な合成可能なVerilogの完全なセットを使用するのではなく、IEEE Std 1364-2005で利用可能なVerilogのサブセットに制限したいですか?Verilogの標準は、2009年に統一したSystemVerilog標準に包含されて以来あなたは、Verilogの-2005か何かを明確にするために言いたいこと
mattgately

3

これは行数を減らすのに役立つと思います。

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

割り当てでも有効かどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.