[tool] Add nice debug info for Mako

Debugging Mako template error is quite hard. With this PR, at least it
gives the exact location in the template file when error occurs.

Reference: https://docs.makotemplates.org/en/latest/usage.html#handling-exceptions
diff --git a/util/reggen/gen_dv.py b/util/reggen/gen_dv.py
index 751a5df..3de9f0b 100644
--- a/util/reggen/gen_dv.py
+++ b/util/reggen/gen_dv.py
@@ -8,6 +8,7 @@
 import operator
 import sys
 
+from mako import exceptions
 from mako.template import Template
 from pkg_resources import resource_filename
 
@@ -57,8 +58,11 @@
 
     # Generate pkg.sv with block name
     with open(outdir + "/" + block.name + "_reg_block.sv", 'w') as fout:
-        fout.write(
-            uvm_reg_tpl.render(block=block,
-                               HwAccess=HwAccess,
-                               SwRdAccess=SwRdAccess,
-                               SwWrAccess=SwWrAccess))
+        try:
+            fout.write(
+                uvm_reg_tpl.render(block=block,
+                                   HwAccess=HwAccess,
+                                   SwRdAccess=SwRdAccess,
+                                   SwWrAccess=SwWrAccess))
+        except:
+            log.error(exceptions.text_error_template().render())
diff --git a/util/reggen/gen_rtl.py b/util/reggen/gen_rtl.py
index 3aaa949..14e1475 100644
--- a/util/reggen/gen_rtl.py
+++ b/util/reggen/gen_rtl.py
@@ -9,6 +9,7 @@
 import sys
 
 from mako.template import Template
+from mako import exceptions
 from pkg_resources import resource_filename
 
 from .data import *
@@ -185,17 +186,23 @@
     # Generate pkg.sv with block name
     with open(outdir + "/" + block.name + "_reg_pkg.sv", 'w',
               encoding='UTF-8') as fout:
-        fout.write(
-            reg_pkg_tpl.render(block=block,
-                               HwAccess=HwAccess,
-                               SwRdAccess=SwRdAccess,
-                               SwWrAccess=SwWrAccess))
+        try:
+            fout.write(
+                reg_pkg_tpl.render(block=block,
+                                   HwAccess=HwAccess,
+                                   SwRdAccess=SwRdAccess,
+                                   SwWrAccess=SwWrAccess))
+        except:
+            log.error(exceptions.text_error_template().render())
 
     # Generate top.sv
     with open(outdir + "/" + block.name + "_reg_top.sv", 'w',
               encoding='UTF-8') as fout:
-        fout.write(
-            reg_top_tpl.render(block=block,
-                               HwAccess=HwAccess,
-                               SwRdAccess=SwRdAccess,
-                               SwWrAccess=SwWrAccess))
+        try:
+            fout.write(
+                reg_top_tpl.render(block=block,
+                                   HwAccess=HwAccess,
+                                   SwRdAccess=SwRdAccess,
+                                   SwWrAccess=SwWrAccess))
+        except:
+            log.error(exceptions.text_error_template().render())
diff --git a/util/tlgen/generate.py b/util/tlgen/generate.py
index 7a9ba25..ecee495 100644
--- a/util/tlgen/generate.py
+++ b/util/tlgen/generate.py
@@ -2,6 +2,7 @@
 # Licensed under the Apache License, Version 2.0, see LICENSE for details.
 # SPDX-License-Identifier: Apache-2.0
 
+from mako import exceptions
 from mako.template import Template
 from pkg_resources import resource_filename
 
@@ -23,7 +24,11 @@
     xbar_bind_tpl = Template(
         filename=resource_filename('tlgen', 'xbar.bind.tpl.sv'))
 
-    out_rtl = xbar_rtl_tpl.render(xbar=xbar, ntype=NodeType)
-    out_pkg = xbar_pkg_tpl.render(xbar=xbar)
-    out_bind = xbar_bind_tpl.render(xbar=xbar, ntype=NodeType)
+    try:
+        out_rtl = xbar_rtl_tpl.render(xbar=xbar, ntype=NodeType)
+        out_pkg = xbar_pkg_tpl.render(xbar=xbar)
+        out_bind = xbar_bind_tpl.render(xbar=xbar, ntype=NodeType)
+    except:
+        log.error(exceptions.text_error_template().render())
+
     return (out_rtl, out_pkg, out_bind)
