Main Content

HDL Block Properties: General

Overview

Block implementation parameters enable you to control details of the code generated for specific block implementations. SeeSet and View HDL Model and Block Parametersto learn how to select block implementations and parameters in the GUI or the command line.

Property names are specified as character vectors. The data type of a property value is specific to the property. This section describes the syntax of each block implementation parameter and how the parameter affects generated code.

HDL Block Properties of Library Blocks

HDL block properties of library blocks are treated similar to mask parameters. When you instantiate library blocks in your model, the current HDL block properties of that library block are copied to instances of that block in your model. The HDL block properties of these instances are not synchronized with the HDL block properties of the library block. That is, if you change the HDL block property of the library block, the change does not get propagated to instances of the library block that you already added to your Simulink®model. If you want the HDL block properties of a library block to be synchronized with its instances in the model, create aSubsystemand then place this block inside thatSubsystem. The HDL block properties of blocks that reside inside the library block are synchronized with the corresponding instances in your model.

Suppose a library contains aSubsystemblock with HDL architecture set toModule. When you instantiate this block in your model, the block instance usesModuleas the HDL architecture. If you change the HDL architecture of theSubsystemblock in the library toBlackBox, existing instances of thatSubsystemblock in your model still useModuleas the HDL architecture. If you now add instances of theSubsystemblock from the library in your model, the new block instances get a copy of the current HDL block properties, and therefore useBlackBoxas the HDL architecture. If you want the HDL architecture of theSubsystemblock in the library to be synchronized with its instances in the model, create a wrapper subsystem with the HDL architecture that you want inside thisSubsystem.

AdaptivePipelining

TheAdaptivePipeliningsubsystem parameter enables you to set adaptive pipelining on a subsystem within a model.

Adaptive Pipelining Setting Description
'inherit'(default)

用the adaptive pipelining setting of the parent subsystem. If this subsystem is the highest-level subsystem, use the adaptive pipelining setting for the model.

'on'

Insert adaptive pipelines for this subsystem.

'off'

Do not insert adaptive pipelines for this subsystem, even if the parent subsystem has adaptive pipelining enabled.

To disable adaptive pipelining for a subsystem within a model, set the adaptive pipelining parameter,AdaptivePipelining, to'off'for that subsystem.

To learn how to set model-level adaptive pipelining, seeAdaptive pipelining.

Set Adaptive Pipelining For a Subsystem

To set adaptive pipelining for a subsystem from the HDL Block Properties dialog box:

  1. Right-click the subsystem and selectHDL Code>HDL Block Properties.

  2. ForAdaptivePipelining, selectinherit,on, oroff.

To set adaptive pipelining for a subsystem from the command line, usehdlset_param. For example, to turn off adaptive pipelining for a subsystem,my_dut:

hdlset_param('my_dut','AdaptivePipelining','off')
See alsohdlset_param.

BalanceDelays

TheBalanceDelayssubsystem parameter enables you to set delay balancing on a subsystem within a model.

BalanceDelays Setting Description
'inherit'(default)

用the delay balancing setting of the parent subsystem. If this subsystem is the highest-level subsystem, use the delay balancing setting for the model.

'on' Balance delays for this subsystem.
'off' Do not balance delays for this subsystem, even if the parent subsystem has delay balancing enabled.

To learn more about delay balancing, seeDelay Balancing.

Set Delay Balancing For a Subsystem

To set delay balancing for a subsystem using the HDL Block Properties dialog box:

  1. Right-click the subsystem.

  2. SelectHDL Code>HDL Block Properties.

  3. ForBalanceDelays, selectinherit,on, oroff.

To set delay balancing for a subsystem from the command line, usehdlset_param. For example, to turn off delay balancing for a subsystem,my_dut:

hdlset_param('my_dut','BalanceDelays','off')
See alsohdlset_param.

ClockRatePipelining

TheClockRatePipeliningsubsystem parameter enables you to set clock-rate pipelining on a subsystem within a model.

Clock-Rate Pipelining Setting Description
'inherit'(default)

用the clock-rate pipelining setting of the parent subsystem. If this subsystem is the highest-level subsystem, use the clock-rate pipelining setting for the model.

'on'

Insert clock-rate pipelines for this subsystem.

'off'

Do not insert clock-rate pipelines for this subsystem, even if the parent subsystem has clock-rate pipelining enabled.

To disable clock-rate pipelining for a subsystem within a model, setClockRatePipeliningtoofffor that subsystem.

To learn how to set model-level clock-rate pipelining, seeClock-rate pipelining.

Set Clock-Rate Pipelining For a Subsystem

To set clock-rate pipelining for a subsystem using the HDL Block Properties dialog box:

  1. Right-click the subsystem.

  2. SelectHDL Code>HDL Block Properties.

  3. SetClockRatePipeliningtoinherit,on, oroff.

To set clock-rate pipelining for a subsystem from the command line, usehdlset_param. For example, to turn off clock-rate pipelining for a subsystem,my_dut:

hdlset_param('my_dut','ClockRatePipelining','off')

See Also

CodingStyle

When you useMultiport Switchblocks, use theCodingStyleparameter to specify whether you want to generate HDL code with if-else or case statements. By default, HDL Coder™ generates if-else statements. If you have severalMultiport Switchblocks in your model, you can choose to specify a differentCodingStylefor each block.

CodingStyle设置 Description
'ifelse_stmt'(Default) Generate if-else statements in the Verilog code or when-else statements in the VHDL code for aMultiport Switchblock.
'case_stmt' Generate case statements in the Verilog code or case-when statements in the VHDL code for aMultiport Switchblock.

