概要と仕様
豪快書きかけ。
概要
最低限やらなくてはならないのは、IEEE 754の規格で絶対必要な部分をおさえ
て、浮動小数点の四則演算と比較命令を上げることである。
そしてコンパイラが、全ての命令がいつ終るのかを読みきれるようにしておく
こと。なんだかあたりまえのような気がするが、非同期やハードウェアでのダ
イナミックスケジューリングはできない。そうでなければ ASCA でない。
OSCAR の場合は、0 除算を行った時点で止まってしまったそうである。ASCA
もトラップは考えないことにし、浮動小数点については、何かあったら、その
旨のフラグを立てて、処理を続行することにする。これは幸いにも、NaN とい
うもので簡単 ( ? ) に対処できる。
速度については、50 MHz ( 20 ns ) を目標に設計を行う。100 MHz に上げよ
うという動きもあるが、せめて 100 ビット の加算が 10 ns 以下で合成でき
るライブラリがないと厳しい。
仕様
浮動小数点演算ユニットの中で共通部分や大まかな部分を示す。
- 単精度 ( 命令タイプ 2'b10 )、倍精度 ( 命令タイプ 2'b11 ) をサポート
- 更に整数乗算、除算 ( 命令タイプ 2'b00 ) もこちらで引き受ける
- 最低加減乗除、比較はハードサポート
コントロールレジスタは 32 ビットで、フォーマットは暫定的に以下の通り
33222222 22221111 11111100 00000000
10987654 31209876 54321098 76543210
-------------------------------------
oooVOZUI oooVOZUI oooVOZUI ooooooRR
-------------------------------------
Excep. Trap Sticky R-Mode
各々のビットの意味は
- V : 無効演算 ( InValid operation )
- O : オーバーフロー ( OverFlow )
- Z : 0 除算 ( ZeroDivide )
- U : アンダーフロー ( UnderFlow )
- I : 不正確 ( InEXact )
- R : 丸めモード ( Round Mode )
- o : 未使用
に関するものである。また、レジスタは 4 つのグループに分けられる。
Exception
最後に終了した命令が、出力したフラグを保存しておく場所。つまり命令が終
了する度に変更され、例外が発生しなければ、全て 0 になるということか。
また、トラップがあったときは、セットすべきでないようだ。
Trap Enable
対応するビットを立てた状態で、その例外が発生したときに、割り込みが発生する。
Sticky Bit
命令終了毎に、Exception のフラグの or をとった結果が収納されている。
一旦フラグが立ってしまうと、明示的に消去しない限り消えない。
当然、クリアする命令を実装する必要がある。
Round Mode
2 ビットで構成される。具体的には以下の通り
丸めモード | ビット |
---|
RN | 00 |
RZ | 01 |
RP | 10 |
RM | 11 |
丸めの基本動作
丸めモード | 0 以上の数に対する丸め | 負の数に対する丸め |
-∞ ( RM ) | 切捨て | R | S |
+∞ ( RP ) | R | S | 切捨て |
0 ( RZ ) | 切捨て | 切捨て |
最近値 ( RN ) | ( R & ( !S ) & L ) | ( R & S )
| ( R & ( !S ) & L ) | ( R & S ) |
R : 丸めビット
S : スティッキービット
L : 丸めの対象となっている数値のLSB
但し、非数や∞、また、結果が 0 になるような加減算命令に関してはこの限
りではない。また、実際は、RN に関しては簡単化してあるので、もっと単純
な式になるが、意味は上記の方が汲み取りやすい。
例外処理
例外の種類 | 非トラップの結果 | トラップの引数 |
---|
無効演算 | Quiet ( ? ) NaN | 入力オペランド |
0 除算 | 適切な符号付き∞ | 入力オペランド |
オーバーフロー | 後の表に従う | 丸めない結果 |
アンダーフロー | 丸めた結果 | 丸めない結果 |
不正確 | 丸めた結果 | 丸めない結果 |
参考 : IEEE 754 の例外処理 ( bit 別冊より )
例外状態 | 割り込みを抑制したときの結果 | 割り込みハンドラの引数 |
あふれ |
±∞ または±xmax |
round( x 2-a ) |
下位桁あふれ |
0 , ±2 Emin またはデノーマル |
round( x 2 a ) |
0 除算 | ±∞ | 被演算数 |
不定演算 | NaN | 被演算数 |
精度 | round( x ) | round( x ) |
x : 演算の正確な結果
a : 192 ( 単精度 ) , 1536 ( 倍精度 )
xmax : 1.111.....11 × 2 emax
トラップの振舞いが規格と違うが、これはソフトでカバーさせる。ハードでは、
できるだけ情報を損ねることなく引数を渡すことにした。フォーマット等は未
定。
別表 : オーバーフロー時の返り値
丸めモード | 中間結果の符号 | 返すべき結果 |
RN | + - | +∞ -∞ |
RZ | + - | + ( 表現しうる最大値 ) - ( 表現しうる最大値 ) |
RP | + - | +∞ - ( 表現しうる最大値 ) |
RM | + - | + ( 表現しうる最大値 ) -∞ |
Signaling NaN と Quiet NaN を表現する値は仕様を変更そのものから変更し
てしまうことにした。
修士
への道 -> Verilog の修正へ
数値 | 指数部 | 仮数部 |
∞ SNaN QNaN | Emax + 1 | all 0 all 1 all 1 except for MSB |
一歩前へ
僕のホームへ[Home]
研究室のページへ[Amano Lab.]
Takahiro Kawaguchi
kawaguti@aa.cs.keio.ac.jp
Last modified: Dec. 19, 1997