diff --git a/util/topgen.py b/util/topgen.py
index c421e3c..4694ae3 100755
--- a/util/topgen.py
+++ b/util/topgen.py
@@ -12,6 +12,7 @@
 
 import hjson
 from mako.template import Template
+from mako import exceptions
 
 import tlgen
 from reggen import gen_rtl, gen_dv, validate
@@ -33,7 +34,10 @@
 def generate_rtl(top, tpl_filename):
     top_rtl_tpl = Template(filename=tpl_filename)
 
-    out_rtl = top_rtl_tpl.render(top=top)
+    try:
+        out_rtl = top_rtl_tpl.render(top=top)
+    except:
+        log.error(exceptions.text_error_template().render())
     return out_rtl
 
 
@@ -46,7 +50,10 @@
 
         # Add clocks to the top configuration
         obj["clocks"] = xbar.clocks
-        out_rtl, out_pkg, out_bind = tlgen.generate(xbar)
+        try:
+            out_rtl, out_pkg, out_bind = tlgen.generate(xbar)
+        except:
+            log.error(exceptions.text_error_template().render())
 
         rtl_path = out_path / 'rtl'
         rtl_path.mkdir(parents=True, exist_ok=True)
@@ -96,7 +103,10 @@
     out = StringIO()
     with hjson_tpl_path.open(mode='r', encoding='UTF-8') as fin:
         hjson_tpl = Template(fin.read())
-        out = hjson_tpl.render(src=src, target=target, prio=prio)
+        try:
+            out = hjson_tpl.render(src=src, target=target, prio=prio)
+        except:
+            log.error(exceptions.text_error_template().render())
         log.info("RV_PLIC hjson: %s" % out)
 
     if out == "":
@@ -121,7 +131,10 @@
     # Generate RV_PLIC Top Module
     with rtl_tpl_path.open(mode='r', encoding='UTF-8') as fin:
         rtl_tpl = Template(fin.read())
-        out = rtl_tpl.render(src=src, target=target, prio=prio)
+        try:
+            out = rtl_tpl.render(src=src, target=target, prio=prio)
+        except:
+            log.error(exceptions.text_error_template().render())
         log.info("RV_PLIC RTL: %s" % out)
 
     if out == "":
diff --git a/util/uvmdvgen/gen_agent.py b/util/uvmdvgen/gen_agent.py
index afb848a..5f96d54 100644
--- a/util/uvmdvgen/gen_agent.py
+++ b/util/uvmdvgen/gen_agent.py
@@ -6,6 +6,7 @@
 
 import os
 
+from mako import exceptions
 from mako.template import Template
 from pkg_resources import resource_filename
 
@@ -52,8 +53,10 @@
 
         if not os.path.exists(path_dir): os.system("mkdir -p " + path_dir)
         with open(path_dir + "/" + fname, 'w') as fout:
-            fout.write(
-                tpl.render(
-                    name=name,
-                    has_separate_host_device_driver=
-                    has_separate_host_device_driver))
+            try:
+                fout.write(
+                    tpl.render(name=name,
+                               has_separate_host_device_driver=
+                               has_separate_host_device_driver))
+            except:
+                log.error(exceptions.text_error_template().render())
diff --git a/util/uvmdvgen/gen_env.py b/util/uvmdvgen/gen_env.py
index 577bd17..67981eb 100644
--- a/util/uvmdvgen/gen_env.py
+++ b/util/uvmdvgen/gen_env.py
@@ -51,5 +51,9 @@
 
         if not os.path.exists(path_dir): os.system("mkdir -p " + path_dir)
         with open(path_dir + "/" + fname, 'w') as fout:
-            fout.write(
-                tpl.render(name=name, is_cip=is_cip, env_agents=env_agents))
+            try:
+                fout.write(
+                    tpl.render(name=name, is_cip=is_cip,
+                               env_agents=env_agents))
+            except:
+                log.error(exceptions.text_error_template().render())