PSoC UDB 内 PLD/マクロセルによる乗算器

今回も PSoC3/4/5LP の UDB (Universal Digtal Block) 内の PLD/マクロセルによる回路の小ネタです。
LPM (Library of Parameterized Modules) ライブラリの「mmult()」コンポーネントによる乗算回路です。
mmult() は

result = (dataa * datab) + sum

の「積和演算」を計算するコンポーネントで、「sum」は省略可能で、その場合は単純な乗算器となります。
実際には、Verilog 組み込みの 2 項演算子「*」を使った場合の結果と同等のようです。
mmult() のパラメタ / 入出力ポートの定義を下に示します。

module mmult (dataa, datab, sum, result);

    parameter lpm_widtha = 1;
    parameter lpm_widthb = 1;
    parameter lpm_widths = 0;
    parameter lpm_widthp = 2;
    parameter lpm_representation = `LPM_UNSIGNED;
    parameter lpm_hint = `SPEED;

    input  [lpm_widtha-1:0] dataa;
    input  [lpm_widthb-1:0] datab;
    input  [lpm_widths-1:0] sum;
    output [lpm_widthp-1:0] result;

OPL3 のビブラート適用ずみの FNUMBER (11 ビット) に音色パラメタの「MULT」(4 ビット) を掛けることを想定して、11 ビット × 4 ビット乗算のコンポーネント「mpy11」を作成しました。 全体の回路を下に示します。

Verilog コードを下に示します。

//`#start header` -- edit after this line, do not edit this line
// ========================================
//
// Copyright YOUR COMPANY, THE YEAR
// All Rights Reserved
// UNPUBLISHED, LICENSED SOFTWARE.
//
// CONFIDENTIAL AND PROPRIETARY INFORMATION
// WHICH IS THE PROPERTY OF your company.
//
// ========================================
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
// Generated on 10/19/2016 at 18:28
// Component: mpy11
module mpy11 (
	output [14:0] result,
	input  [10:0] dataa,
	input  [3:0] datab
);
	parameter width_a = 11;
	parameter width_b = 4;
	parameter width_r = 15;

//`#start body` -- edit after this line, do not edit this line

//        Your code goes here

mmult #(.lpm_widtha(width_a),
        .lpm_widthb(width_b),
        .lpm_widthp(width_p))
  mpy(.dataa(dataa),
      .datab(datab),
      .result(result));

//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

dataa/datab/result のビット幅をパラメタで指定し、sum ポートなしで mmult() を呼び出しているだけです。
出来上がったモジュールでは、マクロセル 85 個を消費する、下図のような (Booth のアルゴリズム等を使用しない)「普通」の並列乗算器が生成されていました。

この図で、バス線に下から斜め 45° の線で接している表現はデータの LSB の下にゼロを補ってビット幅を増やすことを意味しています。 データを 1 ビットあるいは 2 ビット左シフトして、空いた位置に 1 ビットあるいは 2 ビットの「0」を詰めます。
同様に、上から斜め 45° の線で接している表現はデータの MSB の上に 1 ビットあるいは 2 ビットのゼロを付加してビット幅を増やすことを意味しています。
PSoC3/5LP の 24 UDB (192 マクロセル) におさまる範囲内で、どこまで被乗数、乗数のビット幅を増やせるかを試して見ました。
結果の表を下に示します。

8 ビット 7 ビット 6 ビット
16 ビット × × 192 (100 %)
15 ビット × × 181 (94.3 %)
14 ビット × × 170 (88.5 %)
13 ビット × × 159 (82.8 %)
12 ビット × 182 (94.8 %) 148 (77.1 %)
11 ビット 189 (98.4 %) 169 (88.0 %)
10 ビット 174 (90.6 %)
9 ビット 159 (82.8 %)
8 ビット 144 (75.0 %)

「×」となっている欄は 192 マクロセルにおさまらず、実現不可能なことを示しています。 空欄となっている組み合わせは、単に試していないだけです。
16 ビット × 6 ビットの組み合わせでは 192 マクロセルを消費し、100 % 使い切っています。
また、11 ビット × 8 ビットの組み合わせでは 189 マクロセルを消費し、98.4 % となっています。
短いほうのビット幅が 9 以上となる組み合わせでは全く実現不可能でした。