[bazel] Add functest that uses OTP-spliced bitstream

Add a new CW310-specific functest:
//sw/device/silicon_creator/mask_rom:e2e_bootup_success_otp_dev.

This new functest uses //hw/bitstream:mask_rom_otp_dev, which is the
Mask ROM bitstream after splicing in the OTP Dev image, replacing the
OTP RMA image.

Signed-off-by: Dan McArdle <dmcardle@google.com>
diff --git a/hw/bitstream/BUILD b/hw/bitstream/BUILD
index 9e68538..16d9ee9 100644
--- a/hw/bitstream/BUILD
+++ b/hw/bitstream/BUILD
@@ -62,3 +62,12 @@
         "//conditions:default": ["@bitstreams//:bitstream_mask_rom"],
     }),
 )
+
+# TODO(lowRISC/opentitan#13603): Use `select` once we're uploading these
+# artifacts to GCP.
+filegroup(
+    name = "mask_rom_otp_dev",
+    srcs = [
+        "//hw/bitstream/vivado:fpga_cw310_mask_rom_otp_dev",
+    ],
+)
diff --git a/sw/device/silicon_creator/mask_rom/BUILD b/sw/device/silicon_creator/mask_rom/BUILD
index 1a50157..6029f42 100644
--- a/sw/device/silicon_creator/mask_rom/BUILD
+++ b/sw/device/silicon_creator/mask_rom/BUILD
@@ -332,6 +332,27 @@
     ],
 )
 
+# Same as `:e2e_bootup_success`, but the Dev OTP image is spliced into the
+# bitstream before it's sent to the CW310 FPGA.
+opentitan_functest(
+    name = "e2e_bootup_success_otp_dev",
+    srcs = ["mask_rom_test.c"],
+    cw310 = cw310_params(
+        bitstream = "//hw/bitstream:mask_rom_otp_dev",
+        exit_failure = BOOT_FAILURE_MSG,
+        exit_success = BOOT_SUCCESS_MSG,
+        # TODO(lowRISC/opentitan#13603): Remove this "manual" tag when the
+        # bitstream target can fetch pre-spliced bitstream from GCP.
+        tags = ["manual"],
+    ),
+    manifest = "//sw/device/silicon_creator/rom_ext:manifest_standard",
+    signed = True,
+    targets = ["cw310"],
+    deps = [
+        "//sw/device/lib/testing/test_framework:ottf_main",
+    ],
+)
+
 opentitan_functest(
     name = "e2e_bootup_no_rom_ext_signature",
     srcs = ["mask_rom_test.c"],