補足 - 符号付き変数

[] [] []


符号付きの変数・定数:

(1) 関数 $signed(  )で囲った変数や定数 (例:$signed(b), $signed(4'd1))

(2) 宣言にsigned がついている変数 (例:reg signed[15:0] a)

(3) 基数にsがついている定数 (例:4'sd1, 4'sb0001)

(4) 基数がない定数 (例:1,10)

符号付きと符号なしの違いは解釈が変わるだけで、ビットパターン自体は同じものである

すなわち最上位ビット(MSB)1のとき、符号付きならば負数、符号なしならば正数と解釈される。

例) ビットパターン1111は符号付きならば-4'd1、符号なしならば4'd15

したがって1'sb1+1ではなく-1(MSB1)である。基数にsを付ける書き方は正負がまぎらわしいので使わない方がよい。

加減算は符号付きでもなしでも結果のビットパターンは同じである。

例)加算

 符号なし 1111 + 1000 = 10111 15 +  8 = 23

 符号付き 1111 + 1000 = 10111 -1 + -8 = -9

ただし符号拡張があるときは結果のビットパターンが異なることがある。

例)加算

 符号なし 1111 + 0001 = 10000 15 +  1 = 16

 符号付き 1111 + 0001 = 00000 -1 +  1 =  0

◇◇

一方、乗算は符号付きかなしかで結果のビットパターンが異なる。

例)乗算

 符号なし 1111 * 1000 = 01111000 15 *  8 = 120

 符号付き 1111 * 1000 = 00001000 -1 * -8 = 8

RTL記述で乗算(*)を使うときは、符号付き変数が符号なし変数とみなされないように注意しなければならない

注意すべきルールは、

(1) オペランドに1つでも符号なしがあると乗算も符号なしとみなされる

  (符号なし変数 * 符号付き変数)は符号なし変数同士の乗算とみなされる

(2) ビットセレクトは符号なしとみなされる(フルビットのセレクトでもだめ)

  reg signed[17:0] a; に対して、aは符号つきだがa[17:0]と書くと符号なしとみなされる

(3) 連結は符号なしとみなされる

   reg signed[9:0] a; reg signed[7:0] b;に対して{a,b}は符号なしとみなされる


[] [] []