整数型の32bit乗算回路を設計してみたところ、3サイクルあれば、まぁ動きそ
うな感じがした。浮動小数点は、正規化の部分があるものの、加減算より複雑
にならずに結構簡単にいきそうな予感がする。目標は 8 〜 9 サイクル
(19970930)。 5 サイクルに変更 ( 19971017 )
更に 4 サイクルへ。多分いける。目途がついたので、一旦サスペンド (
19971027 )
単精度と例外処理を実装すべく再開。なぜか除算の方が先に終わってしまっている
( 19971226 )

上図は気持ちの問題で、必ずしも設計と 1 対 1 になっているわけではない。 インターフェースも少し違う。
単精度、倍精度も照準に合わせ、かつ例外の処理もちゃんとできるものを作ろう。
ここで特殊数とは、SNaN と QNaN と Inf と 0 を指し、入力に対してこれら を排他的にアサートされる 4 ビットで入力の状態を決定する。全てのビット が立っていなければ、それは通常の有限数を意味する。以下の仕様に基づいて 作る。
| 演算種類 | 結果 | 例外 |
|---|---|---|
| SNaN × SNaN SNaN × QNaN と QNaN × SNaN SNaN × 0 と 0 × SNaN SNaN × Inf と Inf × SNaN SNaN × W と W × SNaN Inf × 0 と 0 × Inf | QNaN | V |
| QNaN × QNaN QNaN × 0 と 0 × QNaN QNaN × Inf と Inf × QNaN QNaN × W と W × QNaN | QNaN | - |
| 0 × 0 W × 0 と 0 × W | 符号付き 0 | - |
| Inf × Inf Inf × W と W × Inf | 符号付き Inf | - |
| W × W | ?(W,Inf,0) | ?(O,U,I) |
module fmul_split(in,isdouble,s,e,upf); input [63:0] in; input isdouble; output s; // sign output [10:0] e; // biased exp ( zero adjusted ) output [52:0] upf; // unpacked mantissa
module fmul_encode(upf,enc); input [52:0] upf; output [5:0] enc;
module fmul_presft(upf,enc,presft);
input [52:0] upf;
input [5:0] enc;
output [52:0] presft;
module fmul_preadje(ea,eb,enca,encb,isdouble,c4_0,c4_1,sftbit_0,sftbit_1); input [10:0] ea,eb; input [5:0] enca,encb; input isdouble; output [12:0] c4_0,c4_1; // c4_0 : C3 , c4_1 : C3 + 1 output [12:0] sftbit_0,sftbit_1; // post sfift bit
module fmul_resultinf(rmode,sa,sb,sc,ovi);
input [1:0] rmode; // roundmode
input sa,sb;
output sc; // sign of result
output ovi;
module fmul_exception(a,b,isdouble,out,flags,istrue);
input [63:0] a,b;
input isdouble;
output [63:0] out;
output [4:0] flags; // V,O,Z,U,I
output istrue; // output is TRUE or Don't care
module fmul_boothencode(upfa,partb,partp);
input [52:0] upfa;
input [2:0] partb;
output [54:0] partp;
// partial product , 2's complement expression
module fmul_premux(c4_0,c4_1,sftbit_0,sftbit_1,msbz,c4,sftbit);
input [12:0] c4_0,c4_1;
input [12:0] sftbit_0,sftbit_1;
input msbz; // MSB of Z ( Z = X mul Y )
output [12:0] c4;
output [12:0] sftbit;
module fmul_postsft(o,sftbit,postsft);
input [105:0] o;
input [5:0] sftbit; // 0 ~ 64
output [54:0] postsft; // including round bit & sticky bit
module fmul_round(in,sib,rob,stb,rmode,round,cbr,iex);
input [52:0] in;
input sib,rob,stb; // sign bit , round bit , sticky bit
input [1:0] rmode;
output [52:0] round;
output cbr; // carry of rounded result
output iex; // inexact result
module fmul_postadje(c4,ovi,isdouble,
c5_0,c5_1,of_0,of_1,uf_0,uf_1,zo_0,zo_1);
input [12:0] c4;
input ovi;
// output infinity as a result if overflow
input isdouble;
output [12:0] c5_0,c5_1;
output of_0,of_1;
// overflow
output uf_0,uf_1;
// underflow ( both exact and inexact )
output [52:0] zo_0,zo_1;
// result of Z ( X mul Y ) if overflow and nontrap
| モジュール名 | cost prim. | 時間 (ns) | 必要数 | 小計 prim. |
|---|---|---|---|---|
| fmul_split | 198 | 1.866 | 2 | 396 |
| fmul_encode | 310 | 5.152 | 2 | 620 |
| fmul_presft | 875 | 4.414 | 2 | 1750 |
| fmul_preadje | 883 | 8.546 | 1 | 883 |
| fmul_resultinf | 9 | 1.154 | 1 | 9 |
| fmul_exception | 655 | 5.486 | 1 | 655 |
| fmul_boothencode | 786 | 6.691 | 27 | 21222 |
| fmul_comp1_0 | 452 | 1.204 | 9 | 4068 |
| fmul_comp2_0 | 478 | 1.244 | 3 | 1434 |
| fmul_comp2_1 | 475 | 1.181 | 3 | 475 |
| fmul_comp3_0 | 522 | 1.274 | 1 | 522 |
| fmul_comp3_1 | 520 | 1.280 | 1 | 520 |
| fmul_comp3_2 | 529 | 1.450 | 1 | 529 |
| fmul_comp3_3 | 476 | 1.015 | 1 | 476 |
| fmul_comp4_0 | 590 | 1.495 | 1 | 590 |
| fmul_comp4_1 | 589 | 1.407 | 1 | 589 |
| fmul_comp5_0 | 703 | 1.765 | 1 | 703 |
| fmul_comp5_1 | 510 | 1.008 | 1 | 510 |
| fmul_comp6_0 | 729 | 1.204 | 1 | 729 |
| fmul_comp7_0 | 685 | 0.835 | 1 | 685 |
| fmul_cla | 1142 | 13.724 | 1 | 1142 |
| fmul_premux | 87 | 1.334 | 1 | 87 |
| fmul_postsft | 2311 | 6.151 | 1 | 2311 |
| fmul_round | 862 | 6.778 | 1 | 862 |
| fmul_postadje | 148 | 6.787 | 1 | 148 |
インターフェースは以下の通り。
module fmul_1(CLK,a,b,isdouble,rmode,
disdouble,drmode,dea,deb,denca,dencb,dpresfta,dpresftb,dovi,dsc,
dexceout,dexceflags,disexcetrue);
input CLK;
input [63:0] a,b;
input isdouble;
input [1:0] rmode;
output disdouble;
output [1:0] drmode;
output [10:0] dea,deb;
output [5:0] denca,dencb;
output [52:0] dpresfta,dpresftb;
output dovi;
output dsc;
output [63:0] dexceout;
output [4:0] dexceflags;
output disexcetrue;
module fmul_2(CLK,
isdouble,rmode,ea,eb,enca,encb,presfta,presftb,ovi,sc,
exceout,exceflags,isexcetrue,
disdouble,drmode,dc4_0,dc4_1,dsftbit_0,dsftbit_1,dos,doc,dovi,dsc,
dexceout,dexceflags,disexcetrue);
input CLK;
input isdouble;
input [1:0] rmode;
input [10:0] ea,eb;
input [5:0] enca,encb;
input [52:0] presfta,presftb;
input ovi;
input sc;
input [63:0] exceout;
input [4:0] exceflags;
input isexcetrue;
output disdouble;
output [1:0] drmode;
output [12:0] dc4_0,dc4_1;
output [12:0] dsftbit_0,dsftbit_1;
output [105:0] dos;
output [96:0] doc;
output dovi;
output dsc;
output [63:0] dexceout;
output [4:0] dexceflags;
output disexcetrue;
module fmul_3(CLK,
isdouble,rmode,c4_0,c4_1,sftbit_0,sftbit_1,os,oc,ovi,sc,
exceout,exceflags,isexcetrue,
disdouble,drmode,dc4,dsftbit,dz,dovi,dsc,
dexceout,dexceflags,disexcetrue);
input CLK;
input isdouble;
input [1:0] rmode;
input [12:0] c4_0,c4_1;
input [12:0] sftbit_0,sftbit_1;
input [105:0] os;
input [96:0] oc;
input ovi;
input sc;
input [63:0] exceout;
input [4:0] exceflags;
input isexcetrue;
output disdouble;
output [1:0] drmode;
output [12:0] dc4;
output [12:0] dsftbit;
output [105:0] dz;
output dovi;
output dsc;
output [63:0] dexceout;
output [4:0] dexceflags;
output disexcetrue;
module fmul_4(CLK,
isdouble,rmode,c4,sftbit,z,ovi,sc,
exceout,exceflags,isexcetrue,
disdouble,dc5_0,dc5_1,dzo_0,dzo_1,dof_0,dof_1,duf_0,duf_1,dcbr,dround,diex,dsc,
dexceout,dexceflags,disexcetrue);
input CLK;
input isdouble;
input [1:0] rmode;
input [12:0] c4;
input [12:0] sftbit;
input [105:0] z;
input ovi;
input sc;
input [63:0] exceout;
input [4:0] exceflags;
input isexcetrue;
output disdouble;
output [12:0] dc5_0,dc5_1;
output [52:0] dzo_0,dzo_1;
output dof_0,dof_1;
output duf_0,duf_1;
output dcbr;
output dround;
output diex;
output dsc;
output [63:0] dexceout;
output [4:0] dexceflags;
output disexcetrue;
module fmul_5(
isdouble,c5_0,c5_1,zo_0,zo_1,of_0,of_1,uf_0,uf_1,
cbr,round,iex,sc,
exceout,exceflags,isexcetrue,
out,outflags
);
input isdouble;
input [12:0] c5_0,c5_1;
input [52:0] zo_0,zo_1;
input of_0,of_1;
input uf_0,uf_1;
input cbr;
input round;
input iex;
input sc;
input [63:0] exceout;
input [4:0] exceflags;
input isexcetrue;
output [63:0] out;
output [4:0] outflags;
最初に考えついた方法は、あまりにももったいないので、やはり 3 - 2 圧縮 器 ( CSA ) を使ってみることにする。
この方法は、大きなキャリーの伝播は 1 回のみとして、それ以外は、各桁を できるだけ独立に計算しようというものである。全加算器の 3 入力に対して、 同一桁のビットと、桁上がりのビットの 2 出力を吐くようにやっていく。但 し、これは非対称の汚い回路ができるので、一般性に乏しい。
1.
まず、2 Booth によってできた 27 個の 55 ビット部分積を、
上から順に ( このルールは色々考えられるが、今回は全ての段でこの条件を適用する )
3 つずつ区切り、57 ビット全加算器にかける。下位 2 ビットはスルーする。
すると、同一桁からは、59 ビットの和が 9 個、繰り上がりの桁からは、57 ビットの和が 9 個できる。
55b ( total 27 ) -> 57+2b(through2) , 57b ( total 18 )
0000000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111
+2222222222222222222222222222222222222222222222222222222
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456
0 1 2 3 4 5
3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
+5555555555555555555555555555555555555555555555555555555
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6666666666666666666666666666666666666666666666666666666
7777777777777777777777777777777777777777777777777777777
+8888888888888888888888888888888888888888888888888888888
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
9999999999999999999999999999999999999999999999999999999
0000000000000000000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
2222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333
+4444444444444444444444444444444444444444444444444444444
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
5555555555555555555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666
+7777777777777777777777777777777777777777777777777777777
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
8888888888888888888888888888888888888888888888888888888
9999999999999999999999999999999999999999999999999999999
+0000000000000000000000000000000000000000000000000000000
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333
----------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
4444444444444444444444444444444444444444444444444444444
5555555555555555555555555555555555555555555555555555555
+O666666666666666666666666666666666666666666666666666666
----------------------------------------------------------
dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
ddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
2.
57+2b , 57b , 57+2b -> 62+3b , 63b ( total 3 )
57b , 57+2b , 57b -> 60+3b , 60b , including head partial ( total 3 )
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
---------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
01234567890123456789012345678901234567890123456789012345678901
0 1 2 3 4 5 6
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789
0 1 2 3 4 5
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
---------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
---------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzz
+ddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-------------------------------------------------------------
ddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
dddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
3.
62+3b , 62b , 60+3b -> 68+4b , 68b
60b , 62+3b , 62b -> 66+5b , 66b
60+3b , 60b , 62+3b -> 70+4b , 70b
62b , 60+3b , 60b -> 61+5b , 61b ( 1 bit dummy ) ( head partial )
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
---------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
01234567890123456789012345678901234567890123456789012345678901234567
0 1 2 3 4 5 6
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
-----------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
0123456789012345678901234567890123456789012345678901234567890123456789
0 1 2 3 4 5 6
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
ddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
+dddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
--------------------------------------------------------------
dddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
dddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
0123456789012345678901234567890123456789012345678901234567890
0 1 2 3 4 5
4.
68+4b , 68b , 66+5b -> 79+5b , 79b
66b , 70+4b , 70b -> 75+8b , 75b
61+5b , 60b ( head partial ) -> through
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
--------------------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
0123456789012345678901234567890123456789012345678901234567890123456789012345678
0 1 2 3 4 5 6 7
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzz
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
----------------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789012345678901234
0 1 2 3 4 5 6 7
dddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
dddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789
0 1 2 3 4 5
5.
79+5b , 79b , 75+8b -> 96+6b , 96b
75b , 61+5b , 60b ( head partial ) -> 66+12b , 66b ( 1 bit dummy )
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzz
-------------------------------------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6 7 8 9
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
dddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzz
+ddddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----------------------------------------------------------------------
ddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzz
ddddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6
6.
96+6b , 96b , 66+12b ( headpartial ) -> 99+7b , 98b
65b ( headpartial ) -> through
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzz
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+ddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzz
----------------------------------------------------------------------------------------------------
ddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzz
ddddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
0 1 2 3 4 5 6 7 8 9
ddddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
01234567890123456789012345678901234567890123456789012345678901234
0 1 2 3 4 5 6
7.
99+7b , 98b , 65b ( headpartial ) -> 98+8b , 98b ( 1 bit dummy )
ddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzz
dddddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+dddddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
---------------------------------------------------------------------------------------------------
dddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzz
dddddYyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6 7 8 9 0
and CLA
dddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzz
ddddddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----------------------------------------------------------------------------------------------------------
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6 7 8 9 0
以上の方式に従うと、| モジュール名 | cost prim. | 時間 (ns) | 必要数 | 小計 prim. |
|---|---|---|---|---|
| boothencode ( 改 ) | 787 | 6.691 | 27 | 21249 |
| comp1_0 | 452 | 1.204 | 9 | 4068 |
| comp2_0 | 478 | 1.244 | 3 | 1434 |
| comp2_1 | 475 | 1.181 | 3 | 475 |
| comp3_0 | 522 | 1.274 | 1 | 522 |
| comp3_1 | 520 | 1.280 | 1 | 520 |
| comp3_2 | 529 | 1.450 | 1 | 529 |
| comp3_3 | 476 | 1.015 | 1 | 476 |
| comp4_0 | 590 | 1.495 | 1 | 590 |
| comp4_1 | 589 | 1.407 | 1 | 589 |
| comp5_0 | 703 | 1.765 | 1 | 703 |
| comp5_1 | 510 | 1.008 | 1 | 510 |
| comp6_0 | 729 | 1.204 | 1 | 729 |
| comp7_0 | 685 | 0.835 | 1 | 685 |
| cla | 1142 | 13.724 | 1 | 1142 |
| モジュール名 | cost prim. | 時間 (ns) | 必要数 | 小計 prim. |
|---|---|---|---|---|
| pproduct ( 遅いバージョン ) | 34317 | 18.453 | 1 | 34317 |
| cla | 1142 | 13.724 | 1 | 1142 |
やるべきことを以下に示していく。
module preencode(in,encode);
input [52:0] in;
output [5:0] encode;
モジュール preencode は、0 から 53 までを表現する 6 ビット出力である。
module presft(in,sft,out);
input [52:0] in;
input [5:0] sft;
output [52:0] out;
乗算において、返すべき指数の値は、基本的に、入力オペランドの指数の和を
とるだけでよいが、ゲタばき表現や、桁上がり等が実際には起こるため、調整
を行う必要がある。これを、仮数が 53b × 53b 乗算器に投入されている間に、
並列に実行する。
指数の調節において、知るべき情報は 5 つに分けられる
まず、2 つの入力オペランドである指数の和について考える。
ここで、気をつけるべきことは、指数フィールドは、ゲタばき表現 ( biased
exponent expression ) であるということに注意する。
倍精度の場合、入力の指数を A , B 、出力の指数を C とすると
次に、正規化シフト数の影響による指数の修正を考える。正規化シフトは左シ フトだから、シフトした分を前の C から引いてやればよい。何ビットシフト したかという情報をエンコードFA、エンコードFB とすると修正は以下のようになる。
以降、53b × 53b の乗算結果をふまえた修正を行っていく。
今回は、あらかじめ 1.f という形に修正して乗算器に投入しているため、
乗算器の出力は、あたかも固定小数点のような扱いが可能である。
( 但し、f は 52 ビットの 2 進列 )
即ち、正規化したもの同士、53 bit × 53 bit の計算を行い、
106 bit の結果を得たとき、{ 2 . 104 } の形で固定の小数点が存在するの
である。しかも
| 例外の種類 | 非トラップの結果 | トラップの引数 |
|---|---|---|
| 無効演算 | Quiet ( ? ) NaN | 入力オペランド |
| 0 除算 | 起こらない | 起こらない |
| オーバーフロー | ( 略 ) | 正規化した Z 、C4 と符号 |
| アンダーフロー | 丸めた結果 | 正規化した Z 、C4 と符号 |
| 不正確 | 丸めた結果 | 正規化した Z 、C4 と符号 |
まず丸めをどの 53 ビットについて行うか ( 何ビットポストシフトすればよいか )
を判断するため に C4 の値で最初の場合分けを行う。
C4' と書いたのは、実際には使われないで、実際には、丸めによる桁の繰り 上がりの存在を考慮した C5 を用いる。 ( 後述 )
それはさておき、C4 とポストシフトのビット数の関係をまとめると、以下の ようになる。
| C4 | ポストシフト ( bit ) |
|---|---|
| 0 以下 | ( Emin - C4 ) + MSBofZ = Emin - C3 |
| Emin ( 1 ) 〜 Emax | MSBofZ |
| Emax + 1 以上 | ( don't care : overflow ) |
結局、上表から、ポストシフトに関する値は、( MSBofZ ) , ( Emin - C3 ) の 2 通りを用意すればよい。 しかも、dont'care をうまく使えば、C4 が 0 以下かそうでないかを調べるだ けでよく、それは、C4 - 1 の MSB が 0 かどうかで判定できる。
( その根拠は、C4 は 2 の補数表現であるということと、C4 が取る最小値は - 1023 - 53 - 53 = - 1129 となり、12 ビットで表現できる数の最小値 - 2047 よりも大きな数なので、 C4 - 1 をしたときにその MSB が C4 の MSB と比べて変化するのは、 C4 - 1 = 0 、即ち C4 = 1 のときだけに限られると いうことにある )
実際には、MSBofC4m ( C4 - 1 の MSB ) を制御ビットとして、MSBofZ と Emin - C3 をセレクトするモジュールを構成すればよい。
以上をまとめると
| MSBofC4m | ポストシフト |
|---|---|
| 0 | MSBofZ |
| 1 | Emin - C3 |
となる。但しこの段階では、MSBofZ はまだわかっていない状態なので、
MSBofZ を 0 と仮定した場合と、MSBofZ を 1 と仮定した場合の 2 通りを出
力する。
このとき、丸め前であるこの段階でオーバーフローが確定しているものに関し
ては、仮数のシフトビット数は保証しないので、後のロジックで気をつける必
要がある。例えば、後の結果 0 の検出は、仮数が 0 であるとともに、オーバー
フローをしていないという条件も加えたほうがよい。
( オーバーフロー時は、仮数は不定として考えておくとよいかもしれない )
ここまでをモジュールにしたものが、 preadjexp である。前述した通り
の 2 通りの場合をここでは計算、出力しており、後でわかる MSBofZ の値でセレクトする。
module preadjexp(expa,expb,enca,encb,msba,msbb,
c4_0,c4_1,sft_0,sft_1);
input [10:0] expa,expb;
input [5:0] enca,encb;
input msba,msbb;
// FA[52] : MSB of unpacked FA ( F : mantissa )
output [12:0] c4_0,c4_1;
output [12:0] sft_0,sft_1; // post sfift bit
実際にセレクトするモジュールは、 premux である。
module premux(c4_0,c4_1,sft_0,sft_1,msbz,c4,sft);
input [12:0] c4_0,c4_1;
input [12:0] sft_0,sft_1;
input msbz; // MSB of Z ( Z = X mul Y )
output [12:0] c4;
output [12:0] sft;
上記までの時点で ( MSBofZ が 0 か 1 に確定すれば ) 仮数の方に関しては、 何処の 53 ビットを丸めればよいのかが完全に決まるが、指数の方は、丸めた 結果、桁上がりがあった場合の修正というものを考えなければならない。前述 した通り、C4 から ( C4' を経て ) C5 へ調整する事を考えてみる。
なお、この部分は、53b × 53b の乗算は終了しており、MSBofZ が既知のものとなり、
正しい C4 が選択されているものとする。
また、この部分は、C5 を計算するのに、丸めの結果桁上がりが起きたかどう
かが重要な判断材料となるが、 preadjexp 同様に、桁上がりが起きた場合と
桁上がりが起きなかったときの 2 通りの修正を行う。
| C4 | 丸めの 繰り上がり | C5 | 例外 |
|---|---|---|---|
| -1 以下 | ( don't care ) | 0 | アンダーフローか |
| 0 | 無 | 0 | アンダーフローか |
| 0 | 有 | 1 | 無し |
| 1 〜 Emax - 1 | 無 | C4 | 無し |
| 1 〜 Emax - 1 | 有 | C4 + 1 | 無し |
| Emax | 無 | Emax ( C4 ) | 無し |
| Emax | 有 | ※ | オーバーフロー |
| Emax + 1 以上 | ( don't care ) | ※ | オーバーフロー |
アンダーフローか、と書いたのは、トラップの無いときアンダーフローのフラグが立つのは、 同時に精度が損なわれたときのみなので、100 % 例外の状態になるとは言えないからである。
※ は、丸めモードと符号によって Emax か Emax + 1 かを取る。 丸めモードと符号の組み合わせ次第で、オーバーフロー時の返す値が
の、どちらかになる。
( 符号は、入力オペランド 2 つの数の符号の排他的論理和 ( xor ) になる )
ここで、OverFlow-Infinity ( OVI ) という信号を導入し、その値を参照する
ことで、オーバーフロー時に結果として返す値がどちらなのかを決定する。
この ovi を計算するのは、postadjexp とは別のモジュールである resultinfty で行う。 出力 ovi が 1 ならば、オーバーフロー時に∞を返す。 0 ならば 表現できる最大値を返す。また、ついでに結果の符号 sc も出力す る。
| 丸めモード | SA xor SB | OVI |
|---|---|---|
| RN ( 00 ) | ( don't care ) | 1 |
| RZ ( 01 ) | ( don't care ) | 0 |
| RP ( 10 ) | 0 1 | 1 0 | RM( 11 ) | 0 1 | 0 1 |
module resultinfty(rmode,sa,sb,sc,ovi);
input [1:0] rmode; // roundmode
input sa,sb;
output sc; // sign of result
output ovi;
結局、モジュール postadjexp では、以下のような function を個々に作った。 OVI については、前述したモジュール resultinfty の出力を利用する。また、 CarryByRounding ( CBR ) とは、丸めによって桁上がりが発生した際に丸め回 路が出力 ( アサート ) する信号である。そして preadjexp 同様に、CBR が 0 の場合と 1 の場合の両方を
の 4 つについて各々計算するようにしている。
( 計 8 出力になる )
| C4 | CBR | OVI | C5 | ZO |
|---|---|---|---|---|
| -1 以下 | ( don't care ) | ( don't care ) | 0 | ( don't care ) |
| 0 〜 Emax - 1 | ( don't care ) | ( don't care ) | C4 + CBR | ( don't care ) |
| Emax | 0 | ( don't care ) | Emax ( C4 ) | ( don't care ) |
| Emax | 1 | 0 1 | Emax Emax + 1 | 111...111 100...000 |
| Emax + 1 以上 | ( don't care ) | 0 1 |
Emax Emax + 1 | 111...111 100...000 |
| C4 | CBR | Overflow ( of ) |
|---|---|---|
| Emax - 1 以下 | ( don't care ) | 0 |
| Emax | 0 | 0 |
| Emax | 1 | 1 |
| Emax + 1 以上 | (don't care) | 1 |
| C4 | CBR | Underflow ( uf ) |
|---|---|---|
| -1 以下 | ( don't care ) | 1 |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 以上 | ( don't care ) | 0 |
module round(in,sib,rob,stb,rmode,out,cbr,iex);
input [52:0] in;
input sib,rob,stb; // sign bit , round bit , sticky bit
input [1:0] rmode;
output [52:0] out;
output cbr; // CarryByRounding : carry of rounded result
丸め回路。
入力は、MSB のみを整数部とする、固定小数点のフォーマットで渡される。ここまで考えた時点で一つ問題が起きた。デノーマルのときの桁上がりが検出 できなかった。つまり、 011...111 を丸めたとき、100...000 になっても、 あふれビット cbr が立たなかった。このときも cbr が立つように改造すること は、さほど難しくはない。
モジュール round は、下位に roundlogic を持っている。 roundlogic に関 しては、単純に丸めの判断となる真理値表に基づいて、 +1 を行うかどうかと いうビットを返すもので、合成の結果、12 primitives という小さな回路に落 ちついている。
module roundlogic(sib,lsb,rob,stb,rmode,out,iex);
input sib,lsb,rob,stb;
input [1:0] rmode; // 00:RN , 01:RZ , 10:RP , 11:RM
output out;
output iex; // inexact result by rounding
結局、 roundlogic の出力 out を、RLO と書くと、以下のような真理値表ができる。
| in | RLO | out | CBR |
|---|---|---|---|
| ( don't care ) | 0 | in | 0 |
| 011...111 111...111 上記以外 | 1 |
100...000 100...000 in + 1 | 1 1 0 |
上表では、デノーマルから正規化数に上がるのも、正規化数の桁が一つあがる のも、どちらも全く同じ結果を返しているが、指数を調整する回路でどちらな のかはちゃんと把握しているはずなので、これでよいはず。 そして出力 CBR を制御信号として、モジュール postadjexp で出力された
の 2 セットのうち、どちらかを選択する。
また、モジュール round は不正確の例外を発生するか否かという判断をする
基準となるビットInexact ( iex ) も出力する。
確かに定義通りであるならば、正確な値と表現している値に差があるので、当 然といえば当然だが。
以上の過程で、オーバーフロー、アンダーフローを考慮した正しい結果の候補
が出力されている。
更に、NaN や ∞等の特殊数に関する出力を別回路で行い、
ここでそれも一緒に出力することにする。
出力すべきものをまとめると
基本部分以外の各モジュールの組み合わせ回路としての合成結果は以下の通り。
| モジュール名 | cost prim. | 時間 (ns) | 必要数 | 小計 prim. |
|---|---|---|---|---|
| resultinfty | 9 | 1.154 | 1 | 9 |
| preencode | 286 | 5.129 | 2 | 572 |
| presft | 960 | 4.020 | 2 | 1920 |
| preadjexp | 652 | 8.136 | 1 | 652 |
| premux | 87 | 1.334 | 1 | 87 |
| postsft | 1162 | 6.548 | 1 | 1162 |
| postadjexp | 215 | 2.993 | 1 | 215 |
| postmux | 417 | 2.331 | 1 | 417 |
| round + roundlogic | 643 | 6.369 | 1 | 643 |
即ち、改善の余地があるかもしなれいところ
| code B | 部分積 |
| 000 | 0 |
| 001 | +A |
| 010 | +A |
| 011 | +2A |
| 100 | -2A |
| 101 | -A |
| 110 | -A |
| 111 | 0 |
module boothencode(in,code,out);
input [52:0] in;
input [2:0] code;
output [54:0] out; // 2's complement expression
53 bit × 53 bit を 2 Booth でエンコードすると、エンコードの結果は、入
力に対して 2 倍 の値まで持つことになり、更に、2 の補数表現というのも考
慮して、55 bit の部分積を生成する。そしてその生成される 55 bit の部分
積の数は、図のように 27 個である。
5 4 3 2 1 0
-21098765432109876543210987654321098765432109876543210-
------------------------------------------------------------
00 |-|-|---------|---------|---------|---------|--------00o
01 | | | | | | | 111
02 | | | | | | | 222
03 | | | | | | | 333
04 | | | | | | |444
05 | | | | | | 555
06 | | | | | | 666
07 | | | | | | 777
08 | | | | | | 888
09 | | | | | |999
10 |-|-|---------|---------|--------000
11 | | | | | 111
12 | | | | | 222
13 | | | | | 333
14 | | | | |444
15 | | | | 555
16 | | | | 666
17 | | | | 777
18 | | | | 888
19 | | | |999
20 |-|-|--------000
21 | | | 111
22 | | | 222
23 | | | 333
24 | | |444
25 | |555
26 |o66
27 個に分割された 3 bit のうち、最初と最後の末端は、必ず 0 になっている。
0000000000000000000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
+5555555555555555555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666
+7777777777777777777777777777777777777777777777777777777
8888888888888888888888888888888888888888888888888888888
+9999999999999999999999999999999999999999999999999999999
0000000000000000000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
+5555555555555555555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666
+7777777777777777777777777777777777777777777777777777777
8888888888888888888888888888888888888888888888888888888
+9999999999999999999999999999999999999999999999999999999
0000000000000000000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
+5555555555555555555555555555555555555555555555555555555
O666666666666666666666666666666666666666666666666666666
上記のモジュールを、partial55 とする。
module partial55(ina,inb,out);
input [54:0] ina,inb;
output [56:0] out;
assign out = { {ina[54],ina[54],ina[54:2]}+inb , ina[1:0] };
000000000000000000000000000000000000000000000000000000000
+111111111111111111111111111111111111111111111111111111111
222222222222222222222222222222222222222222222222222222222
+333333333333333333333333333333333333333333333333333333333
444444444444444444444444444444444444444444444444444444444
+555555555555555555555555555555555555555555555555555555555
666666666666666666666666666666666666666666666666666666666
+777777777777777777777777777777777777777777777777777777777
888888888888888888888888888888888888888888888888888888888
+999999999999999999999999999999999999999999999999999999999
000000000000000000000000000000000000000000000000000000000
+111111111111111111111111111111111111111111111111111111111
222222222222222222222222222222222222222222222222222222222
+ooO333333333333333333333333333333333333333333333333333333
これを実現するのは、モジュール partial57 である。
module partial57(ina,inb,out);
input [56:0] ina,inb;
output [60:0] out;
assign out = { {ina[56],ina[56],ina[56],ina[56],ina[56:4]}+inb , ina[3:0] };
0000000000000000000000000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444444444
+5555555555555555555555555555555555555555555555555555555555555
ooO6666666666666666666666666666666666666666666666666666666666
モジュール partial61 で実現する。
module partial61(ina,inb,out);
input [60:0] ina,inb;
output [68:0] out;
assign out = { {ina[60],ina[60],ina[60],ina[60],ina[60],ina[60],ina[60],ina[60],
ina[60:8]}+inb , ina[7:0] };
000000000000000000000000000000000000000000000000000000000000000000000
111111111111111111111111111111111111111111111111111111111111111111111
222222222222222222222222222222222222222222222222222222222222222222222
+OOOOOOOOooO3333333333333333333333333333333333333333333333333333333333
モジュール partial69 にて。
module partial69(ina,inb,out);
input [68:0] ina,inb;
output [84:0] out;
assign out = { {ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],
ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],ina[68],
ina[68:16]}+inb ,ina[15:0] };
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+OOOOOOOOooO11111111111111111111111111111111111111111111111111111111111111111111111111
----------------------------------------------------------------------------------------------------------------------
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
0 1 2 3 4 5 6 7 8 9 0
入出力が変則的なモジュールは partial74 とする。
module partial74(ina,inb,out);
input [84:0] ina;
input [73:0] inb
output [105:0] out;
assign out = { {ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],
ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],ina[84],
ina[84:32]}+inb , ina[31:0] };
以上のモジュールの組み合わせ回路としての速さは、東芝のライブラリを使用した Mentor にかけると
| モジュール名 | prim. cost | 時間 (ns) | 必要数 |
|---|---|---|---|
| boothencode | 1176 | 6.805 | 27 |
| partial55 | 658 | 8.530 | 13 |
| partial57 | 683 | 8.754 | 7 |
| partial61 | 730 | 9.251 | 3 |
| partial69 | 822 | 10.245 | 2 |
| partial74 | 879 | 10.968 | 1 |
| X op Y | Y = 0 | Y = W | Y = ∞ | Y = NaN |
|---|---|---|---|---|
| X = 0 | (ii) | (i) | ||
| X = W | (ii) | (i) | ||
| X = ∞ | (ii) | (ii) | (ii) | (i) |
| X = NaN | (i) | (i) | (i) | (i) |
| X = NaN ? | Y = NaN ? | 結果 |
|---|---|---|
| 0 | 0 | d (担当外) |
| 0 | 1 | Y |
| 1 | 0 | X |
| 1 | 1 | X |
| X | Y | Z |
|---|---|---|
| ∞ | ∞ | ∞ |
| ∞ | W | ∞ |
| W | ∞ | ∞ |
| ∞ | 0 | Signaling ( ? ) NaN |
| 0 | ∞ | Signaling ( ? ) NaN |