Return to previous page Advance to next page
Foundation Series 2.1i User Guide
Chapter 5: Design Methodologies - HDL Flow

HDL Designs with Black Box Instantiation

LogiBLOXs, CORE Generator modules, ABEL modules, and EDIF and XNF files can be instantiated in the VHDL and Verilog code using the “black box instantiation” method.

The Files tab in the Hierarchy Browser does not display the black box module name under the HDL file(s) in which it is instantiated. The Express compiler does not synthesize the black box. It is left as an unlinked cell and resolved in the Translate phase of the implementation.

This section describes how to create HDL designs that instantiate black boxes.

LogiBLOX Modules in a VHDL or Verilog Design

LogiBLOX modules may be generated in Foundation and then instantiated in the VHDL or Verilog code. This flow may be used for any LogiBLOX component, but it is especially useful for memory components such as RAM. Never describe RAM behaviorally in the HDL code, because combinatorial feedback paths will be inferred.

The module being instantiated must be located in the HDL project directory (that is, the directory where the top-level HDL file resides). Running LogiBLOX from the Foundation project ensures this condition is met.

LogiBLOX provides a template tool for generating the VHDL or Verilog component declaration statement.

VHDL Instantiation

This section explains how to instantiate a LogiBLOX module into a VHDL design using Foundation. The example described below creates a RAM48X4S using LogiBLOX.

  1. Access the LogiBLOX Module Selector window using one of the following methods. Its operation is the same regardless of where it is invoked.

  2. Click Setup on the LogiBLOX Module Selector screen. (The first time LogiBLOX is invoked, the Setup screen appears automatically.)

  3. In the Setup window, enter the following items.

  4. In the LogiBLOX Module Selector window, define the type of LogiBLOX module and its attributes. The Module Name specified here is used as the name of the instantiation in the VHDL code.



  5. When you click OK, the LogiBLOX module is created automatically and added to the project library.

    The LogiBLOX module is a collection of several files including those listed below. The files are located in your Xilinx project directory for the current project.


    component_name.ngc
    Netlist used during the Translate phase of Implementation

    component_name.vhi
    Instantiation template used to add a LogiBLOX module into your VHDL source code

    component_name.vhd
    VHDL file used for functional simulation

    component_name.mod
    Configuration information for the module

    logiblox.ini
    LogiBLOX configuration for the project



    The component name is the name given to the LogiBLOX module in the GUI. The port names are the names provided in the .vhi file.

  6. In the HDL Editor, open the LogiBLOX-created .vhi file (memory.vhi) located under the current project. The .vhi file for the memory component created in the previous steps is shown below.

    -----------------------------------------------
    -- LogiBLOX SYNC_RAM Module "memory"
    -- Created by LogiBLOX version C.16
    -- on Tue Jun 01 16:46:04 1999
    -- Attributes
    -- MODTYPE = SYNC_RAM
    -- BUS_WIDTH = 4
    -- DEPTH = 48
    -- STYLE = MAX_SPEED
    -- USE_RPM = FALSE
    -----------------------------------------------
    -----------------------------------------------
    -- Component Declaration
    -----------------------------------------------
    component memory
    PORT(
    A: IN std_logic_vector(5 DOWNTO 0);
    DO: OUT std_logic_vector(3 DOWNTO 0);
    DI: IN std_logic_vector(3 DOWNTO 0);
    WR_EN: IN std_logic;
    WR_CLK: IN std_logic);
    end component;

    -----------------------------------------------
    -- Component Instantiation
    -----------------------------------------------
    instance_name : memory port map
    (A => ,
    DO => ,
    DI => ,
    WR_EN => ,
    WR_CLK => );


  7. Open a second session of the HDL Editor. In the second HDL Editor window, open the VHDL file in which the LogiBLOX component is to be instantiated.

    Note: Instead of opening a second sesssion, you could use Edit Insert File from the HDL Editor tool bar to insert the file into the current HDL Editor session.

    Cut and paste the Component Declaration from the LogiBLOX component's .vhi file to your project's VHDL code, placing it after the architecture statement in the VHDL code.

    Cut and past the Component Instantiation from the LogiBLOX component's .vhi file to your VHDL design code after the “begin” line. Give the inserted code an instance name. Edit the code to connect the signals in the design to the ports of the LogiBLOX module.

    The VHDL design code with the LogiBLOX instantiation for the component named memory is shown below. For each .ngc file from LogiBLOX, you may have one or more VHDL files with the .ngc file instantiated. In this example, there is only one black box instantiation of memory, but multiple calls to the same module may be done.

    library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_arith.all;

    entity top is
    port (          D: in STD_LOGIC; CE: in STD_LOGIC;
                  CLK: in STD_LOGIC; Q: out STD_LOGIC;
                 Atop: in STD_LOGIC_VECTOR (5 downto 0);
                DOtop: out STD_LOGIC_VECTOR (3 downto 0);
                DItop: in STD_LOGIC_VECTOR (3 downto 0);
             WR_ENtop: in STD_LOGIC;
            WR_CLKtop: in STD_LOGIC);
    end top;

    architecture inside of top is

    component userff
    port (    D: in STD_LOGIC; CE: in STD_LOGIC;
            CLK: in STD_LOGIC; Q: out STD_LOGIC);
    end component;

    component memory
    port (    A: in STD_LOGIC_VECTOR (5 downto 0);
              DI: in STD_LOGIC_VECTOR (3 downto 0);
              WR_EN: in STD_LOGIC;
              WR_CLK: in STD_LOGIC;
              DO: out STD_LOGIC_VECTOR (3 downto 0));
    end component;

    begin

    UO:userff port map (D=>D, CE=>CE, CLK=>CLK, Q=>Q);

    U1:memory port map(A=>Atop,DI=>DItop,WR_EN=>WR_ENtop,
                   WR_CLK=>WR_CLKtop, DO=>DOtop);
    end inside;


  8. Check the syntax of the VHDL design code by selecting Synthesis Check Syntax in the HDL Editor. Correct any errors. Then save the design and close the HDL Editor.

  9. The design with the instantiated LogiBLOX module can then be synthesized (click the Synthesis button on the Flow tab).

    Note: When the design is synthesized, a warning is generated that the LogiBLOX module is unlinked. Modules instantiated as black boxes are not elaborated and optimized. The warning message is just reflecting the black box instantiation.

  10. To complete the design, refer to the “Synthesizing the Design”through the “Programming the Device” sections under the “All-HDL Designs” section.

