大堀/研究/データ/FPU/FPUの実装の軌跡
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[大堀/研究/データ/FPU]]
*[[大堀/研究/データ/FPU/FPUの実装の軌跡]] [#pc593c2a]
-コプロセッサとして作成
**動作の流れ [#pf82ca22]
-C = A + B(アセンブラから読み解く)
まず、メモリのベースアドレスを保持(lui命令): spimではCPUレジスタで保持していた。
FPU側でベースアドレスとオフセットを利用してAの値をFPUレジスタaに格納(lwc1命令)。
同様にBの値もFPUレジスタbに格納(lwc1命令)。
FPUレジスタaとbの値を使って計算しFPUレジスタcに格納(add.s命令)。
最後にFPUレジスタcの値を、ベースアドレスとオフセットを利用してCの場所に格納(swc1命令)。
**実装手順(案) [#g1187ab3]
+MIPS用のアセンブラをmips-gccで吐かせる
+主要命令を実行できるFPUの演算器を作る
add.s, sub.s, mul.s, div.s, sqrt.s, abs.s, mov.s, neg.s
+FPU汎用レジスタと演算器を結合する
+FPU汎用レジスタとメモリとのやりとりに関する機構を整備する
lwc1, swc1
+FPUをCPU(MIPS)と結合する
**演算器の実装 [#x8e71582]
-ディジタル数値演算回路の実用設計を参考に作成する。
-演算機のまわりにはデータのsign, exp, fractionを分割するデコーダとまとめるエンコーダを用意する。
-構成は以下(案)
--Decoder for input a
---正規化されていたデータから1の補正(frac)などもここで行う。
--Decoder for input b
---正規化されていたデータから1の補正(frac)などもここで行う。
--Encoder for output x
---正規化を行う。
--Core arithmetic logic unit for floating point
---at Sign bit
---at Exp bits
---at Fraction bits
-整数と浮動小数の演算のサポート: 固定小数点から浮動小数点への変換回路を作成
-最終的には丸めモジュールも作成する。
**命令コード [#o244287c]
|Inst Name|op[31:26]|rs[25:21]|rt|rd|funct[5:0]|
|mfc1|11|0||||
|cfc1|11|2||||
|mtc1|11|4||||
|ctc1|11|6||||
|add.f|11|16|||0|
|sub.f|11|16|||1|
|mul.f|11|16|||2|
|div.f|11|16|||3|
|abs.f|11|16|||5|
|mov.f|11|16|||6|
|neg.f|11|16|||7|
**命令のFUNC値 [#d96a870b]
|Inst|Func[5:3]|Func[2:0]|
|add.s|000|000|
|sub.s|000|001|
|mul.s|000|010|
|div.s|000|011|
|sqrt.s|000|100|
|abs.s|000|101|
|mov.s|000|110|
|neg.s|000|111|
**浮動小数点(IEEE754形式) 各フォーマット依存関係まとめ [#q1cf4d22]
-各値の依存関係
--依存しているフォーマットの最初の文字を表示
add.sのsign bitはexpの計算時に利用する。
--多くが依存しているなら一緒にしちゃったほうがいいのかな…
|Inst|Sign|Exp|Frac|
|add.s|e|sf|e|
|sub.s|e|sf|e|
|mul.s||||
|div.s||||
|sqrt.s||f|e|
|abs.s||||
|mov.s||||
|neg.s||||
-各命令の依存関係
-add.sのsign, exp部分とsub.sのsign, exp部分は一緒
-add.sのfrac部分とsub.sのfrac部分は似ている。
--一緒の部分は統一モジュールでもいいかな…
|Inst\Inst|add.s|sub.s|mul.s|div.s|sqrt.s|abs.s|mov.s|neg.s|
|add.s|\|se,f|||||||
|sub.s|se,f|\|||||||
|mul.s|||\|s,ef|||||
|div.s| ||s,ef|\|||||
|sqrt.s|||||\|s|||
|abs.s|||||s|\|ef|ef|
|mov.s||||||ef|\|ef|
|neg.s|||||||ef|\|
**浮動小数点(IEEE754形式) 各フォーマットまとめ [#k1a5df35]
***Sign [#obd3b84f]
|add.s|絶対値を比較して大きい方のsignを出力|
|sub.s|絶対値を比較して大きい方のsignを出力|
|mul.s|XOR|
|div.s|XOR|
|sqrt.s|正(計算に使うデータのSignが負ならERROR)|
|abs.s|正|
|mov.s|値をそのまま出力|
|neg.s|NOT|
***Exp [#n90ee556]
-例外があるので注意
--オーバーフロー、計算の不成立など(0 division)
-mul.s, div.s
--正規化の手順をまとめる。
-sqrt.s
--開平法
|add.s|絶対値を比較して大小を決定し、シフトする値を決める|
|sub.s|絶対値を比較して大小を決定し、シフトする値を決める|
|mul.s|2つのexpデータを加算してゲタ(127)を引く→a,b,xのデータが0 or 255ならERROR|
|div.s|2つのexpデータを減算してゲタ(127)を足す(丸めは設計者が考慮)→a,b,xのデータが0 or 255ならERROR|
|sqrt.s|偶数か奇数か判断し、偶数なら2でわる。奇数なら-1して2でわる。|
|abs.s|値をそのまま出力|
|mov.s|値をそのまま出力|
|neg.s|値をそのまま出力|
***Frac [#wcf582db]
--乗算器,乗算器が必要?
-sqrt.s
--開平法
|add.s|LOW側をシフトして桁を揃え、加算する|
|sub.s|LOW側をシフトして桁を揃え、減算する|
|mul.s|2つのfracデータを乗算|
|div.s|2つのfracデータを除算|
|sqrt.s|Exp部分が偶数なら先頭に0をつけて開平法を適用。奇数ならそのまま開平法を適用(exp側で-1して整合性をとる)|
|abs.s|値をそのまま出力|
|mov.s|値をそのまま出力|
|neg.s|値をそのまま出力|
**各命令の実装 [#x94024c0]
-[[ADD.s>大堀/研究/データ/FPU/add_sub.s]]
-[[SUB.s>大堀/研究/データ/FPU/add_sub.s]]
-[[MUL.s>大堀/研究/データ/FPU/mul_div.s]]
-[[DIV.s>大堀/研究/データ/FPU/mul_div.s]]
-[[SQRT.s>大堀/研究/データ/FPU/sqrt_abs.s]]
-[[ABS.s>大堀/研究/データ/FPU/sqrt_abs.s]]
**デバッグ [#x216e5a9]
***現状 [#sc99eea8]
-10/31 14:43
|命令|動作確認|症状|詳細|
|add|○|0,-0,0×2^n, 0x2^(-n)の場合分けなし||
|sub|○|0,-0,0×2^n, 0x2^(-n)の場合分けなし|addから推測(正+負は正-正と同じだから)。実際には試してない。|
|mul|○||frac部が0になったら値は0|
|div|○||例外処理は未実装。0割など。|
|sqrt|-|-|実装見送り|
|abs|×|出力の値が更新されない||
|mov|○|||
|neg|○|||
終了行:
[[大堀/研究/データ/FPU]]
*[[大堀/研究/データ/FPU/FPUの実装の軌跡]] [#pc593c2a]
-コプロセッサとして作成
**動作の流れ [#pf82ca22]
-C = A + B(アセンブラから読み解く)
まず、メモリのベースアドレスを保持(lui命令): spimではCPUレジスタで保持していた。
FPU側でベースアドレスとオフセットを利用してAの値をFPUレジスタaに格納(lwc1命令)。
同様にBの値もFPUレジスタbに格納(lwc1命令)。
FPUレジスタaとbの値を使って計算しFPUレジスタcに格納(add.s命令)。
最後にFPUレジスタcの値を、ベースアドレスとオフセットを利用してCの場所に格納(swc1命令)。
**実装手順(案) [#g1187ab3]
+MIPS用のアセンブラをmips-gccで吐かせる
+主要命令を実行できるFPUの演算器を作る
add.s, sub.s, mul.s, div.s, sqrt.s, abs.s, mov.s, neg.s
+FPU汎用レジスタと演算器を結合する
+FPU汎用レジスタとメモリとのやりとりに関する機構を整備する
lwc1, swc1
+FPUをCPU(MIPS)と結合する
**演算器の実装 [#x8e71582]
-ディジタル数値演算回路の実用設計を参考に作成する。
-演算機のまわりにはデータのsign, exp, fractionを分割するデコーダとまとめるエンコーダを用意する。
-構成は以下(案)
--Decoder for input a
---正規化されていたデータから1の補正(frac)などもここで行う。
--Decoder for input b
---正規化されていたデータから1の補正(frac)などもここで行う。
--Encoder for output x
---正規化を行う。
--Core arithmetic logic unit for floating point
---at Sign bit
---at Exp bits
---at Fraction bits
-整数と浮動小数の演算のサポート: 固定小数点から浮動小数点への変換回路を作成
-最終的には丸めモジュールも作成する。
**命令コード [#o244287c]
|Inst Name|op[31:26]|rs[25:21]|rt|rd|funct[5:0]|
|mfc1|11|0||||
|cfc1|11|2||||
|mtc1|11|4||||
|ctc1|11|6||||
|add.f|11|16|||0|
|sub.f|11|16|||1|
|mul.f|11|16|||2|
|div.f|11|16|||3|
|abs.f|11|16|||5|
|mov.f|11|16|||6|
|neg.f|11|16|||7|
**命令のFUNC値 [#d96a870b]
|Inst|Func[5:3]|Func[2:0]|
|add.s|000|000|
|sub.s|000|001|
|mul.s|000|010|
|div.s|000|011|
|sqrt.s|000|100|
|abs.s|000|101|
|mov.s|000|110|
|neg.s|000|111|
**浮動小数点(IEEE754形式) 各フォーマット依存関係まとめ [#q1cf4d22]
-各値の依存関係
--依存しているフォーマットの最初の文字を表示
add.sのsign bitはexpの計算時に利用する。
--多くが依存しているなら一緒にしちゃったほうがいいのかな…
|Inst|Sign|Exp|Frac|
|add.s|e|sf|e|
|sub.s|e|sf|e|
|mul.s||||
|div.s||||
|sqrt.s||f|e|
|abs.s||||
|mov.s||||
|neg.s||||
-各命令の依存関係
-add.sのsign, exp部分とsub.sのsign, exp部分は一緒
-add.sのfrac部分とsub.sのfrac部分は似ている。
--一緒の部分は統一モジュールでもいいかな…
|Inst\Inst|add.s|sub.s|mul.s|div.s|sqrt.s|abs.s|mov.s|neg.s|
|add.s|\|se,f|||||||
|sub.s|se,f|\|||||||
|mul.s|||\|s,ef|||||
|div.s| ||s,ef|\|||||
|sqrt.s|||||\|s|||
|abs.s|||||s|\|ef|ef|
|mov.s||||||ef|\|ef|
|neg.s|||||||ef|\|
**浮動小数点(IEEE754形式) 各フォーマットまとめ [#k1a5df35]
***Sign [#obd3b84f]
|add.s|絶対値を比較して大きい方のsignを出力|
|sub.s|絶対値を比較して大きい方のsignを出力|
|mul.s|XOR|
|div.s|XOR|
|sqrt.s|正(計算に使うデータのSignが負ならERROR)|
|abs.s|正|
|mov.s|値をそのまま出力|
|neg.s|NOT|
***Exp [#n90ee556]
-例外があるので注意
--オーバーフロー、計算の不成立など(0 division)
-mul.s, div.s
--正規化の手順をまとめる。
-sqrt.s
--開平法
|add.s|絶対値を比較して大小を決定し、シフトする値を決める|
|sub.s|絶対値を比較して大小を決定し、シフトする値を決める|
|mul.s|2つのexpデータを加算してゲタ(127)を引く→a,b,xのデータが0 or 255ならERROR|
|div.s|2つのexpデータを減算してゲタ(127)を足す(丸めは設計者が考慮)→a,b,xのデータが0 or 255ならERROR|
|sqrt.s|偶数か奇数か判断し、偶数なら2でわる。奇数なら-1して2でわる。|
|abs.s|値をそのまま出力|
|mov.s|値をそのまま出力|
|neg.s|値をそのまま出力|
***Frac [#wcf582db]
--乗算器,乗算器が必要?
-sqrt.s
--開平法
|add.s|LOW側をシフトして桁を揃え、加算する|
|sub.s|LOW側をシフトして桁を揃え、減算する|
|mul.s|2つのfracデータを乗算|
|div.s|2つのfracデータを除算|
|sqrt.s|Exp部分が偶数なら先頭に0をつけて開平法を適用。奇数ならそのまま開平法を適用(exp側で-1して整合性をとる)|
|abs.s|値をそのまま出力|
|mov.s|値をそのまま出力|
|neg.s|値をそのまま出力|
**各命令の実装 [#x94024c0]
-[[ADD.s>大堀/研究/データ/FPU/add_sub.s]]
-[[SUB.s>大堀/研究/データ/FPU/add_sub.s]]
-[[MUL.s>大堀/研究/データ/FPU/mul_div.s]]
-[[DIV.s>大堀/研究/データ/FPU/mul_div.s]]
-[[SQRT.s>大堀/研究/データ/FPU/sqrt_abs.s]]
-[[ABS.s>大堀/研究/データ/FPU/sqrt_abs.s]]
**デバッグ [#x216e5a9]
***現状 [#sc99eea8]
-10/31 14:43
|命令|動作確認|症状|詳細|
|add|○|0,-0,0×2^n, 0x2^(-n)の場合分けなし||
|sub|○|0,-0,0×2^n, 0x2^(-n)の場合分けなし|addから推測(正+負は正-正と同じだから)。実際には試してない。|
|mul|○||frac部が0になったら値は0|
|div|○||例外処理は未実装。0割など。|
|sqrt|-|-|実装見送り|
|abs|×|出力の値が更新されない||
|mov|○|||
|neg|○|||
ページ名: