Static types in a function hold their value between function calls. The equivalent behavior in a hardware design is a registered variable (a flip-flop or memory). If a variable is required to be a static type for the C/C++ function to execute correctly, it will certainly be a register in the final RTL design. The value must be maintained across invocations of the function and design.
It is not true that only
static types result in a register after synthesis.
Vitis HLS determines which variables are required
to be implemented as registers in the RTL design. For example, if a variable assignment
must be held over multiple cycles, Vitis HLS creates a
register to hold the value, even if the original variable in the C/C++ function was
not a static type.
Vitis HLS obeys the initialization behavior of
statics and assigns the value to zero (or any explicitly initialized value) to the
register during initialization. This means that the
static variable is initialized in the RTL code and in the FPGA bitstream.
It does not mean that the variable is re-initialized each time the reset signal is.
See the RTL configuration (
config_rtl command) to determine how static initialization values are implemented with regard to the system reset.