Set CodingStyle ForMultiport SwitchBlock

To set CodingStyle for aMultiport Switchusing the HDL Block Properties dialog box:

  1. Right-click theMultiport Switchblock.

  2. SelectHDL Code>HDL Block Properties.

  3. ForCodingStyle, selectifelse_stmtorcase_stmt.

To see theCodingStylespecified for a subsystem from the command line, usehdlget_param. For example, to see the settings specified for aMultiport Switchblock inside a subsystem,my_dut:

hdlget_param('my_dut/Multiport Switch','CodingStyle')
ans = 'case_stmt'
See alsohdlset_param.

ConstMultiplierOptimization

TheConstMultiplierOptimizationimplementation parameter lets you specify use of canonical signed digit (CSD) or factored CSD optimizations for processing coefficient multiplier operations in the generated code.

The following table shows theConstMultiplierOptimizationparameter values.

ConstMultiplierOptimization Setting Description
'none'
(Default)
By default, HDL Coder does not perform CSD or FCSD optimizations. Code generated for the Gain block retains multiplier operations.
'CSD' When you specify this option, the generated code decreases the area used by the model while maintaining or increasing clock speed, using canonical signed digit (CSD) techniques. CSD replaces multiplier operations with add and subtract operations. CSD minimizes the number of addition operations required for constant multiplication by representing binary numbers with a minimum count of nonzero digits.
'FCSD' 这个选项使用分解CSD (FCSD)技术,which replace multiplier operations with shift and add/subtract operations on certain factors of the operands. These factors are generally prime but can also be a number close to a power of 2, which favors area reduction. This option lets you achieve a greater area reduction than CSD, at the cost of decreasing clock speed.
'auto'

When you specify this option, HDL Coder chooses between the CSD or FCSD optimizations. The coder chooses the optimization that yields the most area-efficient implementation, based on the number of adders required. When you specify'auto', the coder does not use multipliers, unless conditions are such that CSD or FCSD optimizations are not possible (for example, if the design uses floating-point arithmetic).

TheConstMultiplierOptimizationparameter is available for the following blocks:

  • Gain

  • Stateflow®chart

  • Truth Table

  • MATLAB Function

  • MATLAB System

ConstrainedOutputPipeline

用theConstrainedOutputPipelineparameter to specify a nonnegative number of registers to place at the block outputs.

HDL Coder moves existing delays within your design to try to meet your constraint. New registers are not added. If there are fewer registers than the coder needs to satisfy your constraint, the coder reports the difference between the number of desired and actual output registers. You can add delays to your design using input or output pipelining.

Distributed pipelining does not redistribute registers you specify with constrained output pipelining.

How to Specify Constrained Output Pipelining

To specify constrained output pipelining for a block using the GUI:

  1. Right-click the block and selectHDL Code>HDL Block Properties.

  2. ForConstrainedOutputPipeline, enter the number of registers you want at the output ports.

To specify constrained output pipelining, at the command line, enter:

hdlset_param(path_to_block,'ConstrainedOutputPipeline', number_of_output_registers)
For example, to constrain 6 registers at the output ports of a subsystem,subsys, in your model,mymodel, enter:
hdlset_param('mymodel/subsys','ConstrainedOutputPipeline', 6)

See Also

DistributedPipelining

TheDistributedPipeliningsubsystem parameter enables pipeline register distribution, which is a speed optimization that increases your clock speed by reducing your critical path on a subsystem. This optimization moves the delays within a subsystem while preserving the hierarchy.

DistributedPipelining Setting Description
'inherit'(default)

用the distributed pipelining setting of the parent subsystem. If this subsystem is the highest-level subsystem, use the distributed pipelining setting for the model.

'off' HDL Coder does not distribute the pipeline registers placed manually or by using the HDL block propertiesInputPipelineorOutputPipeline.
'on' HDL Coder distributes registers inside the subsystem,MATLAB Functionblock, or Stateflow chart based on critical path analysis. This setting distributes the pipelines in the subsystem that are already placed manually or by using the HDL Block PropertiesInputPipelineorOutputPipeline.

Tip

Output data might be in an invalid state initially if you insert pipeline registers. To avoid test bench errors resulting from initial invalid samples, disable output checking for those samples. For more information, seeIgnore output data checking (number of samples).

To enable distributed pipelining for a subsystem within a model, setDistributedPipeliningtoonfor that subsystem.

To learn how to set model-level distributed pipelining, seeDistributed pipelining.

Set Distributed Pipelining For a Subsystem

To set distributed pipelining for a subsystem using the HDL Block Properties dialog box:

  1. Right-click the subsystem.

  2. SelectHDL Code>HDL Block Properties.

  3. SetDistributedPipeliningtoinherit,on, oroff.

To set distributed pipelining for a subsystem from the command line, use thehdlset_paramfunction. For example, enter:

hdlset_param('path/to/subsystem', 'DistributedPipelining', 'on')

See Also

DotProductStrategy

If you use theProductblock for matrix multiplication in your design, use theDotProductStrategyto specify how you want to implement the matrix multiplication.

TheDotProductStrategyoptions are listed in the following table.

DotProductStrategy Value Description
'Fully Parallel'(default)

Expands the matrix multiplication operation into multipliers and adders. For example, if you multiply two 2x2 matrices, the implementation uses four multipliers and two adders to compute the result.

To share the multipliers to optimize area, use the HDL block propertyStreamingFactor.

Note

