The HDL Coder™ software supports HDL code generation from MATLAB Function blocks that include compiled external functions. This feature enables you to write reusable MATLAB® code and call it from multiple MATLAB Function blocks.
Such functions must be defined in files that are on the MATLAB
Function block path. Use the %#codegen
compilation
directive to indicate that the MATLAB code is suitable for code generation. See Function Definition for
information on how to create, compile, and invoke external functions.
Before generating HDL code for a subsystem containing a MATLAB Function block, build the MATLAB Function block code to check for errors. To build the code, click the Build Model button in the function editor.
hdlfimath
Utility for Optimized FIMATH SettingsThe hdlfimath
function is a utility that defines a FIMATH
specification that is optimized for HDL code generation.
The following listing shows the fimath
setting defined by
hdlfimath
.
hdlfm = fimath(... 'RoundMode', 'floor',... 'OverflowMode', 'wrap',... 'ProductMode', 'FullPrecision', 'ProductWordLength', 32,... 'SumMode', 'FullPrecision', 'SumWordLength', 32,... 'CastBeforeSum', true);
The HDL division operator does not support 'floor'
rounding
mode. Use 'round'
mode or change the signed integer division
operations to unsigned integer division.
When the fimath
OverflowMode
property of the fimath
specification is set to 'Saturate'
, HDL code generation is
disallowed for the following cases:
SumMode
is set to
'SpecifyPrecision'
ProductMode
is set to
'SpecifyPrecision'
Use the default (Fixed-point
) setting for the
Treat these inherited signal types as fi objects
option.
Clear the Saturate on integer overflow setting for the MATLAB Function block.
By setting the output data type of a MATLAB Function block explicitly, you enable optimizations for RAM mapping and pipelining. Avoid inheriting the output data type for a MATLAB Function block for which you want to enable optimizations.
HDL Coder supports both tunable and non-tunable parameters with the following data types:
Scalar
Vector
Complex
Structure
Enumeration
When using tunable parameters with the MATLAB Function block:
The tunable parameter should be a Simulink.Parameter object with the
StorageClass
set to
ExportedGlobal
.
x = Simulink.Parameter
x.Value = 1
x.CoderInfo.StorageClass = 'ExportedGlobal'
In the Ports and Data Manager dialog box, select the tunable check box.
For details, see Generate DUT Ports for Tunable Parameters.
When your design contains MATLAB Function blocks, before you
generate HDL code, you can run the check Check for MATLAB Function block settings in the HDL
Code Advisor. This check verifies whether you use the recommended MATLAB
Function blocks for HDL code generation. The settings include whether
fimath
settings are defined as per
hdlfimath
and Saturate on integer
overflow check box is cleared.
See also Check HDL Compatibility of Simulink Model Using HDL Code Advisor.
In the HDL Block Properties dialog box for the MATLAB Function
blocks, you can specify whether to use MATLAB Function
or
MATLAB Datapath
as the HDL architecture. Floating-point
models use the MATLAB Datapath
architecture even if you specify
the HDL architecture as MATLAB Function
on the block. Fixed-point
models use the MATLAB Function
architecture by default.
To perform various speed and area optimizations such as sharing and distributed
pipelining inside the MATLAB Function block and across the
MATLAB Function block boundary with other Simulink® blocks, use the MATLAB Datapath
architecture. When
you use this architecture, the code generator treats the MATLAB
Function block like a regular Subsystem block. This
capability enables you to optimize the algorithm inside the MATLAB
Function block and across the MATLAB Function block with
other blocks in your model.
See HDL Optimizations Across MATLAB Function Block Boundary Using MATLAB Datapath Architecture.
Check for MATLAB Function block settings