Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: add placing option section

...

All NanoXplore primitives are listed in nxLibrary-<variant_name>.vhdp available in the release archive. A documentation is also available in order to get information about all generics and io in Impulse NxDesignSuite 23.3 5 Library Guide .

It is recommended to only add the nxpackage in the work library and not component declarations as they are already declared in the package.

...

  1. Use a pad directly connected to the closest CKG (these pads are suffixed by _CLK). Either the user instantiates a PLL or a WFG in the design or the tool instantiates automatically a WFG in bypass mode.

    1. MEDIUM/LARGE: Use a common pad or internal logic and use a buffer NX_BD in global_lowskew mode.

    2. ULTRA: Use a common pad or internal logic and use a NX_GCK_U in Common to System Converter CSC mode.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note Design/LowskewManagement project.

...

  • Clock Gating:

    • MEDIUM/LARGE: Use a NX_CKS to gate a clock system signals with a command common signal.

    • ULTRA: Use a NX_GCK_U in Clock Switch CKS mode to gate a clock system signals with a command common signal.

  • Clock MUX:

    • ULTRA: Use a NX_GCK_U in Clock MUX MUX mode to switch between 2 clock system signals with a command common signal.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note Component/ClockSwitch project.

...

It is recommended to rather use python method addMemoryInitialization described in Impulse NxDesignSuite 23.3 5 NxPython Specification as it is compliant with inferred and instantiated memories.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note Init/Ram project.

...

In order to infer a memory instead of instantiating a NanoXplore primitive (advantage is the user can choose with the same RTL code to map this memory in RF, RAM, RAM_ECC, … thanks to NXpython constraints), it is recommended to follow TrainingPackage Design/MemInfer examples providing inference for ROM, SRAM, DPRAM with and without ECC.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note Design/MemInfer project.

...

In order to get complexity module by module without confining it in a region, it is possible to use addModule method described in Impulse NxDesignSuite 23.3 5 NxPython Specification.

Refer to #Floor_planning_Complexity for more details.

...

Please refer to createClock and createGeneratedClock described in Impulse NxDesignSuite 23.3 5 NxPython Specification .

If a PLL is used, PLL output clock frequencies are automatically computed by the software.

...

Please refer to addFalsePath and addMultiCyclePath in Impulse NxDesignSuite 23.3 5 NxPython Specification .

Clock groups can be created if clock domains are completely unrelated.

...

It is possible to map this operators in LUT, Carry or DSP using addMappingDirective method described in Impulse NxDesignSuite 23.3 5 NxPython Specification .

By default, adders are mapped into Carry and Multipliers in DSP. But it can sometimes be interesting to modify default mapping directives.

...

Memories can be mapped into logic elements (LUT/DFF), register files (RF), Memory Blocks (RAM) or Memory Blocks protected by EDAC correction using addMappingDirective method described in Impulse NxDesignSuite 23.3 5 NxPython Specification .

By default, small memories (equal or less than 64x16) will be mapped into RF and bigger ones mapped into RAM. But it can sometimes be interesting to modify default mapping directives.

...

Check #Mapping_Directive_Memory for information about constraint setting.

Placing

Placing Constraint

In order to improve the maximum clock frequency for each clock domain, it is advised to follow the following steps:

It can also have a very positive impact to create unitary projects and reuse the routed projects as a blackbox in your final top project using addBlackBox described in Impulse NxDesignSuite 23.3 5 NxPython Specification .

It is also possible to place manually instances in a specified using the following NXpython methods all described in Impulse NxDesignSuite 23.3 5 NxPython Specification :

Placing Option

Some options impact the placing and consequently the routing. In the end, STA performances are directly affected. The following options are concerned:

  • DensityEffort

  • CongestionEffort

  • PolishingEffort

Increasing efforts may optimize placing for STA.

Check NxDesignSuite 23.5 NxPython Specification for more details about these options.

Note

Optimizing placing options for STA can lead to congestion errors. It is usually a trade-off to balance these options.

Anchor
Design_complexity
Design_complexity
Design Complexity

The logic depth of a design must be controlled. the method reportDesignComplexity and reportHierarchyComplexity are very helpful to have an overview.

Please have a look at Impulse NxDesignSuite 23.3 5 NxPython Specification reportDesignComplexity and reportHierarchyComplexity methods.

