SystemVerilog Static Methods
Introduction
In my last post, you learned how to create a class with a static property. This variable acts like a global variable in that only one copy exists, no matter how many objects you create. This post shows how you can create methods that access those static properties.
Methods
Any class method can read and write these static properties, just like dynamic properties. However, if you declare the method as static, you can call the method without needing to construct an object. Here is the Thing class with a static method to print the count of Thing objects. You can call Thing::print_count(), even if no Thing objects were constructed.
class Thing; int id; // Dynamic, unique to each object static int count; // Static, associated with the class static function void print_count(); $display(“Thing::count = %0d.”, count); endfunction // The rest of the class endclass
Static methods can only access static properties. Remember, a static property acts like a global variable in that it is always around. Dynamic properties are stored in objects. The id property only exists in individual objects, so print_count() could not see it.
Here is a simple error handler class that keeps track of how many error messages have printed and exits when you reach the maximum. Notice that there are no ErrorH handles or objects created. Copy this code and try on your simulator.
class ErrorH; static int count=0, max_count=10; static function void print(input string s); $error(s); if (++count >= max_count) begin $display("*** Error max %0d exceeded", max_count); $finish(0); end endfunction static function void set_max_count(input int m); max_count = m; endfunction endclass initial begin ErrorH::set_max_count(2); // Limit the number of errors ErrorH::print("one"); ErrorH::print("two - should end sim"); ErrorH::print("three - should not print"); end
More tips
The uvm_config_db class is built on static methods, which is why you need to call with the following syntax.
uvm_config_db::set(...) uvm_config_db::get(...)
Without static methods, you would have to construct a DB object, and pass its handle around to every corner of the testbench. That defeats the whole goal of simplifying sharing of configuration information.
The specialization is not shown. Look for more details in an upcoming blog post.
Enjoy your verification journey!
Chris Spear
Keep learning at mentor.com/training
Questions or ideas? verificationacademy.com/ask-chris-spear
View my recent webinar on UVM Coding Guidelines and the Questions and Answers