TheDotProductStrategymust be set to'Fully Parallel'when you use theNative Floating Pointmode.

'Fully Parallel Scalarized'

Expands the matrix multiplication operation into multipliers and adders. For example, if you multiply two 2x2 matrices, the implementation uses eight multipliers and four adders to compute the result. Use this option for smaller sized matrices and when you want to enable sharing on both the multipliers and adders.

To share the multipliers to optimize area, use the HDL block propertySharingFactor.

'Serial Multiply-Accumulate'

Uses theSerialarchitecture of theMultiply-Accumulateblock to implement the matrix multiplication.

In this architecture, the clock rate must be faster than the clock rate that you specify withParallelarchitecture. You can see the clock rate in the Clock Summary information of the Code Generation report.

'Parallel Multiply-Accumulate'

Uses theParallelarchitecture of theMultiply-Accumulateblock to implement the matrix multiplication.

DSPStyle

DSPStyle允许您生成代码,包括辛迪思is attributes for multiplier mapping in your design. You can choose whether to map a particular block’s multipliers to DSPs or logic in hardware.

For Xilinx®targets, the generated code uses theuse_dspattribute. For Altera®targets, the generated code uses themultstyleattribute.

TheDSPStyleoptions are listed in the following table.

DSPStyle Value Description
'none'(default)

Do not insert a DSP mapping synthesis attribute.

'on'

Insert synthesis attribute that directs the synthesis tool to map to DSPs in hardware.

'off'

Insert synthesis attribute that directs the synthesis tool to map to logic in hardware.

TheDSPStyleparameter is available for the following blocks:

  • Gain

  • Product

  • Product of Elementswith Architecture set to Tree

  • Subsystem

  • Atomic Subsystem

  • Variant Subsystem

  • Enabled Subsystem

  • Triggered Subsystem

  • Modelwith Architecture set toModelReference

Hierarchy Flattening Behavior

If you specify hierarchy flattening for a subsystem that also has a nondefaultDSPStylesetting, HDL Coder propagates theDSPStylesetting to the parent subsystem.

If the flattened subsystem containsGain,Product, orProduct of Elementsblocks, the coder keeps their nondefaultDSPStylesettings, and replaces defaultDSPStylesettings with the flattened subsystemDSPStylesetting.

Synthesis Attributes in Generated Code

The generated code for synthesis attributes depends on:

  • Target language

  • DSPStylevalue

  • SynthesisToolvalue

The following table shows examples of synthesis attributes in generated code.

DSPStyle Value TargetLanguage Value SynthesisTool Value
'Altera Quartus II' 'Xilinx ISE'
'Xilinx Vivado'
'none' 'Verilog'

wire signed [32:0] m4_out1;

wire signed [32:0] m4_out1;

'VHDL'

m4_out1 : signal;

m4_out1 : signal;

'on' 'Verilog'

(* multstyle = "dsp" *) wire signed [32:0] m4_out1;

(* use_dsp = "yes" *) wire signed [32:0] m4_out1;

'VHDL'

attribute multstyle : string ;

attribute multstyle of m4_out1 : signal is "dsp" ;

attribute use_dsp : string ;

attribute use_dsp of m4_out1 : signal is "yes" ;

'off' 'Verilog'

(* multstyle = "logic" *) wire signed [32:0] m4_out1;

(* use_dsp = "no" *) wire signed [32:0] m4_out1;

'VHDL'

attribute multstyle : string ;

attribute multstyle of m4_out1 : signal is "logic" ;

attribute use_dsp : string ;

attribute use_dsp of m4_out1 : signal is "no" ;

Requirement For Synthesis Attribute Specification

You must specify a synthesis tool by using theSynthesisToolproperty.

How To Specify a Synthesis Attribute

To specify a synthesis attribute using the HDL Block Properties dialog box:

  1. Right-click the block.

  2. SelectHDL Code>HDL Block Properties.

  3. ForDSPStyle, selecton,off, ornone.

To specify a synthesis attribute from the command line, usehdlset_param. For example, suppose you have a model,my_modelDUT的子系统,my_dut, that contains a . Gain block,my_multiplier. To insert a synthesis attribute to mapmy_multiplierto a DSP, enter:

hdlset_param('my_model/my_dut/my_multiplier','DSPStyle','on')
See alsohdlset_param.

Limitations For Synthesis Attribute Specification

  • When you specify a nondefaultDSPStyleblock property, theConstMultiplierOptimizationproperty must be set to'none'.

  • Inputs to multiplier components cannot use thedoubledata type.

  • Gainconstant cannot be a power of 2.

FlattenHierarchy

FlattenHierarchyenables you to remove subsystem hierarchy from the HDL code generated from your design.

FlattenHierarchy Setting Description
'inherit'(default) 用the hierarchy flattening setting of the parent subsystem. If this subsystem is the highest-level subsystem, do not flatten.
'on' Flatten this subsystem.
'off' Do not flatten this subsystem, even if the parent subsystem is flattened.

To flatten hierarchy, you must also have theMaskParameterAsGenericglobal property set to'off'. For more information, seeGenerate Parameterized HDL Code from Masked Subsystem.

How To Flatten Hierarchy

To set hierarchy flattening using the HDL Block Properties dialog box:

  • In theAppstab, selectHDL Coder. TheHDL Codetab appears. Select theSubsystemand then clickHDL Block Properties. ForFlattenHierarchy, selecton,off, orinherit.

  • Right-click theSubsystemand selectHDL Code>HDL Block Properties. ForFlattenHierarchy, selecton,off, orinherit.