...

  • Launch your design for the first time without constraint.

  • Grab the operator model or instance in operators.rpt report. For instance, “ | Operator 'add_3u_3u' | : add_L25 (line 25 in …, model name is “add_3u_3u” and instance name is “add_L25”.

  • Add the constraint specifying instance to map the operator, for instance p.addMappingDirective('getModels(add_3u_3u)','ADD','DSP')” or p.addMappingDirective('getInstances(add_L25)','ADD','DSP'), and relaunch the project.

  • Check in operators.rpt report the constraint matched with the desired instance.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note MappingDirective/Operator project.

...

  • Launch your design for the first time without constraint.

  • Grab the memory model in memories.rpt report. For instance, “ | Ram 'RAM_s_mem' Analysis:, model name is “RAM_s_mem”.

  • Add the constraint specifying instance to map the operator, for instance p.addMappingDirective('getModels(RAM_s_mem)','RAM','RAM_ECC')”, and relaunch the project.

  • Check in memories.rpt report the constraint matched with the desired instance.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note MappingDirective/Memory project.

...

Info

In case of direct primitive instance of the DSP, DSP name is the path to the DSP. For instance, p.addDSPLocation('module0|submodule1|DSP_INST_0','CGB[28x4]:L').

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/DspLocation project.

...

Info

In case of direct primitive instance of the RAM, RAM name is the path to the RAM. For instance, p.addRAMLocation('module0|submodule1|ram','CGB[28x4]').

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/RamLocation project.

...

Note

In order to place manually a WFG, location must comply with WFG type that is to say Core WFG (WFG_Cx) or Ring WFG (WFG_Rx). Mix WFG (WFG_Mx) can be chosen for either a Core or a Ring signal.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/RingLocation project.

...

  • Launch your design for the first time without constraint.

  • Grab the register name in RegisterSummary.rpt report or in timing files. For instance, i_cpt_0|s_cpt_out_reg[5]”.

  • Add the constraint specifying TILE spot (TILE coordinates), for instance “p.setSite('i_cpt_0|s_cpt_out_reg[0]','TILE[2x2]'”, and relaunch the project.

  • Check in preplaced.rpt report the constraint matched with the desired instance.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/Site project.

...

  • Launch your design for the first time without constraint.

  • Grab the module name in hierarchy.rpt report. For instance, “| ~ |-> row_col_pipe(X212B9C19) [ GEN_HIER0 ]”, name is “|-> row_col_pipe(X212B9C19) [ GEN_HIER0 ]”.

  • Add the constraint specifying area coordinates, for instance “p.constrainModule('|-> row_col_pipe(X212B9C19) [ GEN_HIER0 ]','GEN_HIER0_ROW_M','Soft',9,6,2,3,'GEN_HIER0_ROW_R',False)”, and relaunch the project.

  • Check in hierarchy.rpt report the constraint matched with the desired instance.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/Region project.

...

  • Launch your design for the first time without constraint.

  • Grab the source and target register in DOMAIN_<clk1>_to_<clk2>_<progress_step>_<conditions>.timing. For instance, “module0|submodule0|pipe_reg[0].CK” and “module0|submodule0|pipe_reg[1].CK” , names are “module0|submodule0|pipe_reg[0]” and “module0|submodule0|pipe_reg[1]”.

  • Add the constraint specifying area coordinates, for instance “p.constrainPath('|-> row_col_pipe(X212B9C19) [ GEN_HIER0 ]','PIPE_REG_M','Soft',9,6,2,3,'PIPE_REG_R',False)”, and relaunch the project.

  • Check in hierarchy.rpt report the constraint matched with the desired instance.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/ConstrainPath project.

...

  • Define the macro IP as the top cell.

  • Define a minimum aperture and all needed constraints as it was a global project to reach specifications. Save the project file after routed steps.

  • Run the project until Placing 3/5 step and use saveIP method to save the preplaced IP.

  • Do not declare the macro IP entity file in the global project. Instead, add the macro IP as a blackbox, specifying coordinates of the top left corner of the macro IP aperture in the global project, for instance p.addBlackBox('switch_counter',IP','../switch_counter_preplaced.json','g_inst.i_switch_counter_0:1x8').

  • Check in log the constraint matched.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note PlacingConstraint/Preplace project.

...

developCKGs method is active by default, Impulse computes automatically PLL and WFG required frequencies if input clock is declared.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note StaConstraint/GeneratedClock project.

...

  • Grab the clock name getting the hierarchy path to the generated clock.

    • Add the constraint specifying clock parameters, for instance “p.createGeneratedClock(getClock('clk_main'),getRegisterClock('i_clock_0|counter_reg[0]'), 'clk_fabric',{'DivideBy': 2})”.

  • Check timing files are created for this new clock domain.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note StaConstraint/GeneratedClock project.

...

  • Launch your design for the first time without constraint.

  • Grab the source and target register in DOMAIN_<clk1>_to_<clk2>_<progress_step>_<conditions>.timing. For instance, “module0|submodule0|pipe_reg[0].CK” and “module0|submodule0|pipe_reg[1].CK” , names are “module0|submodule0|pipe_reg[0]” and “module0|submodule0|pipe_reg[1]”.

  • Add the constraint specifying area coordinates, for instance “p.addFalsePath('getRegisters(module0|submodule0|pipe_reg[0])','getRegisters(module0|submodule0|pipe_reg[0])')”, and relaunch the project.

  • Check in DOMAIN_<clk1>_to_<clk2>_<progress_step>_<conditions>.timingt report the path no longer appears.

Please have a look at Impulse NxDesignSuite 23.3 5 Training Package : Application Note StaConstraint/FalsePath project.

...