Verilog Instantiation

This section explains how to instantiate a LogiBLOX module into a Verilog design using Foundation. The example described below creates a RAM48X4S using LogiBLOX.

  1. Access the LogiBLOX Module Selector window using one of the following methods. Its operation is the same regardless of where it is invoked.

  2. Click Setup on the LogiBLOX Module Selector screen. (The first time LogiBLOX is invoked, the Setup screen appears automatically.)

  3. In the Setup window, enter the following items.

  4. In the LogiBLOX Module Selector window, define the type of LogiBLOX module and its attributes. The Module Name specified here is used as the name of the instantiation in the Verilog code.



  5. When you click OK, the LogiBLOX module is created automatically and added to the project library.

    The LogiBLOX module is a collection of several files including those listed below. The files are located in your Xilinx project directory for the current project.


    component_name.ngc
    Netlist used during the Translate phase of Implementation

    component_name.vei
    Instantiation template used to add LogiBLOX module into your Verilog source code

    component_name.v
    Verilog file used for functional simulation

    component_name.mod
    Configuration information for the module

    logiblox.ini
    LogiBLOX configuration for the project



    The component name is the name given to the LogiBLOX module in the GUI. The port names are the names provided in the .vei file.

  6. In the HDL Editor, open the LogiBLOX- created .vei file (memory.vei) located under the current project. The .vei file for the memory component created in the previous steps is shown below.

    //---------------------------------------------------
    // LogiBLOX SYNC_RAM Module "memory"
    // Created by LogiBLOX version C.16
    // on Wed Jun 01 10:40:25 1999
    // Attributes
    // MODTYPE = SYNC_RAM
    // BUS_WIDTH = 4
    // DEPTH = 48
    // STYLE = MAX_SPEED
    // USE_RPM = FALSE
    //---------------------------------------------------
    memory instance_name
    ( .A(),
    .DO(),
    .DI(),
    .WR_EN(),
    .WR_CLK());

    module memory(A, DO, DI, WR_EN, WR_CLK);
    input [5:0] A;
    output [3:0] DO;
    input [3:0] DI;
    input WR_EN;
    input WR_CLK;
    endmodule


  7. Open a second session of the HDL Editor. In the second HDL Editor window, open the Verilog design file in which the LogiBLOX component is to be instantiated.

    Note: Instead of opening a second sesssion, you could use Edit Insert File from the HDL Editor tool bar to insert the file into the current HDL Editor session.

    Cut and paste the module declaration from the LogiBLOX component's .vei file into the Verilog design code, placing it after the “endmodule” line within the architecture section or the Verilog design code.

    Cut and paste the component instantiation from the .vei file into the design code. Give the added code an instance name and edit it to connect the ports to the signals.

    The Verilog design code with the LogiBLOX instantiation for the component named memory is shown below. For each .ngc file from LogiBLOX, you may have one or more VHDL files with the .ngc file instantiated. In this example, there is only one black box instantiation of memory, but multiple calls to the same module may be done.

    module top (D,CE,CLK,Q,
                Atop, DOtop, DItop, WR_ENtop, WR_CLKtop);

    input D;
    input CE;
    input CLK;
    output Q;

    input [5:0] Atop;
    output [3:0] DOtop;
    input [3:0] DItop;
    input WR_ENtop;
    input WR_CLKtop;

    userff U0 (.D(D),.CE(CE),.CLK(CLK),.Q(Q));

    memory U1 (  .A(Atop),
                  .DO (DOtop),
    .DI (DItop),
                  .WR_EN (WR_ENtop),
                  .WR_CLK (WR_CLKtop));
    endmodule


    Note: An alternate method is to place the module declaration from the .vei file into a new, empty Verilog file (MEMORY.V) and add the new file (shown below) to the project.

    //---------------------------------------------------
    // LogiBLOX SYNC_RAM Module "memory"
    // Created by LogiBLOX version C.16
    // on Wed Jun 01 10:40:25 1999
    // Attributes
    // MODTYPE = SYNC_RAM
    // BUS_WIDTH = 4
    // DEPTH = 48
    // STYLE = MAX_SPEED
    // USE_RPM = FALSE
    //---------------------------------------------------
    module MEMORY (A, DO, DI, WR_EN, WR_CLK);
    input [5:0] A;
    output [3:0] DO;
    input [3:0] DI;
    input WR_EN;
    input WR_CLK;
    endmodule


  8. Check the syntax of the Verilog design code by selecting Synthesis Check Syntax in the HDL Editor. Correct any errors and then save the design and close the HDL Editor.

  9. The design with the instantiated LogiBLOX module can then be synthesized (click the Synthesis button on the Flow tab).

    Note: When the design is synthesized, a warning is generated that the LogiBLOX module is unlinked. Modules instantiated as black boxes are not elaborated and optimized. The warning message is just reflecting the black box instantiation.

  10. To complete the design, refer to the “Synthesizing the Design” section through the “Programming the Device” section under the “All-HDL Designs” section in this chapter.

CORE Generator COREs in a VHDL or Verilog Design

CORE Generator COREs may be generated in Foundation and then instantiated in VHDL or Verilog code. COREs can be generated for valid Foundation projects only.

This flow may be used for any CORE Generator CORE. The CORE being instantiated must be located in the HDL project directory (that is, the directory where the top-level HDL file resides). Running LogiBLOX from the Foundation project ensures this condition is met.

VHDL Instantiation

This section explains how to instantiate a CORE component into a VHDL design using Foundation.

  1. With a valid Foundation project open, access the CORE Generator window using one of the following methods. Its operation is the same regardless of where it is invoked.

  2. Select Project Project Options. In the Project Options dialog box, ensure that Design Entry is VHDL, that Behavioral Simulation is VHDL, and that the Vendor is Foundation. The Family entry should reflect the project's target device. Click OK to exit the Project Options dialog box.

  3. To aid selection, the available COREs are categorized in folders on the View Mode section of the main CORE Generator window. Double click a folder to see its sub-categories. When you double click a sub-category folder, the available COREs are listed in the “Contents of” section of the main CORE Generator window.



  4. To select a CORE, double click on the CORE's name in the “Contents of” window. A new window opens to allow you to view a description of the CORE or its data sheet, to customize the CORE for your application, and to generate the customized CORE. (Acrobat Reader is required to view the data sheet.)



  5. When the CORE's window appears, enter a name for the component in the Component Name field.

    The name must begin with an alpha character. No extensions or uppercase letters are allowed. After the first character, the name may include numbers and/or the underscore character.

  6. Other available customization options are unique for each CORE. Customize the CORE as necessary.

  7. Select Generate to create the customized CORE and add its files to the project directory.

    The customized CORE component is a collection of several files including those listed below. The files are located in your Xilinx project directory for the current project.


    component_name.coe
    ASCII data file defining the coefficient values for FIR filters and initialization values for memory modules

    component_name.xco
    CORE Generator file containing the parameters used to generate the customized CORE

    component_name.edn
    EDIF implementation netlist for the CORE

    component_name.vho
    VHDL template file

    component_name.mif
    Memory Initialization Module for Virtex Block RAM modules



    The component name is the name given to the CORE in the customization window. The port names are the names provided in the .vho file.

    An example .vho file is shown below.

    ----------------------------------------------------------------------
    -- This file was created by the Xilinx CORE Generator tool, and --
    -- is (c) Xilinx, Inc. 1998, 1999. No part of this file may be --
    -- transmitted to any third party (other than intended by Xilinx) --
    -- or used without a Xilinx programmable or hardwire device without --
    -- Xilinx's prior written permission. --
    ----------------------------------------------------------------------

    -- The following code must appear in the VHDL architecture header:

    ------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
    component sram
    port (
    addr: IN std_logic_VECTOR(3 downto 0);
    clk: IN std_logic;
    di: IN std_logic_VECTOR(3 downto 0);
    we: IN std_logic;
    en: IN std_logic;
    rst: IN std_logic;
    do: OUT std_logic_VECTOR(3 downto 0));
    end component;
    -- COMP_TAG_END ------ End COMPONENT Declaration ------------

    -- The following code must appear in the VHDL architecture
    -- body. Substitute your own instance name and net names.

    ------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
    your_instance_name : sram
    port map (
    addr => addr,
    clk => clk,
    di => di,
    we => we,
    en => en,
    rst => rst,
    do => do);
    -- INST_TAG_END ------ End INSTANTIATION Template ------------

    -- The following code must appear above the VHDL configuration
    -- declaration. An example is given at the end of this file.

    ------------- Begin Cut here for LIBRARY Declaration -------- LIB_TAG

    -- synopsys translate_off

    Library XilinxCoreLib;

    -- synopsys translate_on

    -- LIB_TAG_END ------- End LIBRARY Declaration ------------

    -- The following code must appear within the VHDL top-level
    -- configuration declaration. Ensure that the translate_off/on
    -- compiler directives are correct for your synthesis tool(s).

    ------------- Begin Cut here for CONFIGURATION snippet ------ CONF_TAG

    -- synopsys translate_off

    for all : sram use entity XilinxCoreLib.C_MEM_SP_BLOCK_V1_0(behavioral)
    generic map(
    c_has_en => 1,
    c_rst_polarity => 1,
    c_clk_polarity => 1,
    c_width => 4,
    c_has_do => 1,
    c_has_di => 1,
    c_en_polarity => 1,
    c_has_we => 1,
    c_has_rst => 1,
    c_address_width => 4,
    c_read_mif => 0,
    c_depth => 16,
    c_pipe_stages => 0,
    c_mem_init_radix => 16,
    c_default_data => "0",
    c_mem_init_file => "sram.mif",
    c_we_polarity => 1,
    c_generate_mif => 0);
    end for;

    -- synopsys translate_on

    -- CONF_TAG_END ------ End CONFIGURATION snippet ------------

    -------------------------------------------------------------
    -- Example of configuration declaration...
    -------------------------------------------------------------
    --
    -- <Insert LIBRARY Declaration here>
    --
    -- configuration <cfg_my_design> of <my_design> is
    -- for <my_arch_name>
    -- <Insert CONFIGURATION Declaration here>
    -- end for;
    -- end <cfg_my_design>;
    --
    -- If this is not the top-level design then in the next level up, the following text
    -- should appear at the end of that file:
    --
    -- configuration <cfg> of <next_level> is
    -- for <arch_name>
    -- for all : <my_design> use configuration <cfg_my_design>;
    -- end for;
    -- end for;
    -- end <cfg>;
    --


  8. Select File Exit to close the CORE Generator.

  9. In the HDL Editor, open the CORE's .vho file (component_name.vho) located under the current project.

  10. Open a second session of the HDL Editor. In the second HDL Editor window, open the VHDL file in which the CORE component is to be instantiated.

    Note: Instead of opening a second sesssion, you could use Edit Insert File from the HDL Editor tool bar to insert the file into the current HDL Editor session.

  11. Cut and paste the Component Declaration from the CORE component's .vho file to your project's VHDL code, placing it after the architecture statement in the VHDL code.

    Cut and past the Component Instantiation from the CORE component's .vho file to your VHDL design code after the “begin” line. Give the inserted code an instance name. Edit the code to connect the signals in the design to the ports of the CORE component.

  12. Check the syntax of the VHDL design code by selecting Synthesis Check Syntax in the HDL Editor. Correct any errors. Then save the design and close the HDL Editor.

  13. The design with the instantiated CORE module can then be synthesized (click the Synthesis button on the Flow tab).

    Note: When the design is synthesized, a warning is generated that the CORE module is unexpanded. Modules instantiated as black boxes are not elaborated and optimized. The warning message is just reflecting the black box instantiation.

  14. To complete the design, refer to the “Synthesizing the Design”through the “Programming the Device” sections under the “All-HDL Designs” section.