To set hierarchy flattening from the command line, usehdlset_param. For example, to turn on hierarchy flattening for a subsystem,my_dut:

hdlset_param('my_dut','FlattenHierarchy','on')
See alsohdlset_param.

Limitations For Hierarchy Flattening

A subsystem cannot be flattened if the subsystem is:

  • ASynchronous Subsystemor uses theState Controlblock inSynchronousmode.

  • A model reference implementation.

  • A Triggered Subsystem when用trigger signal as clockis enabled.

  • A masked subsystem that contains any of the following:

    • Bus.

    • Enumerated data type.

    • Lookup table blocks:1-D Lookup Table,2-D Lookup Table,Cosine HDL Optimized,Direct LookupTable (n-D),Prelookup,Sine HDL Optimized,n-D Lookup Table.

    • MATLAB Systemblock.

    • Stateflow blocks:Chart,State Transition Table,Sequence Viewer.

    • Blocks with a pass-through or no-op implementation. SeePass through, No HDL, and Cascade Implementations.

Note

This option removes subsystem boundaries before code generation. It does not necessarily generate HDL code with a completely flat hierarchy.

GuardIndexVariables

GuardIndexVariablesenables you to specify whether to hoist array indices out of conditional statements or not. When you enable certain optimizations such as RAM Mapping, loop streaming, sharing, and so on, expressions are moved out of the array indices. A temporary variable is created for the expression that might result in an index out-of- bounds error during simulation. When you enable this option the generated code might be inefficient for your target hardware.

GuardIndexVariables Setting Description
'off'(default) Move the expression for array indices out of the conditional statement and create a temporary variable for the expression.
'on' Do not move the expression for array indices out of the conditional statement and do not create a temporary variable for the expression.

This image shows the generated code with the option enabled and disabled. When theGuardIndexVariableoption isoff, the array index variableiis not decided by the conditional loop and might go out of bounds. When theGuardIndexVariableoption ison, the array index variableidxis decided by the conditional loop preventing an array index out of bounds error during simulation.

If you get an index access violation error during simulation, use this option.

InputPipeline

InputPipelinelets you specify a implementation with input pipelining for selected blocks. The parameter value specifies the number of input pipeline stages (pipeline depth) in the generated code. Distributed pipelining can move input pipelines to optimize your design. To prevent distributed pipelining from moving input pipelines from a specified point in your design, use theConstrainedOutputPipelineparameter.

The following code specifies an input pipeline depth of two stages for each Sum block in the model:

sblocks = find_system(gcb,'BlockType','Sum');forii=1:length(sblocks),hdlset_param(sblocks{ii},'InputPipeline', 2),end;

Note

TheInputPipelinesetting does not have any effect on blocks that do not have an input port.

When generating code for pipeline registers, HDL Coder appends a postfix string to names of input or output pipeline registers. The default postfix string is_pipe. To customize the postfix string, use thePipeline postfixoption in theGlobal Settings / Generalpane in theHDL Code Generationpane of the Configuration Parameters dialog box. Alternatively, you can pass the desired postfix as a character vector in themakehdlpropertyPipelinePostfix. For an example, seePipeline postfix.

InstantiateFunctions

For the MATLAB Function block, you can use theInstantiateFunctionsparameter to generate a VHDL®entityor Verilog®modulefor each function. HDL Coder generates code for eachentityormodulein a separate file.

TheInstantiateFunctionsoptions for theMATLAB Functionblock are listed in the following table.

InstantiateFunctions Setting Description
'off'(default)

Generate code for functions inline.

'on'

Generate a VHDLentityor Verilogmodulefor each function, and save eachmoduleorentityin a separate file.

How To Generate Instantiable Code for Functions

To set theInstantiateFunctionsparameter using the HDL Block Properties dialog box:

  1. Right-click theMATLAB Functionblock.

  2. SelectHDL Code>HDL Block Properties.

  3. ForInstantiateFunctions, selecton.

To set theInstantiateFunctionsparameter from the command line, usehdlset_param. For example, to generate instantiable code for functions in aMATLAB Functionblock,myMatlabFcn, in your DUT subsystem,myDUT, enter:

hdlset_param('my_DUT/my_MATLABFcnBlk', 'InstantiateFunctions', 'on')

Generate Code Inline for Specific Functions

If you want to generate instantiable code for some functions but not others, enable the option to generate instantiable code for functions, and usecoder.inline. Seecoder.inlinefor details.

Limitations for Instantiable Code Generation for Functions

The software generates code inline when:

  • Function calls are within conditional code orforloops.

  • Any function is called with a nonconstantstructinput.

  • The function has state, such as a persistent variable, and is called multiple times.

  • There is an enumeration anywhere in the design function.

InstantiateStages

For aCascadearchitecture, you can use theInstantiateStagesparameter to generate a VHDLentityor Verilogmodulefor each computation stage. HDL Coder generates code for eachentityormodulein a separate file.

InstantiateStages Setting Description
'off'(default)

Generate cascade stages in a single VHDLentityor Verilogmodule.

'on'

Generate a VHDLentityor Verilogmodulefor each cascade stage, and save eachmoduleorentityin a separate file.

LoopOptimization

LoopOptimizationenables you to stream or unroll loops in code generated from aMATLAB Functionblock. Loop streaming optimizes for area; loop unrolling optimizes for speed.

Note

If you specify theMATLAB Datapatharchitecture of theMATLAB Functionblock, you can only unroll loops. To stream loops, you can use the streaming optimization by specifying aStreamingFactor. See在MATLAB功能块Bou HDL的优化ndary Using MATLAB Datapath Architecture.

