14

たとえば、reg [7:0] myReg 私はそれに値を割り当てるとします-8'D69

Verilog は 2 の補数として保存することを知っているので、次のように保存する必要があります。

10111011

私が今持っている質問は、それに対して操作を実行するかどうかです、たとえば myReg/2

-34 と評価されますか? それとも、10111011 を 187 に変換してから、除算を実行して 93 を返しますか?

4

3 に答える 3

15

-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私の例では切り上げもされており、>>>切り捨て/切り捨てられます。

于 2012-09-13T09:45:48.747 に答える
6

たとえば、reg [7:0] myReg があるとします。値 -8'D69 を割り当てます。

これは実際には符号付きの数値ではなく、正の定数に単項否定を適用した式です。式が-8'd130結果の場合、オーバーフローします。符号付き定数は、8'sd69または単にとして宣言され69ます。

私が今持っている質問は、それに対して操作を実行するかどうかです、たとえば myReg/2

myRegunsigned であるため、式の結果も 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
于 2012-09-13T16:07:47.613 に答える
1

1 を追加します。デフォルトでは、データ型 bit と reg は符号なしです。2. データ型 int、integer、longint、shortint、および byte は、デフォルトで符号付きです。3. これらのデータ型はすべて、符号付きまたは符号なしの修飾子を使用してデフォルトを変更できます。

したがって、-8'D69 を myReg に割り当てると、暗黙的に 187 に変換されます。次に、myReg/2 = 187/2 = 93、符号なしです。SystemVerilog が式と代入で暗黙的な型変換をいつ、どのように行うかを理解することが重要です。

于 2012-10-10T22:24:40.347 に答える