整数型の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 ddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2.
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 dddyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy3.
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 54.
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 55.
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 66.
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 67.
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 expression53 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 |o6627 個に分割された 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 |