Note: The instantiated module must be in the same directory as the HDL code in which it is instantiated.

Verilog Instantiation

This section explains how to instantiate a CORE component into a Verilog design using Foundation.

  1. With a valid Foundation project open, access the CORE Generator window using one of the following methods. Its operation is the same regardless of where it is invoked.

  2. Select Project Project Options. In the Project Options dialog box, ensure that Design Entry is Verilog, that Behavioral Simulation is Verilog, and that the Vendor is Foundation. The Family entry should reflect the project's target device. Click OK to exit the Project Options dialog box.

  3. To aid selection, the available COREs are categorized in folders on the View Mode section of the main CORE Generator window. Double click a folder to see its sub-categories. When you double click a sub-category folder, the available COREs are listed in the “Contents of” section of the main CORE Generator window.



  4. To select a CORE, double click on the CORE's name in the “Contents of” window. A new window opens to allow you to view a description of the CORE or its data sheet, to customize the CORE for your application, and to generate the customized CORE. (Acrobat Reader is required to view the data sheet.)



  5. When the CORE's window appears, enter a name for the component in the Component Name field.

    The name must begin with an alpha character. No extensions or uppercase letters are allowed. After the first character, the name may include numbers and/or the underscore character.

  6. Other available customization options are unique for each CORE. Customize the CORE as necessary.

  7. Select Generate to create the customized CORE and add its files to the project directory.

    The customized CORE component is a collection of several files including those listed below. The files are located in your Xilinx project directory for the current project.




    component_name.coe
    ASCII data file defining the coefficient values for FIR filters and initialization values for memory modules

    component_name.xco
    CORE Generator file containing the parameters used to generate the customized CORE

    component_name.edn
    EDIF implementation netlist for the CORE

    component_name.veo
    Verilog template file

    component_name.mif
    Memory Initialization Module for Virtex Block RAM modules



    The component name is the name given to the CORE in the customization window. The port names are the names provided in the .veo file.

    An example .veo file produced by the CORE Generator system follows.

    /*******************************************************************
    * This file was created by the Xilinx CORE Generator tool, and *
    * is (c) Xilinx, Inc. 1998, 1999. No part of this file may be *
    * transmitted to any third party (other than intended by Xilinx) *
    * or used without a Xilinx programmable or hardwire device without *
    * Xilinx's prior written permission. *
    *******************************************************************/

    // The following line must appear at the top of the file in which
    // the core instantiation will be made. Ensure that the translate_off/_on
    // compiler directives are correct for your synthesis tool(s)

    //----------- Begin Cut here for LIBRARY inclusion --------// LIB_TAG

    // synopsys translate_off

    `include "XilinxCoreLib/C_MEM_SP_BLOCK_V1_0.v"

    // synopsys translate_on

    // LIB_TAG_END ------- End LIBRARY inclusion --------------

    // The following code must appear after the module in which it
    // is to be instantiated. Ensure that the translate_off/_on compiler
    // directives are correct for your synthesis tool(s).

    //----------- Begin Cut here for MODULE Declaration -------// MOD_TAG
    module mux4 (
    ADDR,
    CLK,
    DI,
    WE,
    EN,
    RST,
    DO);

    input [3 : 0] ADDR;
    input CLK;
    input [3 : 0] DI;
    input WE;
    input EN;
    input RST;
    output [3 : 0] DO;

    // synopsys translate_off

    C_MEM_SP_BLOCK_V1_0 #(
    4,
    1,
    "0",
    16,
    1,
    0,
    1,
    1,
    1,
    1,
    1,
    "mux4.mif",
    16,
    0,
    0,
    1,
    1,
    4)
    inst (
    .ADDR(ADDR),
    .CLK(CLK),
    .DI(DI),
    .WE(WE),
    .EN(EN),
    .RST(RST),
    .DO(DO));

    // synopsys translate_on

    endmodule
    // MOD_TAG_END ------- End MODULE Declaration -------------

    // The following must be inserted into your Verilog file for this
    // core to be instantiated. Change the instance name and port connections
    // (in parentheses) to your own signal names.

    //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
    mux4 YourInstanceName (
    .ADDR(ADDR),
    .CLK(CLK),
    .DI(DI),
    .WE(WE),
    .EN(EN),
    .RST(RST),
    .DO(DO));
    // INST_TAG_END ------ End INSTANTIATION Template ---------


  8. Select File Exit to close the CORE Generator.

  9. In the HDL Editor, open the CORE's .veo file (component_name.veo) located under the current project.

  10. Open a second session of the HDL Editor. In the second HDL Editor window, open the Verilog file in which the CORE component is to be instantiated.

    Note: Instead of opening a second sesssion, you could use Edit Insert File from the HDL Editor tool bar to insert the file into the current HDL Editor session.

  11. Cut and paste the Component Declaration from the CORE component's .veo file to your project's Verilog code, placing it after the architecture statement in the Verilog code.

    Cut and past the Component Instantiation from the CORE component's .veo file to your Verilog design code after the “begin” line. Give the inserted code an instance name. Edit the code to connect the signals in the design to the ports of the LogiBLOX module.

  12. Check the syntax of the VHDL design code by selecting Synthesis Check Syntax in the HDL Editor. Correct any errors. Then save the design and close the HDL Editor.

  13. The design with the instantiated CORE module can then be synthesized (click the Synthesis button on the Flow tab).

    Note: When the design is synthesized, a warning is generated that the CORE module is unexpanded. Modules instantiated as black boxes are not elaborated and optimized. The warning message is just reflecting the black box instantiation.

  14. To complete the design, refer to the “Synthesizing the Design”through the “Programming the Device” sections under the “All-HDL Designs” section.

Note: The instantiated module must be in the same directory as the HDL code in which it is instantiated.

XNF file in a VHDL or Verilog Design

This section explains how to instantiate an XNF file as a black box in a VHDL or Verilog design.

  1. To attach an XNF module in the VHDL or Verilog code, use the nets named in the PIN records and/or SIG records in the XNF file as the port names of the component instantiation. The following is an example XNF file with PIN and SIG records.

    SYM, current_state_reg<4>, DFF, LIBVER=2.0.0
    PIN, D, I, next_state<4>, ,
    PIN, C, I, N10, ,
    PIN, Q, O, current_state<4>, ,
    END
    SIG, current_state<4>
    SIG, CLK, I, ,
    SIG, DATA, I, ,
    SIG, SYNCFLG, O, ,


    To reference buses in the instantiation of XNF modules, the nets named in PIN records and/or SIG records must be of the form.

    netname<number>

    This designation allows the bus to be referenced in the VHDL component as a vector data type.

  2. Using the filename of the XNF file as the name of the component and the name of nets in the XNF file as port names, instantiate the XNF file in the VHDL or Verilog code.

  3. The design with the instantiated XNF black box can then be synthesized (click the Synthesis button on the Flow tab).

    Note: When the design is synthesized, a warning is generated that the XNF module is unexpanded. Modules instantiated as black boxes are not elaborated and optimized. The warning message is just reflecting the black box instantiation. Expansion of the XNF module takes place during the Translation stage of the Implementation phase.

  4. To complete the design, refer to the “Synthesizing the Design”through the “Programming the Device” sections under the “All-HDL Designs” section.

The instantiated module must be in the same directory as the HDL code in which it is instantiated.