[doc] Make URLs in prj.hjson files relative to the containing file

Paths to documentation content, such as the test plan, the design
specification, etc., were given in the ipname.prj.hjson file as relative
path, which was resolved relative to REPO_TOP. This makes IP blocks
non-relocateable.

With this PR the paths become relative to the file they are written in,
i.e. relative to the ipname.prj.hjson file. Absolute paths are resolved
absolute to REPO_TOP, effectively producing the previous behavior.

Signed-off-by: Philipp Wagner <phw@lowrisc.org>
diff --git a/hw/ip/aes/data/aes.prj.hjson b/hw/ip/aes/data/aes.prj.hjson
index 9b49d35..264a248 100644
--- a/hw/ip/aes/data/aes.prj.hjson
+++ b/hw/ip/aes/data/aes.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "aes",
-    design_spec:        "hw/ip/aes/doc",
-    dv_doc:             "hw/ip/aes/doc/dv",
-    hw_checklist:       "hw/ip/aes/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_aes",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_aes",
     version:            "1.0",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/alert_handler/data/alert_handler.prj.hjson b/hw/ip/alert_handler/data/alert_handler.prj.hjson
index 20f5f3d..916b133 100644
--- a/hw/ip/alert_handler/data/alert_handler.prj.hjson
+++ b/hw/ip/alert_handler/data/alert_handler.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "alert_handler",
-    design_spec:        "hw/ip/alert_handler/doc",
-    dv_doc:            "hw/ip/alert_handler/doc/dv",
-    hw_checklist:       "hw/ip/alert_handler/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_alert_handler"
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_alert_handler"
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/aon_timer/data/aon_timer.prj.hjson b/hw/ip/aon_timer/data/aon_timer.prj.hjson
index ef26b5c..d1f393d 100644
--- a/hw/ip/aon_timer/data/aon_timer.prj.hjson
+++ b/hw/ip/aon_timer/data/aon_timer.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "aon_timer",
-    design_spec:        "hw/ip/aon_timer/doc",
-    dv_doc:             "hw/ip/aon_timer/doc/dv",
-    hw_checklist:       "hw/ip/aon_timer/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_aon_timer",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_aon_timer",
     version:            "1.0",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/clkmgr/data/clkmgr.prj.hjson b/hw/ip/clkmgr/data/clkmgr.prj.hjson
index ecb2c3e..07e6637 100644
--- a/hw/ip/clkmgr/data/clkmgr.prj.hjson
+++ b/hw/ip/clkmgr/data/clkmgr.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "clkmgr",
-    design_spec:        "hw/ip/clkmgr/doc",
-    dv_doc:            "hw/top_earlgrey/doc/dv",
-    hw_checklist:       "hw/ip/clkmgr/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_clkmgr",
+    design_spec:        "../doc",
+    dv_doc:             "/hw/top_earlgrey/doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_clkmgr",
     revisions: [
       {
         version:            "0.1",
diff --git a/hw/ip/csrng/data/csrng.prj.hjson b/hw/ip/csrng/data/csrng.prj.hjson
index 2b5a291..c1e14a3 100644
--- a/hw/ip/csrng/data/csrng.prj.hjson
+++ b/hw/ip/csrng/data/csrng.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "csrng",
-    design_spec:        "hw/ip/csrng/doc",
-    dv_doc:            "hw/ip/csrng/doc/dv",
-    hw_checklist:       "hw/ip/csrng/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/dcd/data/dcd.prj.hjson b/hw/ip/dcd/data/dcd.prj.hjson
index e280d6b..f1b34ac 100644
--- a/hw/ip/dcd/data/dcd.prj.hjson
+++ b/hw/ip/dcd/data/dcd.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "dcd",
-    design_spec:        "hw/ip/dcd/doc",
-    dv_doc:             "hw/ip/dcd/doc/dv",
-    hw_checklist:       "hw/ip/dcd/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "1.0",
     life_stage:         "L1",
     design_stage:       "D0",
diff --git a/hw/ip/edn/data/edn.prj.hjson b/hw/ip/edn/data/edn.prj.hjson
index 192995d..33509bf 100644
--- a/hw/ip/edn/data/edn.prj.hjson
+++ b/hw/ip/edn/data/edn.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "edn",
-    design_spec:        "hw/ip/edn/doc",
-    dv_doc:            "hw/ip/edn/doc/dv",
-    hw_checklist:       "hw/ip/edn/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/entropy_src/data/entropy_src.prj.hjson b/hw/ip/entropy_src/data/entropy_src.prj.hjson
index 07b56dd..bda3a7c 100644
--- a/hw/ip/entropy_src/data/entropy_src.prj.hjson
+++ b/hw/ip/entropy_src/data/entropy_src.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "entropy_src",
-    design_spec:        "hw/ip/entropy_src/doc",
-    dv_doc:            "hw/ip/entropy_src/doc/dv",
-    hw_checklist:       "hw/ip/entropy_src/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.prj.hjson b/hw/ip/flash_ctrl/data/flash_ctrl.prj.hjson
index fff3b1a..eba7e17 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.prj.hjson
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "flash_ctrl",
-    design_spec:        "hw/ip/flash_ctrl/doc",
-    dv_doc:            "hw/ip/flash_ctrl/doc/dv"
-    hw_checklist:       "hw/ip/flash_ctrl/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv"
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/gpio/data/gpio.prj.hjson b/hw/ip/gpio/data/gpio.prj.hjson
index 1e761d5..55cdbcc 100644
--- a/hw/ip/gpio/data/gpio.prj.hjson
+++ b/hw/ip/gpio/data/gpio.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "gpio",
-    design_spec:        "hw/ip/gpio/doc",
-    dv_doc:            "hw/ip/gpio/doc/dv",
-    hw_checklist:       "hw/ip/gpio/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_gpio",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_gpio",
     revisions: [
       {
         version:            "1.0",
diff --git a/hw/ip/hmac/data/hmac.prj.hjson b/hw/ip/hmac/data/hmac.prj.hjson
index bc2f1ef..da3f629 100644
--- a/hw/ip/hmac/data/hmac.prj.hjson
+++ b/hw/ip/hmac/data/hmac.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "hmac",
-    design_spec:        "hw/ip/hmac/doc",
-    dv_doc:            "hw/ip/hmac/doc/dv",
-    hw_checklist:       "hw/ip/hmac/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_hmac",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_hmac",
     revisions: [
       {
         version:            "0.5",
diff --git a/hw/ip/i2c/data/i2c.prj.hjson b/hw/ip/i2c/data/i2c.prj.hjson
index b650755..ab9377e 100644
--- a/hw/ip/i2c/data/i2c.prj.hjson
+++ b/hw/ip/i2c/data/i2c.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "i2c",
-    design_spec:        "hw/ip/i2c/doc",
-    dv_doc:            "hw/ip/i2c/doc/dv",
-    hw_checklist:       "hw/ip/i2c/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_i2c",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_i2c",
     revisions: [
       {
         version:            "0.5",
diff --git a/hw/ip/keymgr/data/keymgr.prj.hjson b/hw/ip/keymgr/data/keymgr.prj.hjson
index 1ca30c8..e9432bf 100644
--- a/hw/ip/keymgr/data/keymgr.prj.hjson
+++ b/hw/ip/keymgr/data/keymgr.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "keymgr",
-    design_spec:        "hw/ip/keymgr/doc",
-    dv_doc:            "hw/ip/keymgr/doc/dv",
-    hw_checklist:       "hw/ip/keymgr/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     revisions: [
       {
         version:            "0.1",
diff --git a/hw/ip/kmac/data/kmac.prj.hjson b/hw/ip/kmac/data/kmac.prj.hjson
index 7eeb5c3..c87afcc 100644
--- a/hw/ip/kmac/data/kmac.prj.hjson
+++ b/hw/ip/kmac/data/kmac.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "kmac",
-    design_spec:        "hw/ip/kmac/doc",
-    dv_doc:            "hw/ip/kmac/doc/dv",
-    hw_checklist:       "hw/ip/kmac/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_kmac",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_kmac",
     revisions: [
       {
         version:            "1.0",
diff --git a/hw/ip/lc_ctrl/data/lc_ctrl.prj.hjson b/hw/ip/lc_ctrl/data/lc_ctrl.prj.hjson
index 8bad6a4..b36f1a8 100644
--- a/hw/ip/lc_ctrl/data/lc_ctrl.prj.hjson
+++ b/hw/ip/lc_ctrl/data/lc_ctrl.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "lc_ctrl",
-    design_spec:        "hw/ip/lc_ctrl/doc",
-    dv_doc:             "hw/ip/lc_ctrl/doc/dv",
-    hw_checklist:       "hw/ip/lc_ctrl/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "0.1",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/nmi_gen/data/nmi_gen.prj.hjson b/hw/ip/nmi_gen/data/nmi_gen.prj.hjson
index 9eff44c..dc13bbe 100644
--- a/hw/ip/nmi_gen/data/nmi_gen.prj.hjson
+++ b/hw/ip/nmi_gen/data/nmi_gen.prj.hjson
@@ -4,7 +4,7 @@
 
 {
     name:               "nmi_gen",
-    design_spec:        "hw/ip/nmi_gen/doc",
+    design_spec:        "../doc",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D0",
diff --git a/hw/ip/otbn/data/otbn.prj.hjson b/hw/ip/otbn/data/otbn.prj.hjson
index accf8dd..ebdfd4f 100644
--- a/hw/ip/otbn/data/otbn.prj.hjson
+++ b/hw/ip/otbn/data/otbn.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "otbn",
-    design_spec:        "hw/ip/otbn/doc",
-//    dv_doc:            "hw/ip/otbn/doc/dv",
-    hw_checklist:       "hw/ip/otbn/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_otbn"
+    design_spec:        "../doc",
+//    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_otbn"
     version:            "0.1",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/otp_ctrl/data/otp_ctrl.prj.hjson b/hw/ip/otp_ctrl/data/otp_ctrl.prj.hjson
index da40131..2c8a487 100644
--- a/hw/ip/otp_ctrl/data/otp_ctrl.prj.hjson
+++ b/hw/ip/otp_ctrl/data/otp_ctrl.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "otp_ctrl",
-    design_spec:        "hw/ip/otp_ctrl/doc",
-    dv_doc:             "hw/ip/otp_ctrl/doc/dv",
-    hw_checklist:       "hw/ip/otp_ctrl/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_otp_ctrl",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_otp_ctrl",
     version:            "0.1",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/pattgen/data/pattgen.prj.hjson b/hw/ip/pattgen/data/pattgen.prj.hjson
index cca1d62..093e7e1 100644
--- a/hw/ip/pattgen/data/pattgen.prj.hjson
+++ b/hw/ip/pattgen/data/pattgen.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "pattgen",
-    design_spec:        "hw/ip/pattgen/doc",
-    dv_doc:            "hw/ip/pattgen/doc/dv",
-    hw_checklist:       "hw/ip/pattgen/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     revisions: [
       {
         version:            "1.0",
diff --git a/hw/ip/pinmux/data/pinmux.prj.hjson b/hw/ip/pinmux/data/pinmux.prj.hjson
index f7f8b19..2777324 100644
--- a/hw/ip/pinmux/data/pinmux.prj.hjson
+++ b/hw/ip/pinmux/data/pinmux.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "pinmux",
-    design_spec:        "hw/ip/pinmux/doc",
-    dv_doc:            "hw/ip/pinmux/doc/dv",
-    hw_checklist:       "hw/ip/pinmux/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/hw/ip/pwrmgr/data/pwrmgr.prj.hjson b/hw/ip/pwrmgr/data/pwrmgr.prj.hjson
index e5ea1d7..641ead2 100644
--- a/hw/ip/pwrmgr/data/pwrmgr.prj.hjson
+++ b/hw/ip/pwrmgr/data/pwrmgr.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "pwrmgr",
-    design_spec:        "hw/ip/pwrmgr/doc",
-    dv_doc:            "hw/top_earlgrey/doc/dv",
-    hw_checklist:       "hw/ip/pwrmgr/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_pwrmgr",
+    design_spec:        "../doc",
+    dv_doc:             "/hw/top_earlgrey/doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_pwrmgr",
     revisions: [
       {
         version:            "0.1",
diff --git a/hw/ip/rbox/data/rbox.prj.hjson b/hw/ip/rbox/data/rbox.prj.hjson
index b229752..1746eec 100644
--- a/hw/ip/rbox/data/rbox.prj.hjson
+++ b/hw/ip/rbox/data/rbox.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "rbox",
-    design_spec:        "hw/ip/rbox/doc",
-    dv_doc:             "hw/ip/rbox/doc/dv",
-    hw_checklist:       "hw/ip/rbox/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     version:            "1.0",
     life_stage:         "L1",
     design_stage:       "D0",
diff --git a/hw/ip/rstmgr/data/rstmgr.prj.hjson b/hw/ip/rstmgr/data/rstmgr.prj.hjson
index ced42a1..71c02c2 100644
--- a/hw/ip/rstmgr/data/rstmgr.prj.hjson
+++ b/hw/ip/rstmgr/data/rstmgr.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "rstmgr",
-    design_spec:        "hw/ip/rstmgr/doc",
-    dv_doc:            "hw/top_earlgrey/doc/dv",
-    hw_checklist:       "hw/ip/rstmgr/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_rstmgr",
+    design_spec:        "../doc",
+    dv_doc:             "/hw/top_earlgrey/doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_rstmgr",
     revisions: [
       {
         version:            "0.1",
diff --git a/hw/ip/rv_core_ibex/data/rv_core_ibex.prj.hjson b/hw/ip/rv_core_ibex/data/rv_core_ibex.prj.hjson
index eb81d4a..703143b 100644
--- a/hw/ip/rv_core_ibex/data/rv_core_ibex.prj.hjson
+++ b/hw/ip/rv_core_ibex/data/rv_core_ibex.prj.hjson
@@ -4,8 +4,8 @@
 
 {
     name:               "rv_core_ibex",
-    design_spec:        "hw/ip/rv_core_ibex/doc",
-    hw_checklist:       "hw/ip/rv_core_ibex/doc/checklist",
+    design_spec:        "../doc",
+    hw_checklist:       "../doc/checklist",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D2",
diff --git a/hw/ip/rv_dm/data/rv_dm.prj.hjson b/hw/ip/rv_dm/data/rv_dm.prj.hjson
index 72f5b30..6d52555 100644
--- a/hw/ip/rv_dm/data/rv_dm.prj.hjson
+++ b/hw/ip/rv_dm/data/rv_dm.prj.hjson
@@ -4,7 +4,7 @@
 
 {
     name:               "rv_dm",
-    design_spec:        "hw/ip/rv_dm/doc",
+    design_spec:        "../doc",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D0",
diff --git a/hw/ip/rv_plic/data/rv_plic.prj.hjson b/hw/ip/rv_plic/data/rv_plic.prj.hjson
index 6e51034..50a896a 100644
--- a/hw/ip/rv_plic/data/rv_plic.prj.hjson
+++ b/hw/ip/rv_plic/data/rv_plic.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "rv_plic",
-    design_spec:        "hw/ip/rv_plic/doc",
-    dv_doc:            "hw/ip/rv_plic/doc/dv",
-    hw_checklist:       "hw/ip/rv_plic/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_plic",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_plic",
     revisions: [
       {
         version:            "0.5",
diff --git a/hw/ip/rv_timer/data/rv_timer.prj.hjson b/hw/ip/rv_timer/data/rv_timer.prj.hjson
index 9aa4fbc..e875f2f 100644
--- a/hw/ip/rv_timer/data/rv_timer.prj.hjson
+++ b/hw/ip/rv_timer/data/rv_timer.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "rv_timer",
-    design_spec:        "hw/ip/rv_timer/doc",
-    dv_doc:             "hw/ip/rv_timer/doc/dv",
-    hw_checklist:       "hw/ip/rv_timer/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     sw_checklist:       "sw/device/lib/dif/dif_rv_timer",
     revisions: [
       {
diff --git a/hw/ip/spi_device/data/spi_device.prj.hjson b/hw/ip/spi_device/data/spi_device.prj.hjson
index 803a572..82ac834 100644
--- a/hw/ip/spi_device/data/spi_device.prj.hjson
+++ b/hw/ip/spi_device/data/spi_device.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "spi_device",
-    design_spec:        "hw/ip/spi_device/doc",
-    dv_doc:            "hw/ip/spi_device/doc/dv",
-    hw_checklist:       "hw/ip/spi_device/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_spi_device",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_spi_device",
     revisions: [
       {
         version:            "0.5",
diff --git a/hw/ip/spi_host/data/spi_host.prj.hjson b/hw/ip/spi_host/data/spi_host.prj.hjson
index 236114e..91af91f 100644
--- a/hw/ip/spi_host/data/spi_host.prj.hjson
+++ b/hw/ip/spi_host/data/spi_host.prj.hjson
@@ -4,19 +4,14 @@
 
 {
     name:               "spi_host",
-    design_spec:        "",
-    dv_doc:            "",
-    hw_checklist:       "",
-    sw_checklist:       "",
+    design_spec:        "../doc",
     revisions: [
       {
         version:            "0.5",
         life_stage:         "L0",
         design_stage:       "D0",
-        verification_stage: "",
-        dif_stage:          "",
-        commit_id:          "",
-        notes:              ""
+        verification_stage: "V0",
+        dif_stage:          "S0",
       }
     ]
 }
diff --git a/hw/ip/sram_ctrl/data/sram_ctrl.prj.hjson b/hw/ip/sram_ctrl/data/sram_ctrl.prj.hjson
index 70c3625..4873bd4 100644
--- a/hw/ip/sram_ctrl/data/sram_ctrl.prj.hjson
+++ b/hw/ip/sram_ctrl/data/sram_ctrl.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "sram_ctrl",
-    design_spec:        "hw/ip/sram_ctrl/doc",
-    dv_doc:             "hw/ip/sram_ctrl/doc/dv",
-    hw_checklist:       "hw/ip/sram_ctrl/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
     sw_checklist:       "",
     version:            "0.1",
     life_stage:         "L1",
diff --git a/hw/ip/tlul/data/tlul.prj.hjson b/hw/ip/tlul/data/tlul.prj.hjson
index 154b41a..4583304 100644
--- a/hw/ip/tlul/data/tlul.prj.hjson
+++ b/hw/ip/tlul/data/tlul.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "tlul",
-    design_spec:        "hw/ip/tlul/doc",
-    dv_doc:            "hw/ip/tlul/doc/dv",
-    hw_checklist:       "hw/top_earlgrey/ip/xbar/doc/checklist",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "/hw/top_earlgrey/ip/xbar/doc/checklist",
     revisions: [
       {
         version:            "0.5",
diff --git a/hw/ip/uart/data/uart.prj.hjson b/hw/ip/uart/data/uart.prj.hjson
index 0cea43a..9387fbf 100644
--- a/hw/ip/uart/data/uart.prj.hjson
+++ b/hw/ip/uart/data/uart.prj.hjson
@@ -4,10 +4,10 @@
 
 {
     name:               "uart",
-    design_spec:        "hw/ip/uart/doc",
-    dv_doc:            "hw/ip/uart/doc/dv",
-    hw_checklist:       "hw/ip/uart/doc/checklist",
-    sw_checklist:       "sw/device/lib/dif/dif_uart",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    hw_checklist:       "../doc/checklist",
+    sw_checklist:       "/sw/device/lib/dif/dif_uart",
     revisions: [
       {
         version:            "1.0",
diff --git a/hw/ip/usbdev/data/usbdev.prj.hjson b/hw/ip/usbdev/data/usbdev.prj.hjson
index a2b753d..7fc78b7 100644
--- a/hw/ip/usbdev/data/usbdev.prj.hjson
+++ b/hw/ip/usbdev/data/usbdev.prj.hjson
@@ -4,9 +4,9 @@
 
 {
     name:               "usbdev",
-    design_spec:        "hw/ip/usbdev/doc",
-    dv_doc:            "hw/ip/usbdev/doc/dv",
-    sw_checklist:       "sw/device/lib/dif/dif_usbdev",
+    design_spec:        "../doc",
+    dv_doc:             "../doc/dv",
+    sw_checklist:       "/sw/device/lib/dif/dif_usbdev",
     version:            "0.5",
     life_stage:         "L1",
     design_stage:       "D1",
diff --git a/util/dashboard/gen_dashboard_entry.py b/util/dashboard/gen_dashboard_entry.py
index 89717d6..7734c55 100644
--- a/util/dashboard/gen_dashboard_entry.py
+++ b/util/dashboard/gen_dashboard_entry.py
@@ -10,11 +10,14 @@
 import os.path
 import re
 import sys
+from pathlib import Path
 
 import dashboard.dashboard_validate as dashboard_validate
 import hjson
 import mistletoe as mk
 
+REPO_TOP = Path(__file__).parent.parent.parent.resolve().absolute()
+
 
 def genout(outfile, msg):
     outfile.write(msg)
@@ -42,21 +45,29 @@
     'S3': 'Stable',
 }
 
-# TODO: This is relative to the dashboard, which is currently located at
-# hw/_index.md.
-docs_server = "../.."
-
 
 def convert_stage(stagestr):
     return STAGE_STRINGS.get(stagestr, "UNKNOWN")
 
+def get_doc_url(base, url):
+    """ Produce a URL to a document.
+
+    Relative `url`s are relative to `base`, absolute `url`s are relative to the
+    repository root.
+    """
+    assert isinstance(url, str) and len(url) > 0
+    if url[0] == '/':
+        return url
+    else:
+        return '/' + base + '/' + url
+
 
 # Link module name with its design spec doc.
 def get_linked_design_spec(obj):
     result = ""
-    if 'design_spec' in obj.keys():
-        url = docs_server + "/" + html.escape(obj['design_spec'])
-        result = "<span title='Design Spec'><a href='{}'>".format(url)
+    if 'design_spec' in obj:
+        result = "<span title='Design Spec'><a href='{}'>".format(
+            get_doc_url(obj['_ip_desc_hjson_dir'], obj['design_spec']))
         result += "<code>{}</code></a></span>".format(html.escape(obj['name']))
     else:
         result = html.escape(obj['name'])
@@ -66,9 +77,9 @@
 
 # Provide the link to the DV plan.
 def get_linked_dv_plan(obj):
-    if 'dv_doc' in obj.keys():
-        url = docs_server + "/" + html.escape(obj['dv_doc'])
-        return "<span title='DV Document'><a href=\"{}\">DV</a></span>".format(url)
+    if 'dv_doc' in obj:
+        return "<span title='DV Document'><a href=\"{}\">DV</a></span>".format(
+            get_doc_url(obj['_ip_desc_hjson_dir'], obj['dv_doc']))
     else:
         return ""
 
@@ -102,8 +113,8 @@
         url = "https://github.com/lowrisc/opentitan/tree/{}/{}.md{}".format(
             rev['commit_id'], obj['hw_checklist'], in_page_ref)
     elif 'hw_checklist' in obj:
-        url = "{}/{}{}".format(docs_server, html.escape(obj['hw_checklist']),
-                               in_page_ref)
+        url = get_doc_url(obj['_ip_desc_hjson_dir'],
+                          obj['hw_checklist'] + in_page_ref)
     else:
         # There is no checklist available, so point to the template.
         # doc/project/hw_checklist.md.tpl is a symlink to ip_checklist.md.tpl,
@@ -135,8 +146,8 @@
         url = "https://github.com/lowrisc/opentitan/tree/{}/{}.md{}".format(
             rev['commit_id'], obj['sw_checklist'], in_page_ref)
     elif 'sw_checklist' in obj:
-        url = "{}/{}{}".format(docs_server, html.escape(obj['sw_checklist']),
-                               in_page_ref)
+        url = get_doc_url(obj['_ip_desc_hjson_dir'],
+                          obj['sw_checklist'] + in_page_ref)
     else:
         # There is no checklist available, so point to the template.
         url = "https://github.com/lowrisc/opentitan/tree/master/"
@@ -200,6 +211,9 @@
     else:
         log.fail("hjson file import failed\n")
 
+    ip_desc_hjson_dir = hjson_path.parent.relative_to(REPO_TOP)
+    obj['_ip_desc_hjson_dir'] = str(ip_desc_hjson_dir)
+
     # If `revisions` field doesn't exist, the tool assumes the Hjson
     # as the previous project format, which has only one version entry.
     if "revisions" not in obj: