I would like to create a task for debug purposes in which I can print the name of the variable and assign the value to that variable. I can think of these ways to do it with the following pseudo-code:
1) pass the variable by reference and the value, which seems to work fine and the variable gets assigned, but I can not figure out how to print its name.
reg myVarName;
debug_message1(myVarName, 1'b1);
// assigns myVarName=1'b1;
// Expected print output: "The variable name is myVarName and its value is 1"
task debug_message1(ref reg var, reg val);
var = val;
print("The variable name is %s and its value is %d", var.name, var);
endtask
2) pass variable name as a string, which makes it easy to print, but I don't know how to convert the string that contains the name of the variable to the actual variable, so I could assign to it.
reg myVarName;
debug_message2("myVarName", 1'b1);
// Need to somehow assign myVarName=1'b1;
// Printed output: "The variable name is myVarName and its value is 1"
task debug_message2;
input string var;
input reg val;
`var` = val; // need to make assignment here
print("The variable name is %s and its value is %d", var, val);
endtask
3) Pass the variable, its name as a string, and the value, which does not like the second and the third arguments, because they are defined when calling the task, which gives the following error message:
Illegal connection to the ref port 'varname' of function/task 'debug_message3',formal argument should have same type as actual argument.
The same kind of error comes up for the 'val' argument.
reg myVarName;
debug_message3(myVarName, "myVarName", 1'b1);
// Assign myVarName=1'b1;
// Printed output: "The variable name is myVarName and its value is 1"
task debug_message3(ref reg var, string varname, reg val);
var = val; // need to make assignment here
print("The variable name is %s and its value is %d", varname, var);
endtask
Is there a way to implement any of the 1, 2 or 3 approaches?
Best Answer
You can make a macro to do this instead of a task
A macro treats its arguments as just text, giving you the ability to reinterpret them as identifiers or strings. The
`"
instead of"
is what lets lets you have macro arguments inside a string.