- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Folks,
I am unable to make sense of an error I get while using ModelSim. My SystemVerilog module is: ///////////////////BEGIN MODULE///////////////////////////// module op_transform(input logic[31:0] data, output y); typedef struct packed { logic[11:0] op1; logic[11:0] op2; } op_str; op_str my_op_str = 24'hBE_EE_FE; always_comb begin if (data > 1024) opTF(data, my_op_str.op1, my_op_str.op2); end task automatic opTF(input logic[31:0] data, ref logic[11:0] opA, ref logic[11:0] op ) ; /* Code omitted for brevity */ endtask endmodule ///////////////////END MODULE///////////////////////////// Quartus Analysis & Synthesis completes without errors. But when I attempt to compile this in ModelSim, I get the following errors:# ** Error: <filename>.sv(12): The select "my_op_str.op1" into a packed value is illegal for use with ref argument "opA".# ** Error: <filename>.sv(12): The select "my_op_str.op2" into a packed value is illegal for use with ref argument "opB". Has anybody seen this before? If I individually list the members of the struct in the module, ModelSim compiles fine. What am I missing? Any help would be appreciated. Thanks in advance!Link Copied
2 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You need to use output or inout instead of ref arguments. Passing a ref argument requires a whole variable, not a part select, which is considered an expression.
About the only time you need to use ref arguments is when you have a time-consuming task and you need updated argument values as the task call progresses. Since this task call is from an always_comb block, opTF really should be a void function. A function call has a guarantee that it will not consume time (has no blocking delays).- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks, that's what I figured. An inout did just fine, although there is a copy before and after making the call.
Your suggestion to make opTF a function is good. Its strange that Quartus does not complain during Analysis & Synthesis but ModelSim does during compilation. Thanks!
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page