Simulink® provides various run-time and compile-time diagnostics that you can use to help avoid problems with data stores. Diagnostics are available in the Model Configuration Parameters dialog box and the Data Store Memory block's parameters dialog box. The Simulink Model Advisor provides support by listing cases where data store errors are more likely because diagnostics are disabled.
You can use data store run-time diagnostics to detect unintended sequences of data store reads and writes that occur during simulation. You can apply these diagnostics to all data stores, or allow each Data Store Memory block to set its own value. The diagnostics are:
Detect read before write: Detect when a data store is read from before written.
Detect write after read: Detect when a data store is written.
Detect write after write: Detect when a data store is written.
These diagnostics appear in the Model Configuration Parameters > Diagnostics > Data Validity > Data Store Memory Block pane, where each can have one of the following values:
Disable all — Disables
this diagnostic for all data stores accessed by the model.
Enable all as warnings —
Displays the diagnostic as a warning in the MATLAB® Command Window.
Enable all as errors —
Halts the simulation and displays the diagnostic in an error dialog
Use local settings —
Allow each Data Store Memory block to set its own value for this diagnostic
The same diagnostics also appear in each Data Store Memory block
parameters dialog box Diagnostics tab.
You can set each diagnostic to
error. The value specified by an individual
block takes effect only if the corresponding configuration parameter
Use local settings. See
Diagnostics Pane: Data
the Data Store Memory documentation
for more information.
The most conservative technique is to set all data store diagnostics
Enable all as errors in Model Configuration Parameters > Diagnostics > Data Validity > Data Store Memory
Block. However, this setting is not best
in all cases, because it can flag intended behavior as erroneous.
For example, the next figure shows a model that uses block priorities
to force the Data Store Read block to execute before
the Data Store Write block:
An error occurred during simulation because the data store
read from the Data Store Read block before the Data
Store Write block updates the store. If the associated delay
is intended, you can suppress the error by setting the global parameter Detect read before write to
local settings, then setting that parameter to
the Diagnostics pane of the Data Store
Memory block dialog box. If you use this technique, set the
error in all other Data
Store Memory blocks aside from those that are to be intentionally
excluded from the diagnostic.
For models referenced in Accelerator mode, Simulink ignores
the following Configuration Parameters > Diagnostics > Data Validity > Data Store Memory Block parameters
if you set them to a value other than
Detect read before write (
Detect write after read (
Detect write after write (
You can use the Model Advisor to identify models referenced in Accelerator mode for which Simulink ignores the configuration parameters listed above.
In the Simulink Editor, select Analysis > Model Advisor.
Select By Task.
Run the Check diagnostic settings ignored during accelerated model reference simulation check.
Diagnostics might be more conservative for data store memory
used by MATLAB Function blocks. For example, if you
pass arrays of data store memory to MATLAB functions, optimizations
A=foo(A) might result in MATLAB marking
the entire contents of the array as read or written, even though only
some elements were accessed.
Data integrity may be compromised if a data store is read from in one task and written to in another task. For example, suppose that:
A task is writing to a data store.
A second task interrupts the first task.
The second task reads from that data store.
If the first task had only partly updated the data store when the second task interrupted, the resulting data in the data store is inconsistent. For example, if the value is a vector, some of its elements may have been written in the current time step, while the rest were written in the previous step. If the value is a multi-word, it may be left in an inconsistent state that is not even partly correct.
Unless you are certain that task preemption cannot cause data
integrity problems, set the compile-time diagnostic Model
Configuration Parameters > Diagnostics > Data Validity >
Data Store Memory Block > Multitask Data Store to
error. This diagnostic flags
any case of a data store that is read from and written to in different
tasks. The next figure illustrates a problem detected by setting Multitask Data Store to
Since the data store
A is written to in the
fast task and read from in the slow task, an error is reported, with
suggested remedy. This diagnostic is applicable even in the case
that a data store read or write is inside of a conditional subsystem. Simulink correctly
identifies the task that the block is executing within, and uses that
task for the purpose of evaluating the diagnostic.
The next figure shows one solution to the problem shown above: place a rate transition block after the data store read, which previously accessed the data store at the slower rate.
With this change, the data store write can continue to occur at the faster rate. This may be important if that data store must be read at that faster rate elsewhere in the model.
The Multitask Data Store diagnostic also applies to data store reads and writes in referenced models. If two different child models execute a data store's reads and writes in differing tasks, the error will be detected when Simulink compiles their common parent model.
Data store errors can occur due to duplicate uses of a data store name within a model. For instance, data store shadowing occurs when two or more data store memories in different nested scopes have the same data store name. In this situation, the data store memory referenced by a data store read or write block at a low level may not be the intended store.
To prevent errors caused by duplicate data store names, set
the compile-time diagnostic Model Configuration
Parameters > Diagnostics > Data Validity > Data Store Memory
Block > Duplicate Data Store Names to
By default, the value of the diagnostic is
suppressing duplicate name detection. The next figure shows a problem
detected by setting Duplicate Data Store Names to
The data store read at the bottom level of a subsystem hierarchy
refers to a data store named
A, and two Data Store
Memory blocks in the same model have that name, so an error is reported.
This diagnostic guards against assuming that the data store read
refers to the Data Store Memory block in the top level of the model.
The read actually refers to the Data Store Memory block at the intermediate
level, which is closer in scope to the Data Store Read block.
The Model Advisor provides several diagnostics that you can use with data stores. See these sections for information about Model Advisor diagnostics for data stores: