たとえば、reg [7:0] myReg
私はそれに値を割り当てるとします-8'D69
Verilog は 2 の補数として保存することを知っているので、次のように保存する必要があります。
10111011
私が今持っている質問は、それに対して操作を実行するかどうかです、たとえば myReg/2
-34 と評価されますか? それとも、10111011 を 187 に変換してから、除算を実行して 93 を返しますか?
たとえば、reg [7:0] myReg
私はそれに値を割り当てるとします-8'D69
Verilog は 2 の補数として保存することを知っているので、次のように保存する必要があります。
10111011
私が今持っている質問は、それに対して操作を実行するかどうかです、たとえば myReg/2
-34 と評価されますか? それとも、10111011 を 187 に変換してから、除算を実行して 93 を返しますか?
-8d69
これは単なるパターンであることを覚えておく必要があります。reg はビットパターンを保持する型です。/
符号付きまたは符号なしの演算を実行するように指示する変数の型です。
これが合成用であり、分割線を回避したいということを念頭に置いている場合は、符号付き分割線を実際に回避したいと考えています。それはおそらくより小さく合成されます>>> 1
reg [7:0] a;
reg signed [7:0] b;
reg [7:0] c;
reg signed [7:0] d;
initial begin
a = -8'd69 ;
b = -8'd69 ;
c = -8'd69 ;
d = -8'd69 ;
#10ns;
a = a/2 ;
b = b/2 ;
#10ns;
$display("a : %8b, %d", a, a);
$display("b : %8b, %d", b, b);
$display("c >>>1 : %8b, %d", c>>>1, c>>>1);
$display("d >>>1 : %8b, %d", d>>>1, d>>>1);
end
与えます:
a : 01011101, 93
b : 11011110, -34
c >>>1 : 01011101, 93
d >>>1 : 11011101, -35
>> x
右に x 桁>>> x
シフトします。右に x 桁シフトしますが、signed 型の符号は拡張されます。
注意:/2
私の例では切り上げもされており、>>>
切り捨て/切り捨てられます。
たとえば、reg [7:0] myReg があるとします。値 -8'D69 を割り当てます。
これは実際には符号付きの数値ではなく、正の定数に単項否定を適用した式です。式が-8'd130
結果の場合、オーバーフローします。符号付き定数は、8'sd69
または単にとして宣言され69
ます。
私が今持っている質問は、それに対して操作を実行するかどうかです、たとえば myReg/2
myReg
unsigned であるため、式の結果も unsigned* になります。結果に署名が必要な場合は、すべてのオペランドに署名する必要があります。これを実現するには、いくつかの方法があります。
//Declare the reg as signed and divide by a signed value
reg signed [7:0] myReg;
assign result = myReg/2;
//Use system functions
assign result = $signed(myReg)/2;
*式の評価に関する完全な規則は、はるかに複雑ですが、基本的に、すべてのオペランドが署名されていない限り、式の結果は署名されていません。
reg signed [7:0] a;
reg [7:0] b;
initial
begin
result = a; //Signed
result = a * a; //Signed
result = a * 10; //Signed
result = $unsigned(a); //Unsigned
result = a[0]; //Unsigned
result = a[7:0]; //Unsigned
result = {a,a}; //Unsigned
result = 10{a}; //Unsigned
result = a + b; //Unsigned
result = a * b; //Unsigned
end
1 を追加します。デフォルトでは、データ型 bit と reg は符号なしです。2. データ型 int、integer、longint、shortint、および byte は、デフォルトで符号付きです。3. これらのデータ型はすべて、符号付きまたは符号なしの修飾子を使用してデフォルトを変更できます。
したがって、-8'D69 を myReg に割り当てると、暗黙的に 187 に変換されます。次に、myReg/2 = 187/2 = 93、符号なしです。SystemVerilog が式と代入で暗黙的な型変換をいつ、どのように行うかを理解することが重要です。