diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index dca7d40..317ae6c 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2017-2018 ARM Limited
+# Copyright (c) 2017-2019 ARM Limited
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -655,18 +655,27 @@
         if attr == 'cxx_namespaces':
             return cls.cxx_class_path[:-1]
 
+        if attr == 'pybind_class':
+            return  '_COLONS_'.join(cls.cxx_class_path)
+
         if attr in cls._values:
             return cls._values[attr]
 
         if attr in cls._children:
             return cls._children[attr]
 
-        raise AttributeError(
-              "object '%s' has no attribute '%s'" % (cls.__name__, attr))
+        try:
+            return getattr(cls.getCCClass(), attr)
+        except AttributeError:
+            raise AttributeError(
+                "object '%s' has no attribute '%s'" % (cls.__name__, attr))
 
     def __str__(cls):
         return cls.__name__
 
+    def getCCClass(cls):
+        return getattr(m5.internal.params, cls.pybind_class)
+
     # See ParamValue.cxx_predecls for description.
     def cxx_predecls(cls, code):
         code('#include "params/$cls.hh"')
@@ -675,10 +684,7 @@
         code('#include "${{cls.cxx_header}}"')
 
     def pybind_decl(cls, code):
-        class_path = cls.cxx_class.split('::')
-        namespaces, classname = class_path[:-1], class_path[-1]
-        py_class_name = '_COLONS_'.join(class_path) if namespaces else \
-                        classname;
+        py_class_name = cls.pybind_class
 
         # The 'local' attribute restricts us to the params declared in
         # the object itself, not including inherited params (which
@@ -952,6 +958,7 @@
         override = kwargs.get("override", False)
         cxx_name = kwargs.get("cxx_name", name)
         return_value_policy = kwargs.get("return_value_policy", None)
+        static = kwargs.get("static", False)
 
         args, varargs, keywords, defaults = inspect.getargspec(func)
         if varargs or keywords:
@@ -968,7 +975,7 @@
 
         @wraps(func)
         def cxx_call(self, *args, **kwargs):
-            ccobj = self.getCCObject()
+            ccobj = self.getCCClass() if static else self.getCCObject()
             return getattr(ccobj, name)(*args, **kwargs)
 
         @wraps(func)
@@ -977,7 +984,8 @@
 
         f = py_call if override else cxx_call
         f.__pybind = PyBindMethod(name, cxx_name=cxx_name, args=args,
-                                  return_value_policy=return_value_policy)
+                                  return_value_policy=return_value_policy,
+                                  static=static)
 
         return f
 
diff --git a/src/python/m5/util/pybind.py b/src/python/m5/util/pybind.py
index 4664c16..e194e37 100644
--- a/src/python/m5/util/pybind.py
+++ b/src/python/m5/util/pybind.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 ARM Limited
+# Copyright (c) 2017, 2019 ARM Limited
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -59,11 +59,12 @@
 
 class PyBindMethod(PyBindExport):
     def __init__(self, name, cxx_name=None, args=None,
-                 return_value_policy=None):
+                 return_value_policy=None, static=False):
         self.name = name
         self.cxx_name = cxx_name if cxx_name else name
         self.args = args
         self.return_value_policy = return_value_policy
+        self.method_def = 'def_static' if static else 'def'
 
     def _conv_arg(self, value):
         if isinstance(value, bool):
@@ -88,4 +89,4 @@
                     return 'py::arg("%s")' % arg
 
             arguments.extend(list([ get_arg_decl(a) for a in self.args ]))
-        code('.def(' + ', '.join(arguments) + ')')
+        code('.' + self.method_def + '(' + ', '.join(arguments) + ')')