LoopOptimization Setting Description
'none'(default) Do not optimize loops.
'Unrolling' Unroll loops.
'Streaming' Stream loops.

How to OptimizeMATLAB FunctionBlock For Loops

To select a loop optimization using the HDL Block Properties dialog box:

  1. Right-click theMATLAB Functionblock.

  2. SelectHDL Code>HDL Block Properties.

  3. ForLoopOptimization, selectnone,Unrolling, orStreaming.

To select a loop optimization from the command line, usehdlset_param. For example, to turn on loop streaming for aMATLAB Functionblock,my_mlfn:

hdlset_param('my_mlfn','LoopOptimization','Streaming')
See alsohdlset_param.

Limitations forMATLAB FunctionBlock Loop Optimization

HDL Coder cannot stream a loop if:

  • The loop index counts down. The loop index must increase by 1 on each iteration.

  • There are 2 or more nested loops at the same level of hierarchy within another loop.

  • Any particular persistent variable is updated both inside and outside a loop.

HDL Coder can stream a loop when the persistent variable is:

  • Updated inside the loop and read outside the loop.

  • Read within the loop and updated outside the loop.

LUTRegisterResetType

用theLUTRegisterResetTypeblock parameter to control synthesis of a LUT into a ROM structure on an FPGA.

LUTRegisterResetType Value Description
default

LUT output register has default reset logic. When you generate HDL, the LUT will be synthesized as registers.

none

LUT output register has no reset logic. When you generate HDL, the LUT will be synthesized as a ROM.

You can specifyLUTRegisterResetTypefor the following blocks:

  • Gamma Correction

  • Lookup Table

MapPersistentVarsToRAM

With theMapPersistentVarsToRAMimplementation parameter, you can use RAM-based mapping for persistent arrays of aMATLAB Functionblock instead of mapping to registers.

MapPersistentVarsToRAM Setting Mapping Behavior

off

Persistent arrays map to registers in the generated HDL code.

on

Persistent array variables map to RAM. For restrictions, seeRAM Mapping Restrictions.

RAM Mapping Restrictions

When you enable RAM mapping, a persistent array or user-defined System object™ private property maps to a block RAM when all of these conditions are true:

  • Each read or write access is for a single element only. For example, submatrix access and array copies are not supported.

  • Address computation logic is not read-dependent. For example, computation of a read or write address using the data read from the array is not supported.

  • Persistent variables or user-defined System object private properties are initialized to 0 if they have a cyclic dependency. For example, if you have two persistent variables, A and B, you have a cyclic dependency if A depends on B, and B depends on A.

  • If an access is within a conditional statement, the conditional statement uses only simple logic expressions (&&,||,~) or relational operators. For example, in this code,r1does not map to RAM:

    if (mod(i,2) > 0) a = r1(u); else r1(i) = u; end

    You can rewrite complex conditions, such as conditions that call functions, by assigning them to temporary variables, and using the temporary variables in the conditional statement. For example, to mapr1to RAM, rewrite the previous code as:

    temp = mod(我,2);如果(临时> 0)= r1 (u);其他r1 (i) = u; end

  • The persistent array or user-defined System object private property value depends on external inputs.

    For example, in the following code,bigarraydoes not map to RAM because it does not depend onu:

    function z = foo(u) persistent cnt bigarray if isempty(cnt) cnt = fi(0,1,16,10,hdlfimath); bigarray = uint8(zeros(1024,1)); end z = u + cnt; idx = uint8(cnt); temp = bigarray(idx+1); cnt(:) = cnt + fi(1,1,16,0,hdlfimath) + temp; bigarray(idx+1) = idx;

  • The RAM size is greater than or equal to theRAMMappingThresholdvalue. The RAM size is the product of数组大小*字长*复杂性, where:

    • Array Sizeis the number of elements in the array.

    • Word Lengthis the number of bits that represent the data type of the array.

    • Complexityis 2 for a complex data type or 1 for a real datatype.

  • Access to the persistent variable that you are mapping to RAM is not in a loop, such as aforloop, unless the loop is unrolled. For more information, seecoder.unroll.

  • Access to the persistent variable that you are mapping to RAM is not in a nested conditional statement, such as a nestedifstatement or nestedswitchstatement.

If any of the above conditions is false, the persistent array or user-defined System object private property maps to a register in the HDL code.

RAMMappingThreshold

The default value ofRAMMappingThresholdis256. To change the threshold, usehdlset_param. For example, the following command changes the mapping threshold for thesfir_fixedmodel to 128 bits:

hdlset_param('sfir_fixed','RAMMappingThreshold', 128);

You can also change the RAM mapping threshold in the Configuration Parameters dialog box. For more information, seeRAM mapping threshold.

Example

For an example that shows how to map persistent array variables to RAM in aMATLAB Functionblock, seeRAM Mapping With the MATLAB Function Block.

MapToRAM

用theMapToRAMproperty to map lookup tables (LUT) to RAM.

WhenSimulate RAM Delayis enabled, theMapToRAMproperty is disabled for theSine HDL Optimized and Cosine HDL Optimizedblock.

MapToRAM Setting Mapping Behavior
inherit(default)

The model settingMap lookup tables to RAMbehavior is used.

off

The block lookup tables (LUTs) are mapped to logic slices on the FPGA.

on

The block lookup tables (LUTs) are mapped to RAM.

MapToRAM Considerations for Added Latency

