Clear Filters
Clear Filters

Mask parameter value is ignored with HDL Counter word length

9 views (last 30 days)
I developed a specialized counter to accept starting count and max count values through inputs. I've made this into a model so I can use model referencing. This seems to work fine.
However, one thing I'm missing is the ability to set the counter's word size independently in every instantiation. This is where a mask would seem to be the solution.
I added a mask with a single parameter: counter_word_length, and set the word length parameter in the HDL Counter to this variable. Now my counter has a mask.
I open the mask for the referenced model and set counter_word_length to 13 (default was 16). The output type of the counter does not change accordingly. It should be ufix13, but it stubbornly remains uint16. The Word length field in the HDL Counter mask shows the correct value of 13 in the indicator field at the right edge of the editable field. Yet still, the output type is uint16.
I have changed this field to "13" instead of the variable and everything works as expected. What am I doing wrong?
I can share the model and a system that exercises the model if the answer to this isn't obvious.
Charles on 28 Mar 2023
Attached is the model and a test bench system using it.
I started running into another problem as well when trying to use this model. I need to run in an accelerated mode, but I keep getting this message:
Model arguments can not be used in non-tunable expressions. Parameter 'OutDataTypeStr' of 'Prog_HDL_load_counter/Free-Running Counter/load_val' is non-tunable but refers to
variables (counter_word_length (model argument)).
This does not happen in the attached test bench, nor does it happen in the main system when running in Normal mode.
Charles on 30 Mar 2023
Still waiting for a response to my questions. Is there a way to make the mask parameter non-tuneable?

Sign in to comment.

Accepted Answer

Andy Bartlett
Andy Bartlett on 11 Apr 2023
Edited: Andy Bartlett on 11 Apr 2023
Model Reference is not compatible with what you are trying to do. As an alternative, consider creating a Simulink library and putting your counter in that library as a masked subsystem block, or use Subsystem Reference.
The reason Model Reference is not compatible is that reference models are always compiled fully independently of any parent models that are using a reference model. Standalone fully independent compile is a hugh advantage when working on large Model Based Design projects. Benefits include saving lots of time when starting the simulation of a parent model. Compiling a model locks down many things about a model including data types. So trying to change the data types in a child reference model based on a settings in a parent model is incompatible.
Linking to a subsystem does NOT have the independent compile behavior. The subsystem is compiled at the same time as the parent, so it has the opportunity to change things like data types based on mask parameters.
Minor tip: If a parameter will specify attributes of a parameter, then set that parameter to be NON-tunable in the mask editor. Data types are not allowed to change (i.e. be tuned) in the middle of a simulation.
  1 Comment
Charles on 11 Apr 2023
Ok, I've tried this with a Subsystem Reference and it works great. I do plan to start a Simulink library, so I'll probably start with this function.
Thanks for the explanation. It makes sense, but I admit to still being confused by models, subsystems, systems, etc. and I definitely don't know what all the differences are. At any rate, this is a good solution for my purposes.

Sign in to comment.

More Answers (1)

Jack on 30 Mar 2023
Hello Charles,
Regarding your first question, it sounds like the HDL Counter block is not recognizing the updated value of the counter_word_length parameter from the mask. One possible reason for this could be that the counter_word_length parameter is not properly linked to the HDL Counter block.
To link the parameter to the block, you can try the following steps:
  1. Open the mask editor for the referenced model.
  2. Click on the "View/Edit Model Parameters" button to open the "Model Explorer" window.
  3. In the "Model Explorer" window, locate the HDL Counter block and select it.
  4. In the "Properties" pane of the "Model Explorer" window, find the "Word length" parameter and click on the "..." button next to it.
  5. In the "Parameter Properties" window, set the "Data type" to "Inherit: auto".
  6. In the "Parameter Properties" window, set the "Value" to counter_word_length.
  7. Click "OK" to close the "Parameter Properties" window.
This should properly link the counter_word_length parameter to the HDL Counter block and set its word length accordingly.
Regarding your second question, you can make the mask parameter non-tunable by setting its "Tunable" property to "false". To do this, follow these steps:
  1. Open the mask editor for the referenced model.
  2. Select the mask parameter in the mask editor.
  3. In the "Properties" pane of the mask editor, find the "Tunable" parameter and set it to "false".
  4. Save the model.
This should make the mask parameter non-tunable, so that its value cannot be changed during simulation.
I hope this helps! If you have any further questions, please don't hesitate to ask.
Jack on 2 Apr 2023
I apologize for the confusion. It seems like I may have misunderstood your original question.
Regarding your current question, it sounds like you are trying to create and use a masked model in Simulink. The obj.m_data.html code snippet you provided earlier does not seem to be relevant to this issue.
Regarding the issue with the mask parameters being uneditable, it is possible that the parameters have been marked as "locked" or "frozen". To check this, right-click on the parameter in the mask editor window and see if there is an option to unlock or unfreeze it. If not, you may need to modify the mask code to allow the parameters to be modified.
Charles on 4 Apr 2023
Please read my original first message in this thread and look at the two systems I posted to know what I'm asking. I have no idea what you're talking about with a "obj.m_data.html code snippet". It would be nice to have a knowledgable response to my original questions.
Here is a screen capture of the only Mask Editor window I know of. Right clicking on the parameter produces a "Cut-Copy-Paste" menu. Right clicking in the Property Editor does nothing.

Sign in to comment.




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!