DWork Vector Basics
What Is a DWork Vector?
DWork vectors are blocks of memory that an S-function asks the Simulink® engine to allocate to each instance of the S-function in a model. If multiple instances of your S-function can occur in a model, your S-function must use DWork vectors instead of global or static memory to store instance-specific values of S-function variables. Otherwise, your S-function runs the risk of one instance overwriting data needed by another instance, causing a simulation to fail or produce incorrect results. The ability to keep track of multiple instances of an S-function is called reentrancy.
You can create an S-function that is reentrant by using DWork vectors that the engine manages for each particular instance of the S-function.
DWork vectors have several advantages:
- Provide instance-specific storage for block variables 
- Support floating-point, integer, pointer, and general data types 
- Eliminate static and global variables 
- Interact directly with the Simulink engine to perform memory allocation, initialization, and deallocation 
- Facilitate inlining the S-function during code generation 
- Provide more control over how data appears in the generated code 
Note
DWork vectors are the most generalized and versatile type of work vector and the following sections focus on their use. The Simulink product provides additional elementary types of work vectors that support floating-point, integer, pointer, and mode data. You can find a discussion of these work vectors in Elementary Work Vectors.
DWork vectors provide the most flexibility for setting data types, names, etc., of the data in the simulation and during code generation. The following list describes all the properties that you can set on a DWork vector:
- Data type 
- Size 
- Numeric type, either real or complex 
- Name 
- Usage type (see Types of DWork Vectors) 
- Simulink Coder™ identifier 
- Simulink Coder storage class 
- Simulink Coder C type qualifier 
See How to Use DWork Vectors for instructions on how to set these properties. The three Simulink Coder properties pertain only to code generation and have no effect during simulation.
DWork Vectors and the Simulink Engine
A key advantage of DWork vectors is their connection to the Simulink engine. Over the course of the simulation, the engine relieves the S-function of all memory management tasks related to DWork vectors.
To see how this connection is useful, consider an S-function that uses a global variable to store data. If more than one copy of the S-function exists in a model, each instance of the S-function must carefully allocate, manipulate, and deallocate each piece of memory it uses.
In an S-function that uses DWork vectors, the engine, not the S-function, manages the memory for the DWork vector. At the start of a simulation, the engine allocates the memory required for each instance of the S-function based on the size and the data type of the DWork vector contents. At the end of the simulation, the engine automatically deallocates the memory.
Note
You have no control over how the engine allocates memory for DWork vectors
                    during simulation. When using the Simulink
            Coder software, you can use storage classes to customize the memory
                    allocation during code generation. See the ssSetDWorkRTWStorageClass
                    reference page for more information on using storage classes.
The engine also performs special tasks based on the type of DWork vector used in the S-function. For example, it includes DWork vectors that store discrete state information in the model-wide state vector and makes them available during state logging.
DWork Vectors and the Simulink Coder Product
DWork vectors allow you to customize how data appears in the generated code. When
                code is generated, the Simulink
            Coder code generator includes the DWork vector in the data structure for the
                model. The DWork vector controls the field name used in the structure. DWork vectors
                also control the storage class and C type qualifier used in the generated code. See
                        sfun_rtwdwork.c for an example.