When you enable either the block propertyMapToRAMor the global optionLUTMapToRAMand the synthesis tool for the model isXilinxorAltera, a unit delay without reset is added after theLookup Tableblock. Because of the added unit delay, additional latency is inserted and delay balanced in the generated HDL Code and generated model. To avoid extra latency, you can add aDelayblock with the HDL Block propertyResetType设置为noneafter theLookup Tableblock in the original model.

OutputPipeline

OutputPipelinelets you specify a implementation with output pipelining for selected blocks. The parameter value specifies the number of output pipeline stages (pipeline depth) in the generated code. Distributed pipelining can move output pipelines to optimize your design. To prevent distributed pipelining from moving output pipelines from a specified point in your design, use theConstrainedOutputPipelineparameter.

This code specifies an output pipeline depth of two stages for each Sum block in the model:

sblocks = find_system(gcb,'BlockType','Sum');forii=1:length(sblocks),hdlset_param(sblocks{ii},'OutputPipeline', 2),end;

Note

TheOutputPipelinesetting does not have any effect on blocks that do not have an output port.

When generating code for pipeline registers, HDL Coder appends a postfix string to names of input or output pipeline registers. The default postfix string is_pipe. To customize the postfix string, use thePipeline postfixoption in the Configuration Parameters dialog box, in theHDL Code Generation > Global Settings > Generaltab. Alternatively, you can use thePipelinePostfixproperty withmakehdl. For an example, seePipeline postfix.

See alsoUse Distributed Pipelining Optimization in Models with MATLAB Function Blocks.

PreserveUpstreamLogic

Control the removal of unconnected logic. Unconnected logic is logic that is connected upstream from aterminatorblock. This property is available forTerminatorblocks only.

PreserveUpstreamLogic Options PreserveUpstreamLogic Behavior
off(default)

Logic connected upstream from theTerminatorblock is not preserved in HDL code generation.

on

Logic connected upstream from theTerminatorblock is preserved in HDL code generation.

For an example, see the "Upstream Logic Preservation of Unused Port" section ofOptimize Unconnected Ports in HDL Code for Simulink Models.

RAMDirective

Using RAMDirective, you can specify whether you want to map the Random Access Memory (RAM) blocks in your Simulink model to FPGA RAM memory blocks. You can map large memory blocks such asultrafrom the Xilinx family and M144k from the Quartus®family. Specify these RAMDirective values for the RAM blocks in your design based on the synthesis tool.

Synthesis Tool RAM Style Attribute RAMDirective Values
Quartus ramstyle

logic| M9K| M10K| M20K| M144K| MLAB

Xilinx ram_style

block| distributed| register| ultra

Microchip syn_ramstyle

block_ram| registers| lsram| uram

When you specify a value for this setting, HDL Coder generates aramstyleattribute in the HDL code. This attribute specifies the type of RAM memory unit that you want the synthesis tool to use when inferring the RAM blocks in your design.

When you do not specify a value for this setting, HDL Coder does not generate theramstyleattribute in the HDL code. The synthesis tool determines the type of inferred RAM for mapping the RAM blocks in your model.

Set RAMDirective for RAM Blocks

In theHDL RAMslibrary, except for theDual Rate Dual Port RAM, you can specify theRAMDirectiveproperty for all other RAM blocks.

To setRAMDirectivefor a RAM block in the HDL Block Properties dialog box:

  1. Right-click the RAM block.

  2. SelectHDL Code>HDL Block Properties.

  3. InRAMDirectiveproperty, specify the values as listed in the table.

You can also set theRAMDirectiveby usinghdlset_paramfunction.

hdlset_param(, ‘RAMDirective’, );

To specify these attributes in the MATLAB®HDL workflow, use theRAMDirectiveparameter value pair forhdl.RAMinstantiation. Set this property by using this command:

hRam = hdl.RAM(‘RAMType’, ‘Single Port RAM’, ‘RAMDirective’, ‘ultra’);

For example, generate an HDL attribute for mapping the RAM blocks in your model toblock RAM. Ablock RAMis a dedicated memory unit on the FPGA. Sizes of block RAMs can be4kb,8kb,16kb, and32kb.

To map your RAM blocks toblock RAM:

  • Specify the synthesis tool. You must target a Xilinx device that containsblock RAMresources. If the target device does not contain block RAMs, the synthesis tool ignores this attribute and might infer the RAM as distributed RAMs or Lookup Table (LUT) slices.

  • Enter the RAMDirective value asblockfor your Simulink RAM blocks in HDL Block Properties.

  • Generate the HDL code for your model.

This generated VHDL code shows theram_styleattribute is set toblock:

attribute ram_style: string; attribute ram_style of ram : signal is "block";

This generated Verilog code shows theram_styleattribute is set toblock:

(* ram_style = "block" *)

Dependency

When usingRAMDirectiveproperty, make sure to select the synthesis tool for your design.

ResetType

用theResetTypeblock parameter to suppress reset logic generation.

ResetType Value Description
default

Generate reset logic.

none

Do not generate reset logic.

Reset is not applied to generated registers. Therefore, mismatches between Simulink and the generated code occur for some number of samples during the initial phase, when registers are not fully loaded.

To avoid test bench errors during the initial phase, determine the number of samples required to fully load the registers. Then, set theIgnore output data checking (number of samples)option accordingly. See alsoIgnore output data checking (number of samples)inTest Bench Stimulus and Output Parameters.

