SCENE RESEARCH STATION  
with my everyday
thinking-and-doctrine

LastUpdate Fri Jan 24 09:06:59 2020

verilog_mul

  • verilog_mulとは
  • 仕様
  • 使い方
  • スナップショット
  • *ダウンロード*
  • 連絡
  • 謝辞
  • リンク

    verilog_mulとは

    任意の大きさの乗算器(multiplier)と積和演算器(MAC;multiplier and accumaltor)を自動生成するプログラムです.

    簡単に言うとに整数a,b,cに対してa*bまたはa*b+cを出力するverilogコードと,そのテスト用コードが出力されます. 浮動小数点(倍精度)のとある演算器を作成するために作られたために,64bit*64bitの上位64bitのみを出力するといった指定が可能です(但し若干誤差が出る).

    細かい最適化等は論理合成任せです.いろいろと手抜きをしています.基本的にアバウトです.悪しからず.

    元々特定の大きさの乗算器が作りたかっただけなので,ビット幅の指定によってはおかしなコードが生成されるかもしれません.綿密にテストしてからご使用ください.
    当たり前ですが,このプログラムは無保証です.このプログラムによって生じたあらゆる損害の責任も負うつもりはありません.

    仕様

    動作環境

    現在,win32コンソールのみに対応.手抜き.

    特徴

  • 掛けられる数のビット数(in1),掛ける数のビット数(in2),出力の上位ビット数(out),足す数のビット数(in3)を指定して,乗算及び積和演算器を組み合わせ回路として出力
  • 同時にテスト用コードも出力
  • 乗算にはWallace木を使用
  • 部分積の生成にBoothのアルゴリズムを用いない
  • 桁上げ保存加算(CSA;Carry Save Adder)を使用.HA(Half Adder)で済む箇所もFA(Full Adder)を使っているため無駄が生じているが,そこは論理合成任せ
  • 積和では足しこむ値を部分積として処理するので,乗算と処理速度が大概において変わらない
  • 最終加算ではverilogの演算子 + を使用.論理合成で制約を与えないとCLA(Carry Look ahead Adder)ではなく,RCA(Ripple Carry Adder)が出てくるので注意
  • パイプライン化し易いコードを出力
  • 入出力は2の補数ではありません.unsignedです.

    DesignWareとの比較

    DWでもWallace木の乗算器作れるし,これで作る意味といえば人間が読めるソースが出てくる事くらいかなあ.
    あと小数点演算に使う時面積が削減できることか.
    普通の整数の積和が作りたいならDesignWare使った方が簡単で安全だと思います.
    てか,これ作った頃はDesignWareでまともな乗算器が作れるとは知らなかったんだよー.

    使い方

    乗算器の生成

  • 16[bits] * 16[bits] -> 32[bits]
    verilog_mul 32 16 16

  • 53[bits] * 53[bits] -> 60[bits](106bitの上位60bit)
    verilog_mul 60 53 53
    倍精度の乗算器を作る場合,53x53の乗算器が必要になる.しかし出力は106bitも要らない.そこで上位60bitのみを出力させ面積を小さくする.
    なお,実質欲しいのは上位53bitだけだが,誤差を抑えるためにlog2(53)以上余分にビット幅を取って計算するべきなので,ここでは60bitとした.
    あんまり関係ないけど,入力が正規化されているならば,出力されたコードを修正して最適化しておくと吉.

    積和演算器の生成

  • 53[bits] * 53[bits] + 56[bits]<<(106-56) -> 60[bits](106bitの上位60bit)
    verilog_mul 60 53 53 56
    53x53の乗算結果の上位に56bitを足しこんでみたの図.いわゆる固定小数点の積和演算器.

    テストパターンの個数

  • 16[bits] * 16[bits] -> 32[bits]
    verilog_mul 32 16 16 0 512
    とやれば512個のテストパターンが生成される.
    標準では32個のテストパターンしか生成されない.

    シミュレーションによるテスト

    シミュレータとしてSynopsys社のvcsを使う.
    32bit*24bitの上位に32bitを足しこむ積和演算器を作ってみる.
    verilog_mul 56 32 24 32
    mac56_32x24.vtest_mac56_32x24.vが生成されたはずである.シミュレータで動作を確認する.
    vcs test_mac56_32x24.v -R
    (verilogXLなら verilog test_mac56_32x24.v)
    すると次のように出るはず.
    Parsing design file 'test_mac56_32x24.v'
    Parsing included file 'mac56_32x24.v'.
    Back to file 'test_mac56_32x24.v'.
    Top Level Modules:
           test
    TimeScale is 1 ns / 1 ns
    1 of 10 unique modules to generate
    1 of 1 modules done
    Invoking loader...
    Warning : License for product VCSRuntime_Net(725) will expire within9 days, on: 31-mar-2003.
    
    If you would like to temporarily disable this message, set
     the VCS_LIC_EXPIRE_WARNING environment variable to the number of days
    before expiration that you want this message to start (the minimum is 5).
    Chronologic VCS simulator copyright 1991-2000
    Contains Synopsys proprietary information.
    Compiler version 5.2; Runtime version 5.2;  Mar 22 16:37 2003
    
    c83fa926 * aedba7 + e40146c0 = 6cc85ccf0ed9ca(6cc85ccf0ed9ca)                 0(-)
    963e2b1e * 2e88ff + e8255721 = 0374e98f38e2e2(0374e98f38e2e2)                 0(-)
    4b0d76b6 * 46fd01 + b0564438 = c5261f472354b6(c5261f472354b6)                 0(-)
    9e63bd4c * b4da7b + de495f1a = 4e2ead3c8eab84(4e2ead3c8eab84)                 0(-)
    23a58d0d * 606da4 + debbc0a3 = ec2919dafce554(ec2919dafce554)                 0(-)
    98b09891 * 593ba2 + f03e154e = 25770bab52f6c2(25770bab52f6c2)                 0(-)
    6ae2a8c5 * f2bf98 + 37ea7e33 = 9d44c04fb92ff8(9d44c04fb92ff8)                 0(-)
    a52f3158 * 9cb68d + 79bebe52 = dedd4aebb2bd78(dedd4aebb2bd78)                 0(-)
    8dd63879 * 2e2ea3 + 17ddbf08 = 317413fb49b30b(317413fb49b30b)                 0(-)
    316b393e * 4c0d39 + 01de0c2a = 108c6e9b2fe4ce(108c6e9b2fe4ce)                 0(-)
    381ad91d * 7cd29f + cbd087ca = e72bb1d2d2a303(e72bb1d2d2a303)                 0(-)
    6b0df531 * ac18ad + 6c38444a = b42ff6ae574a1d(b42ff6ae574a1d)                 0(-)
    8b484390 * 435534 + 5a05f8ab = 7ea83da2cc8940(7ea83da2cc8940)                 0(-)
    5aa3ec34 * 09ff32 + bc411845 = bfcb368f1fee28(bfcb368f1fee28)                 0(-)
    f29158a2 * 8ea844 + e956d5e5 = 7082e4dfa1db08(7082e4dfa1db08)                 0(-)
    3f0b17f0 * 4a8176 + 1af20961 = 2d4b1ff28cf8a0(2d4b1ff28cf8a0)                 0(-)
    0a7e3632 * 794765 + f4170b47 = f90fa009753fba(f90fa009753fba)                 0(-)
    3145092d * c2bcd9 + 9c8e67c6 = c20911305bd325(c20911305bd325)                 0(-)
    67c3b724 * 7ec623 + 765e496a = a9c0ed1d1fe1ec(a9c0ed1d1fe1ec)                 0(-)
    1f79ed9b * 2d092a + c134f395 = c6be82cc9a6e6e(c6be82cc9a6e6e)                 0(-)
    5e893efb * 9d18d4 + fd93a2a2 = 3796f9697eafdc(3796f9697eafdc)                 0(-)
    0469aaca * 823efd + ec32d28e = ee71913c5eb5a2(ee71913c5eb5a2)                 0(-)
    e9ae7ed8 * 4ceff6 + 7a189963 = c0537181398b90(c0537181398b90)                 0(-)
    9788d167 * abd632 + 71dfdcf8 = d7970acf92001e(d7970acf92001e)                 0(-)
    6ed6e126 * a1fb75 + 16db57a3 = 5cfd5a92db285e(5cfd5a92db285e)                 0(-)
    d594a1a4 * 7d3952 + 2d797215 = 95f2d783ad4a88(95f2d783ad4a88)                 0(-)
    09e0667b * 9869b7 + 2cf57bb9 = 32d6ccab79b4ed(32d6ccab79b4ed)                 0(-)
    fd1486d0 * 71d6bd + 2bf5eb4a = 9c8044cca96790(9c8044cca96790)                 0(-)
    54d4b8b0 * 6f8c92 + 5d6d985a = 82646924a19460(82646924a19460)                 0(-)
    aadeda49 * d25751 + 39afb7b3 = c614ce8f93e019(c614ce8f93e019)                 0(-)
    a18acde1 * c0a582 + 20c911b2 = 9a599c99ee9142(9a599c99ee9142)                 0(-)
    2bd5c6ea * a367d9 + 559ae897 = 7195ce693bc25a(7195ce693bc25a)                 0(-)
    $finish at simulation time                  320
               V C S   S i m u l a t i o n   R e p o r t
    Time: 320 ns
    
    a * b + c = d(e) f(g)
    という形式で出力される.a,b,cが入力でdが出力,eが真値,fが誤差,gが誤差の符号となっている.
    この場合下位bitを省かずに完全に計算しているので,誤差は出ないが,
    verilog_mul 38 32 24 32
    のように上位ビットだけ計算する場合は誤差が出る.
    このような場合,下位ビットを切り捨てているために真値より小さい値となる.よってバイアスを掛ける事によって誤差を小さくする事ができる(出力されたソースを修正してください).

    これを論理合成するとこんな感じになるはず.report_timingreport_area
    なお,論理合成にはSynopsys社のDesign Compiler,セルライブラリにはローム0.35umプロセス用 東大版 ライブラリを利用した.

    論理合成時の注意点

    まず ClaXX をungroup -all -flattenして適当に遅延制約かけて,compileしてください.
    それからmul/mac本体をuniquify,ungroup -all -flattenしてcompileしないと,すげーたくさんwarningが出てきます.
    Csa32 csa12( w50[31:0],w51[31:0], {3'b0,w36[28:0]},{w38[31:0]},{w39[30:0],1'b0} );
    みたいに定数を噛ませているせいです,
    本当はHAも使うべきなんだけど,もう面倒なので勘弁してください.直すつもりはありません.
    あー,あと未使用のwireがあったりするのも原因だ.論理合成でそういうwireは消えるので気にしない方向で.
    てか,ソースが汚いのでもういじりたくねえ.

    *ダウンロード*

  • verilogmul20030320.zip 31KB -
    公開開始.

    連絡

    バグを発見した方,要望がある方はメールもしくはbbsまでお願いします.

    Special Thanx - greeting

    Link - greeting and respect

    oldlog 99-00 00-01 01 01-02 02
    newlog 2002 2003 2004 2005 2006 2007
    category scene | 2ch | 麻雀

    Copyright (C) 2003-2004 mitsuman(mnishibe at ertl.jp) All Rights Reserved.

    750k+