Intel® Quartus® Prime Standard Edition User Guide: Third-party Synthesis
ID
683796
Date
9/24/2018
Public
1.1. About Synplify Support
1.2. Design Flow
1.3. Hardware Description Language Support
1.4. Intel Device Family Support
1.5. Tool Setup
1.6. Synplify Software Generated Files
1.7. Design Constraints Support
1.8. Simulation and Formal Verification
1.9. Synplify Optimization Strategies
1.10. Guidelines for Intel FPGA IP Cores and Architecture-Specific Features
1.11. Incremental Compilation and Block-Based Design
1.12. Synopsys Synplify* Support Revision History
1.10.1.1. Instantiating Intel FPGA IP Cores with IP Catalog Generated Verilog HDL Files
1.10.1.2. Instantiating Intel FPGA IP Cores with IP Catalog Generated VHDL Files
1.10.1.3. Changing Synplify’s Default Behavior for Instantiated Intel FPGA IP Cores
1.10.1.4. Instantiating Intellectual Property with the IP Catalog and Parameter Editor
1.10.1.5. Instantiating Black Box IP Cores with Generated Verilog HDL Files
1.10.1.6. Instantiating Black Box IP Cores with Generated VHDL Files
1.10.1.7. Other Synplify Software Attributes for Creating Black Boxes
1.11.1. Design Flow for Incremental Compilation
1.11.2. Creating a Design with Separate Netlist Files for Incremental Compilation
1.11.3. Using MultiPoint Synthesis with Incremental Compilation
1.11.4. Creating Multiple .vqm Files for a Incremental Compilation Flow With Separate Synplify Projects
1.11.5. Performing Incremental Compilation in the Intel® Quartus® Prime Software
2.1. About Precision RTL Synthesis Support
2.2. Design Flow
2.3. Intel Device Family Support
2.4. Precision Synthesis Generated Files
2.5. Creating and Compiling a Project in the Precision Synthesis Software
2.6. Mapping the Precision Synthesis Design
2.7. Synthesizing the Design and Evaluating the Results
2.8. Exporting Designs to the Intel® Quartus® Prime Software Using NativeLink Integration
2.9. Guidelines for Intel FPGA IP Cores and Architecture-Specific Features
2.10. Incremental Compilation and Block-Based Design
2.11. Mentor Graphics Precision* Synthesis Support Revision History
2.8.1. Running the Intel® Quartus® Prime Software from within the Precision Synthesis Software
2.8.2. Running the Intel® Quartus® Prime Software Manually Using the Precision Synthesis‑Generated Tcl Script
2.8.3. Using the Intel® Quartus® Prime Software to Run the Precision Synthesis Software
2.8.4. Passing Constraints to the Intel® Quartus® Prime Software
2.9.1. Instantiating IP Cores With IP Catalog-Generated Verilog HDL Files
2.9.2. Instantiating IP Cores With IP Catalog-Generated VHDL Files
2.9.3. Instantiating Intellectual Property With the IP Catalog and Parameter Editor
2.9.4. Instantiating Black Box IP Functions With Generated Verilog HDL Files
2.9.5. Instantiating Black Box IP Functions With Generated VHDL Files
2.9.6. Inferring Intel FPGA IP Cores from HDL Code
2.9.6.1. Multipliers
2.9.6.2. Setting the Use Dedicated Multiplier Option
2.9.6.3. Setting the dedicated_mult Attribute
2.9.6.4. Multiplier-Accumulators and Multiplier-Adders
2.9.6.5. Controlling DSP Block Inference
Setting the extract_mac Attribute in Verilog HDL
Setting the extract_mac Attribute in VHDL
Using extract_mac, dedicated_mult, and preserve_signal in Verilog HDL
Using extract_mac, dedicated_mult, and preserve_signal in VHDL
2.9.6.6. RAM and ROM
2.10.1. Creating a Design with Precision RTL Plus Incremental Synthesis
2.10.2. Creating Multiple Mapped Netlist Files With Separate Precision Projects or Implementations
2.10.3. Creating Black Boxes to Create Netlists
2.10.4. Creating Intel® Quartus® Prime Projects for Multiple Netlist Files
2.10.5. Hierarchy and Design Considerations
2.9.6.5. Controlling DSP Block Inference
By default, the Precision Synthesis software infers the ALTMULT_ADD or ALTMULT_ACCUM IP cores appropriately in your design. These IP cores allow the Intel® Quartus® Prime software to select either logic or DSP blocks, depending on the device utilization and the size of the function.
You can use the extract_mac attribute to prevent inference of an ALTMULT_ADD or ALTMULT_ACCUM IP cores in a certain module or entity.
Value | Description |
---|---|
TRUE | The ALTMULT_ADD or ALTMULT_ACCUM IP core is inferred. |
FALSE | The ALTMULT_ADD or ALTMULT_ACCUM IP core is not inferred. |
To control inference, use the extract_mac attribute with the appropriate value from the examples below in your HDL code.
Setting the extract_mac Attribute in Verilog HDL
//synthesis attribute <module name> extract_mac <value>
Setting the extract_mac Attribute in VHDL
ATTRIBUTE extract_mac: BOOLEAN; ATTRIBUTE extract_mac OF <entity name>: ENTITY IS <value>;
Using extract_mac, dedicated_mult, and preserve_signal in Verilog HDL
To control the implementation of the multiplier portion of a multiply-accumulator or multiply-adder, you must use the dedicated_mult attribute.
You can use the extract_mac, dedicated_mult, and preserve_signal attributes (in Verilog HDL and VHDL) to implement the given DSP function in logic in the Intel® Quartus® Prime software.
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
Using extract_mac, dedicated_mult, and preserve_signal in VHDL
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;