You can specifyResetTypefor the following blocks:

  • Chart

  • Convolutional Deinterleaver

  • Convolutional Interleaver

  • Delay

  • Delay(DSP System Toolbox™)

  • General Multiplexed Deinterleaver

  • General Multiplexed Interleaver

  • MATLAB Function

  • MATLAB System

  • 内存

  • Tapped Delay

  • Truth Table

  • Unit Delay Enabled

  • Unit Delay

Reset Logic for Optimizations in the MATLAB Function Block

When you setResetTypetononefor aMATLAB Functionblock, HDL Coder does not generate reset logic for persistent variables in the MATLAB code.

However, if you specify other optimizations for the block, the coder may insert registers that use reset logic. The coder does not suppress reset logic generation for these registers. Therefore, if you setResetTypetononealong with other block optimizations, your generated code may have a reset port at the top level.

How to Suppress Reset Logic Generation

抑制复位逻辑块usi代ng the UI:

  1. Right-click the block and selectHDL Code>HDL Block Properties.

  2. ForResetType, selectnone.

通用电气抑制复位逻辑neration, on the command line, enter:

hdlset_param(path_to_block,'ResetType','none')

For example, to suppress reset logic generation for a Unit Delay block,UnitDelay1, within a subsystem,mySubsys, on the command line, enter:

hdlset_param('mySubsys/UnitDelay1','ResetType','none');

Specify Synchronous or Asynchronous Reset

To specify a synchronous or asynchronous reset, use theResetTypemodel-level parameter. For details, seeReset typeinReset Settings and Parameters.

SerialPartition

用this parameter on Min/Max blocks to specify partitions for a serial cascade architecture. The default setting uses the minimum number of partitions.

To Generate This
Architecture...
Set SerialPartition to...
Cascade-serial with explicitly specified partitioning [p1 p2 p3...pN]: a vector ofNintegers, whereN是串行分区的数量。每个元素啊f the vector specifies the length of the corresponding partition. The sum of the vector elements must be equal to the length of the input data vector. The values of the vector elements must be in descending order, except the last two elements can be equal. For example, for an input of 8 elements, partitions[5 3]or[4 2 2]are legal, but the partitions[2 2 2 2]or[3 2 3]raise an error at code generation time.
Cascade-serial with automatically optimized partitioning 0

This property is also used for serial filter architectures. For how to configure filter blocks, seeSerialPartition.

SharingFactor

UseSharingFactorto specify the number of functionally equivalent resources to map to a single shared resource. The default is 0. SeeResource Sharing.

SoftReset

用theSoftResetblock parameter to specify whether to generate hardware-friendly synchronous reset logic, or local reset logic that matches the Simulink simulation behavior. This property is available for theUnit Delay Resettableblock orUnit Delay Enabled Resettableblock.

SoftReset Value Description
off(default)

Generate local reset logic that matches the Simulink simulation behavior.

on

Generate synchronous reset logic for the block. This option generates code that is more efficient for synthesis, but does not match the Simulink simulation behavior.

WhenSoftReset设置为'off', the following code is generated for aUnit Delay Resettableblock :

