2017-03-20 10 views
3

これは簡単な質問ですが、私は本当に答えは見たことがありません。 Verilog(またはそれに関するSystemVerilog)では、リテラルを宣言し、使用されるビット数を示すことができます。いくつかの例は以下のとおりです。負の値の符号付きリテラルはなぜですか?

ここ
reg [3:0] x = 4'b1101; // (1) 
reg [3:0] y = 4'd13; // (2) 

レジスタxとyを宣言し、彼らが最初に同じ値を保持しています。また、使用できる署名付き修飾子もあります。それを使用していくつかの例です:

reg signed [3:0] a = 4'sb0101; // (3) 
reg signed [3:0] b = 4'sd5; // (4) 

今、私の質問は、10進表記を使用して負の値を表す方法です。レジスタcとdを-3に初期化したいとしましょう。これは正しいです?

reg signed [3:0] c = 4'sb1101; // (5) 
reg signed [3:0] d = -4'sd3; // (6) 

上記のコードは、現在のバージョンのActiveHDLでコンパイルされ、実行されます。私には、意味的に次のように示唆されているようです:0011という数字の表現は、1101(私が表現したい実際のリテラル)を得るために否定されます(反転されたビットと追加されたビット)。これに否定演算子を使用していることに注意してください。私はしばしば直接番号を表す別の方法があるのか​​疑問に思っています。私は4'sd(-3)を試してみましたが、これは今や幅と表現された値が切り離されているので、私にとってはより清潔に見えます。しかし、これは私に構文エラーをもたらしました。私はすでに初期化(6)というラベルの付いた問題を解決していますが、それでも問題は解決します...

幅指定のリテラルに負の値を含めることができない場合は、オペレーターはその上で行動することなく)?

つまり、リテラルは、リテラル(-4'd3)よりどの点で優れていますか(まったく違うのですか)。

代替ソリューション:負の値の符号付きリテラルをより良い方法で表現する方法を教えてください。

答えて

5

あなたは、これは、指定された幅に式をキャストしているLRMの状態として4

4'(-3)を使用することができ、s修飾子は、ビットパターン表現には影響を与えません。その解釈だけ。あなたは

module top; 

    reg signed [5:0] a; 
    initial begin 
    a = -4; 
    $display(a<4'b1101); 
    $display(a<4'sb1101); 
    end 
endmodule 
+0

これは興味深い選択肢です。私は署名された値を連結するときに何度もそれを使用しました。私が質問を書いている間、私には起こりませんでした。負の符号は、最終値が式で署名されたとみなされることを意味しますか?したがって、a = b * 4 '( - 1)のようなものは、符号付き乗算になります(bが署名されていると仮定します)。私は自分でそれを試すことができると思います。 – hops

+0

はい、LRMは、署名が変わらないと言います。 –

2

-4'sd3-4d3両方が同じだった場合、それは違いを生むだろう。

基本形式で指定された数字は、記号が含まれる場合は符号付き整数として扱われ、基本形式のみが使用される場合は符号なし整数として扱われます。

sの指定子は、指定されたビットパターンに影響を与えません。 解釈のみです。サイズ定数の前のプラスまたはマイナス演算子 は、単項プラスまたはマイナス演算子です。 の基本形式と数値の間のプラスまたはマイナス演算子は不正な構文です。

8'd-6 // this is illegal syntax 
    -4'sd15 // -15, equivalent to -4'd15, or '0001' 
    16'sd? // the same as 16'sbz 
関連する問題