これは簡単な質問ですが、私は本当に答えは見たことがありません。 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
)よりどの点で優れていますか(まったく違うのですか)。
代替ソリューション:負の値の符号付きリテラルをより良い方法で表現する方法を教えてください。
これは興味深い選択肢です。私は署名された値を連結するときに何度もそれを使用しました。私が質問を書いている間、私には起こりませんでした。負の符号は、最終値が式で署名されたとみなされることを意味しますか?したがって、a = b * 4 '( - 1)のようなものは、符号付き乗算になります(bが署名されていると仮定します)。私は自分でそれを試すことができると思います。 – hops
はい、LRMは、署名が変わらないと言います。 –