always @(posedge clk or posedge reset) begin : Unit_Delay_Resettable_process if (reset == 1'b1) begin Unit_Delay_Resettable_zero_delay <= 1'b1; Unit_Delay_Resettable_switch_delay <= 2'b00; end else begin if (enb) begin Unit_Delay_Resettable_zero_delay <= 1'b0; if (UDR_reset == 1'b1) begin Unit_Delay_Resettable_switch_delay <= 2'b00; end else begin Unit_Delay_Resettable_switch_delay <= In1; end end end end assign Unit_Delay_Resettable_1 = (UDR_reset || Unit_Delay_Resettable_zero_delay ? 1'b1 : 1'b0); assign out0 = (Unit_Delay_Resettable_1 == 1'b1 ? 2'b00 : Unit_Delay_Resettable_switch_delay);

WhenSoftReset设置为'on', the following code is generated for aUnit Delay Resettableblock :

always @(posedge clk or posedge reset) begin : Unit_Delay_Resettable_process if (reset == 1'b1) begin Unit_Delay_Resettable_reg <= 2'b00; end else begin if (enb) begin if (UDR_reset != 1'b0) begin Unit_Delay_Resettable_reg <= 2'b00; end else begin Unit_Delay_Resettable_reg <= In1; end end end end assign out0 = Unit_Delay_Resettable_reg;

StreamingFactor

Number of parallel data paths, or vectors, to transform into serial, scalar data paths by time-multiplexing serial data paths and sharing hardware resources. The default is 0, which implements fully parallel data paths. See alsoStreaming.

UsePipelines

You can use this mode withProductblocks inDivideandReciprocalmodes. This property becomes available when you set the HDL architecture for the blocks toShiftAdd. This architecture uses a non-restoring division algorithm that performs multiple shift and add operations to compute the quotient. TheShiftAddarchitecture provides improved accuracy compared to the Newton-Raphson approximation method.

When you use theShiftAddarchitecture, you can use theUsePipelinesimplementation parameter to specify whether to use a pipelined or non-pipelined implementation of the non-restoring division.

UsePipelines Setting Mapping Behavior

on(default)

Use a pipelined implementation of the non-restoring shift and add operation forDivideandReciprocalblocks. This setting adds more delays to your design but achieves a higher maximum clock frequency on the target FPGA device. The number of pipelines inserted matches the number of iterations that the algorithm requires to compute the quotient or reciprocal.

off

Use a non-pipelined implementation of the non-restoring shift and add operation forDivideandReciprocalblocks. This setting does not add delays to your design. As division and reciprocal are resource-intensive operations, to achieve higher clock frequencies on the target FPGA, setUsePipelinestoon.

Set UsePipelines for Divide and Reciprocal Blocks

To setUsePipelines的潜艇ystem from the HDL Block Properties dialog box:

  1. Right-click the subsystem.

  2. SelectHDL Code>HDL Block Properties.

  3. ForUsePipelines, selectonoroff.

To setUsePipelinesfor a block from the command line, usehdlset_param. For example, to turn offUsePipelinesfor aDivideblock inside a subsystem,my_dut:

hdlset_param('my_dut/divide','UsePipelines','off');
See alsohdlset_param.

UseRAM

TheUseRAMimplementation parameter enables using RAM-based mapping for a Delay block instead of mapping to a shift register.

UseRAM Setting Mapping Behavior

off

The delay maps to a shift register in the generated HDL code, except in one case. For details, seeEffects of Streaming and Distributed Pipelining.

on

The delay maps to a dual-port RAM block when the following conditions are true:

  • Initial value of the delay is zero.

  • TheDelayblock does not have an external reset or enable port.

  • Delay lengthgreater than or equal to4.

  • Delay has one of the following set of numeric and data type attributes:

    • (a) Real scalar with a non-floating-point data type (such as signed integer, unsigned integer, fixed point, or Boolean)

    • (b) Complex scalar with real and imaginary parts that use non-floating-point data type

    • (c) Vector where each element is either (a) or (b)

  • RAMSizeis greater than or equal to theRAMMappingThresholdvalue.RAMSizeis the product ofDelayLength * WordLength * VectorLength * Complexity.

    • DelayLengthis the number of delays that the Delay block specifies.

    • WordLengthis the number of bits that represent the data type of the delay.

    • VectorLengthis the vector length of the input to the Delay block.

    • Complexityis 2 for a complex data type or 1 for a real datatype.

    For more information, seeRAM mapping threshold.

If any condition is false, the delay maps to a shift register in the HDL code unless it merges with other delays to map to a single RAM. For more information, seeMapping Multiple Delays to RAM.

This implementation parameter is available for theDelayblock in the Simulink Discrete library and theDelay(DSP System Toolbox)block in the DSP System Toolbox Signal Operations library.

Mapping Multiple Delays to RAM

HDL Coder can also merge several delays of equal length into one delay and then map the merged delay to a single RAM. This optimization provides the following benefits:

  • Increased occupancy on a single RAM

  • Sharing of address generation logic, which minimizes duplication of identical HDL code

  • Mapping of delays to a RAM when theindividualdelays do not satisfy the threshold

The following rules control whether or not multiple delays can merge into one delay:

  • The delays must:

    • Be at the same level of the subsystem hierarchy.

    • 用the same compiled sample time.

    • HaveUseRAM设置为on, or be generated by streaming or resource sharing.

    • Have the sameResetTypesetting, which cannot benone.

  • The total word length of the merged delay cannot exceed 128 bits.

  • TheRAMSizeof the merged delay is greater than or equal to theRAMMappingThresholdvalue.RAMSizeis the product ofDelayLength * WordLength * VectorLength * Complexity.

Example of Multiple Delays Mapping to a Block RAM

RAMMappingThresholdfor this model is100bits.

The Delay and Delay1 blocks merge and map to a dual-port RAM in the generated HDL code by satisfying the following conditions:

  • Both delay blocks:

    • Are at the same level of the hierarchy.

    • 用the same compiled sample time.

    • HaveUseRAM设置为onin the HDL block properties dialog box.

    • Have the sameResetTypesetting ofdefault.

  • The total word length of the merged delay is 28 bits, which is below the 128-bit limit.

  • TheRAMSizeof the merged delay is 112 bits (4 delays * 28-bit word length), which is greater than the mapping threshold of 100 bits.

When you generate HDL code for this model, HDL Coder generates additional files to specify RAM mapping. HDL Coder stores these files in the same source location as other generated HDL files, for example, thehdlsrcfolder.

Effects of Streaming and Distributed Pipelining

WhenUseRAMisofffor a Delay block, HDL Coder maps the delay to a shift register by default. However, the coder changes theUseRAMsetting toonand tries to map the delay to a RAM under the following conditions:

  • Streaming isenabledfor the subsystem with theDelayblock.

  • Distributed pipelining isdisabledfor the subsystem with theDelayblock.

Suppose that distributed pipelining isenabledfor the subsystem with theDelayblock.

  • WhenUseRAMisoff, theDelayblock participates in retiming.

  • WhenUseRAMison, theDelayblock does not participate in retiming. HDL Coder does not break up a delay marked for RAM mapping.

    Consider a subsystem with twoDelayblocks, threeConstantblocks, and threeProductblocks:

    WhenUseRAMisonfor the Delay block on the right, that delay does not participate in retiming.

The following summary describes whether or not HDL Coder tries to map a delay to a RAM instead of a shift register.

UseRAMSetting for the Delay Block Optimizations Enabled for Subsystem with Delay Block
Distributed Pipelining Only Streaming Only Both Distributed Pipelining and Streaming
On Yes Yes Yes
Off No Yes, because mapping to a RAM instead of a shift register can provide an area-efficient design. No

VariablesToPipeline

Warning

VariablesToPipelineis not recommended. Usecoder.hdl.pipelineinstead.

The VariablesToPipeline parameter enables you to insert a pipeline register at the output of one or more MATLAB variables. Specify a list of variables as a character vector, with spaces separating the variables.

See alsoPipeline MATLAB Expressions.