Main Content

Control the Scope of Delay Balancing

This example shows how to balance delays in specific parts of a design, without balancing delays on the entire design.

You can programmatically balance delays by using the BalanceDelays HDL input and output port block property to balance the additional delays introduced by HDL Coder™. You can enable or disable this property on individual input and output ports in your model. For example, in a design containing a data path and a control path, delay balancing can be applied exclusively to the data path of the design. This means focusing on the paths that necessitate data synchronization. You can use BalanceDelays at the design under test (DUT) port level to control how and where HDL Coder balances delays. hdlcoder_localdelaybalancing.slx shows how to disable delay balancing on user-defined stable control paths.

Constrain Delay Balancing to the Data Path

The example model hdlcoder_localdelaybalancing.slx has two subsystems under the device under test (DUT) subsystem, hdlcoder_localdelaybalancing/Subsystem, param_control and symmetric_fir, which contain the control logic and the data path, respectively.

open_system('hdlcoder_localdelaybalancing');
open_system('hdlcoder_localdelaybalancing/Subsystem');

To optimize timing results, each subsystem has one block that has one output pipeline register.

hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/param_control/And');
hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/param_control/And')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Implementation

	Architecture : default

Implementation Parameters

	OutputPipeline : 1


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Implementation

	Architecture : Linear

Implementation Parameters

	OutputPipeline : 1

Enable the generation of the validation model and generate HDL code using the makehdl function.

hdlset_param('hdlcoder_localdelaybalancing', 'GenerateValidationModel', 'on');
makehdl('hdlcoder_localdelaybalancing/Subsystem');
### Working on the model <a href="matlab:open_system('hdlcoder_localdelaybalancing')">hdlcoder_localdelaybalancing</a>
### Generating HDL for <a href="matlab:open_system('hdlcoder_localdelaybalancing/Subsystem')">hdlcoder_localdelaybalancing/Subsystem</a>
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_localdelaybalancing'.
### Begin compilation of the model 'hdlcoder_localdelaybalancing'...
### Working on the model 'hdlcoder_localdelaybalancing'...
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Output port 2: 1 cycles.
### Output port 3: 1 cycles.
### Working on... <a href="matlab:configset.internal.open('hdlcoder_localdelaybalancing', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlcoder_localdelaybalancing'...
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generated model saved at <a href="matlab:open_system('hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing.slx')">hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing.slx</a>
### Delay absorption obstacles can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoder_localdelaybalancing/highlightDelayAbsorption')">hdlsrc/hdlcoder_localdelaybalancing/highlightDelayAbsorption.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_localdelaybalancing/clearhighlighting.m')">hdlsrc/hdlcoder_localdelaybalancing/clearhighlighting.m</a>
### Generating new validation model: '<a href="matlab:open_system('hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing_vnl')">gm_hdlcoder_localdelaybalancing_vnl</a>'.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd.
### Code Generation for 'hdlcoder_localdelaybalancing' completed.
### Generating HTML files for code generation report at <a href="matlab:hdlcoder.report.openDdg('/tmp/Bdoc24b_2679053_1485932/tpf9accb54/hdlcoder-ex13756842/hdlsrc/hdlcoder_localdelaybalancing/html/hdlcoder_localdelaybalancing_codegen_rpt.html')">hdlcoder_localdelaybalancing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc24b_2679053_1485932/tpf9accb54/hdlcoder-ex13756842/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Load and update the validation model, rearrange the generated model layout, and open the validation model to the param_control subsystem.

load_system('gm_hdlcoder_localdelaybalancing_vnl');
set_param('gm_hdlcoder_localdelaybalancing_vnl', 'SimulationCommand', 'update');
arrangeLayout('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control')
open_system('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control');

Delay balancing is enabled globally by default and inserts matching delays on both the control path and the data path, as shown in the validation model. For more information on the validation model, see Generated Model and Validation Model.

In this example, only the data path, symmetric_fir, requires data synchronization. The inputs u1 through u4 to the param_control subsystem are constant inputs that are coefficients to the FIR filter. The input paths through the DUT subsystem for these coefficients are stable and do not have to synchronize with each other or with the processed data. As a result, you can disable delay balancing for the input ports with constant inputs to the control logic to save on hardware resources. To achieve this, set the HDL block property BalanceDelays for Inport blocks u1 through u4 of the DUT subsystem to off. Because the stable paths propagate through to the lower-level hierarchy in the DUT subsystem, you do not need to disable this property for lower-level Inport blocks inside the param_control or symmetric_fir subsystems.

hdlset_param('hdlcoder_localdelaybalancing/Subsystem/u1', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing/Subsystem/u2', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing/Subsystem/u3', 'BalanceDelays', 'off');
hdlset_param('hdlcoder_localdelaybalancing/Subsystem/u4', 'BalanceDelays', 'off');

Close the validation model, generate HDL code using the makehdl function, and open the new validation model to the param_control subsystem.

bdclose('gm_hdlcoder_localdelaybalancing_vnl');
hdlset_param('hdlcoder_localdelaybalancing', 'ValidationModelNameSuffix', '_vnl_DBoff')
makehdl('hdlcoder_localdelaybalancing/Subsystem');
load_system('gm_hdlcoder_localdelaybalancing_vnl_DBoff');
set_param('gm_hdlcoder_localdelaybalancing_vnl_DBoff', 'SimulationCommand', 'update');
Simulink.BlockDiagram.expandSubsystem('gm_hdlcoder_localdelaybalancing_vnl_DBoff/Subsystem/param_control/params');
open_system('gm_hdlcoder_localdelaybalancing_vnl_DBoff/Subsystem/param_control');
### Working on the model <a href="matlab:open_system('hdlcoder_localdelaybalancing')">hdlcoder_localdelaybalancing</a>
### Generating HDL for <a href="matlab:open_system('hdlcoder_localdelaybalancing/Subsystem')">hdlcoder_localdelaybalancing/Subsystem</a>
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_localdelaybalancing'.
### Begin compilation of the model 'hdlcoder_localdelaybalancing'...
### Working on the model 'hdlcoder_localdelaybalancing'...
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Output port 2: 1 cycles.
### Output port 3: 1 cycles.
### Working on... <a href="matlab:configset.internal.open('hdlcoder_localdelaybalancing', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlcoder_localdelaybalancing'...
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generated model saved at <a href="matlab:open_system('hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing.slx')">hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing.slx</a>
### Delay absorption obstacles can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoder_localdelaybalancing/highlightDelayAbsorption')">hdlsrc/hdlcoder_localdelaybalancing/highlightDelayAbsorption.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_localdelaybalancing/clearhighlighting.m')">hdlsrc/hdlcoder_localdelaybalancing/clearhighlighting.m</a>
### Generating new validation model: '<a href="matlab:open_system('hdlsrc/hdlcoder_localdelaybalancing/gm_hdlcoder_localdelaybalancing_vnl_DBoff')">gm_hdlcoder_localdelaybalancing_vnl_DBoff</a>'.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd.
### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd.
### Code Generation for 'hdlcoder_localdelaybalancing' completed.
### Generating HTML files for code generation report at <a href="matlab:hdlcoder.report.openDdg('/tmp/Bdoc24b_2679053_1485932/tpf9accb54/hdlcoder-ex13756842/hdlsrc/hdlcoder_localdelaybalancing/html/hdlcoder_localdelaybalancing_codegen_rpt.html')">hdlcoder_localdelaybalancing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc24b_2679053_1485932/tpf9accb54/hdlcoder-ex13756842/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html
### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Now delay balancing is only active in the data path subsystem and the generated model and code do not contain any delays in the control path subsystem.

Related Examples

More About