インテル® Quartus® Prime プロ・エディション ユーザーガイド: サードパーティー合成

ID 683122
日付 9/24/2018
Public
ドキュメント目次

1.8.6.5. DSPブロック推測の制御

デフォルトでは、Precision Synthesisソフトウェアは、ALTMULT_ADDまたはALTMULT_ACCUM IPコアをデザインで適切に推測します。これらのIPコアにより、 インテル® Quartus® Prime開発ソフトウェアは、デバイスの利用率およびファンクションのサイズに応じて、ロジックブロックまたはDSPブロックのいずれかを選択します。

extract_mac属性を使用すると、特定のモジュールまたはエンティティー内のALTMULT_ADDまたはALTMULT_ACCUM IPコアの推測を防止できます。

表 4.  DSP実装を制御する属性extract_mac属性のオプション
説明
TRUE ALTMULT_ADDまたはALTMULT_ACCUM IPコアが推測されます。
FALSE ALTMULT_ADDまたはALTMULT_ACCUM IPコアが推測されません。

推測の制御には、extract_mac属性を使用し、次の例に示すようにHDLコードには適切な値を当てます。

Verilog HDLでのextract_mac属性の設定

//synthesis attribute <module name> extract_mac <value>

VHDLでのextract_mac属性の設定

ATTRIBUTE extract_mac: BOOLEAN;
ATTRIBUTE extract_mac OF <entity name>: ENTITY IS <value>;

Verilog HDLでのextract_mac、dedicated_mult、およびpreserve_signalの使用

乗算累算器または乗算加算器の乗算器部分の実装を制御するには、dedicated_mult属性を使用する必要があります。

extract_macdedicated_mult、およびpreserve_signal属性(Verilog HDLおよびVHDL)を使用して、 インテル® Quartus® Prime開発ソフトウェアのロジックで指定のDSPファンクションを実装することができます。

module unsig_altmult_accuml (dataout, dataa, datab, clk, aclr, clken);
   input [7:0} dataa, datab;
   input clk, aclr, clken;
   output [31:0] dataout;

   reg    [31:0] dataout;
   wire   [15:0] multa;
   wire   [31:0] adder_out;

   assign multa = dataa * datab;

   //synthesis attribute multa preserve_signal TRUE
   //synthesis attribute multa dedicated_mult OFF
   assign adder_out = multa + dataout;

   always @ (posedge clk or posedge aclr)
   begin
      if (aclr)
      dataout <= 0;
      else if (clken)
      dataout <= adder_out;
   end

   //synthesis attribute unsig_altmult_accuml extract_mac FALSE
endmodule

Verilogでのextract_mac、dedicated_mult、およびpreserve_signalの使用

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_signed.all;
ENTITY signedmult_add IS
   PORT(
      a, b, c, d: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
      result: OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
   ATTRIBUTE preserve_signal: BOOLEANS;
   ATTRIBUTE dedicated_mult: STRING;
   ATTRIBUTE extract_mac: BOOLEAN;
   ATTRIBUTE extract_mac OF signedmult_add: ENTITY IS FALSE;
END signedmult_add;
ARCHITECTURE rtl OF signedmult_add IS
   SIGNAL a_int, b_int, c_int, d_int : signed (7 DOWNTO 0);
   SIGNAL pdt_int, pdt2_int : signed (15 DOWNTO 0);
   SIGNAL result_int: signed (15 DOWNTO 0);
   ATTRIBUTE preserve_signal OF pdt_int: SIGNAL IS TRUE;
   ATTRIBUTE dedicated_mult OF pdt_int: SIGNAL IS "OFF";
   ATTRIBUTE preserve_signal OF pdt2_int: SIGNAL IS TRUE;
   ATTRIBUTE dedicated_mult OF pdt2_int: SIGNAL IS "OFF";
BEGIN
   a_int <= signed (a);
   b_int <= signed (b);
   c_int <= signed (c);
   d_int <= signed (d);
   pdt_int <= a_int * b_int;
   pdt2_int <= c_int * d_int;
   result_int <= pdt_int + pdt2_int;
   result <= STD_LOGIC_VECTOR(result_int);
END rtl;