Merge "Add an interactive verilator test for hello_world"
diff --git a/hw/BUILD b/hw/BUILD
index ef96f16..ff9c76c 100644
--- a/hw/BUILD
+++ b/hw/BUILD
@@ -8,7 +8,6 @@
package(default_visibility = ["//visibility:public"])
-
# This configuration exposes fusesoc's "make_options" to enable parallel
# compilation of the verilated model.
string_list_flag(
@@ -41,6 +40,12 @@
target = "sim",
)
+filegroup(
+ name = "verilator_bin",
+ srcs = [":verilator_real"],
+ output_group = "binary",
+)
+
# This is used in CI steps that do not want to run Verilator tests, and thus
# do not want to accidentally build the Verilator model. This causes the
# //hw:verilator target to not emit any files, which will break any tests that
@@ -67,7 +72,7 @@
name = "verilator",
actual = select({
":disable_verilator_build": ":verilator_stub",
- "//conditions:default": ":verilator_real",
+ "//conditions:default": ":verilator_bin",
}),
tags = ["verilator"],
visibility = ["//visibility:public"],
diff --git a/rules/matcha_test.bzl b/rules/matcha_test.bzl
index 5d791bf..da5e54d 100644
--- a/rules/matcha_test.bzl
+++ b/rules/matcha_test.bzl
@@ -56,7 +56,7 @@
sh_test_tags = ["verilator"] + tags
sh_test_runner = "@//util:run_chip_verilator_sim.sh"
sh_test_args = [
- "$(locations %s)" % (verilator_testbench),
+ "$(location %s)" % (verilator_testbench),
"$(location %s)" % (rom_img),
"$(location %s)" % (sec_verilator_binary),
"$(location %s)" % (otp_img),
diff --git a/sw/device/examples/hello_world/BUILD b/sw/device/examples/hello_world/BUILD
index 00ddb67..fa9fce8 100644
--- a/sw/device/examples/hello_world/BUILD
+++ b/sw/device/examples/hello_world/BUILD
@@ -42,3 +42,26 @@
"@lowrisc_opentitan//sw/device/silicon_creator/lib:manifest_def",
],
)
+
+# Use shell test to run the interactive verilator test on UART and GPIO
+sh_test(
+ name = "verilator_hello_world_test",
+ timeout = "long",
+ srcs = [":run_verilator_hello_world.sh"],
+ args = [
+ "$(location //hw:verilator)",
+ "$(location //sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem)",
+ "$(location :hello_world_sim_verilator_vmem)",
+ "$(location //hw/top_matcha/data:otp_img_rma)",
+ ],
+ data = [
+ ":hello_world_sim_verilator_vmem",
+ ":hello_world_test_expected_gpio.txt",
+ "//hw:verilator",
+ "//hw/top_matcha/data:otp_img_rma",
+ "//sw/device/lib/testing/test_rom:test_rom_sim_verilator_scr_vmem",
+ ],
+ tags = [
+ "verilator",
+ ],
+)
diff --git a/sw/device/examples/hello_world/hello_world_test_expected_gpio.txt b/sw/device/examples/hello_world/hello_world_test_expected_gpio.txt
new file mode 100644
index 0000000..4617c93
--- /dev/null
+++ b/sw/device/examples/hello_world/hello_world_test_expected_gpio.txt
@@ -0,0 +1,16 @@
+XXXXXXXXXXXXXXXX1111111111111111
+XXXXXXXXXXXXXXXX0000000000000000
+XXXXXXXXXXXXXXXX0110110001101100
+XXXXXXXXXXXXXXXX0110010101100101
+XXXXXXXXXXXXXXXX0110010001100100
+XXXXXXXXXXXXXXXX0010000000100000
+XXXXXXXXXXXXXXXX0110011101100111
+XXXXXXXXXXXXXXXX0111000001110000
+XXXXXXXXXXXXXXXX0110100101101001
+XXXXXXXXXXXXXXXX0110111101101111
+XXXXXXXXXXXXXXXX0010000000100000
+XXXXXXXXXXXXXXXX0111010001110100
+XXXXXXXXXXXXXXXX0110010101100101
+XXXXXXXXXXXXXXXX0111001101110011
+XXXXXXXXXXXXXXXX0111010001110100
+XXXXXXXXXXXXXXXX0000101000001010
diff --git a/sw/device/examples/hello_world/run_verilator_hello_world.sh b/sw/device/examples/hello_world/run_verilator_hello_world.sh
new file mode 100755
index 0000000..932dbdd
--- /dev/null
+++ b/sw/device/examples/hello_world/run_verilator_hello_world.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+#
+# Copyright 2023 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Run verilator interactive simulation on sw/device/examples/hello_world.
+
+function print_usage(
+ echo "Usage: run_verilator_hello_world.sh <verilator testbench> <rom binary> <flash binary> <otp binary>"
+)
+
+if [[ $1 == "--help" ]]; then
+ print_usage
+ exit 0
+fi
+
+if [[ $# -ne 4 ]]; then
+ print_usage
+ exit 1
+fi
+
+if [[ -z ${TEST_UNDECLARED_OUTPUTS_DIR} ]]; then
+ echo "The script only works under bazel test"
+ exit 1
+fi
+
+
+TEST_CYCLES=650000
+
+VCHIP_TB=$1
+ROM_BIN=$2
+FLASH_BIN=$3
+OTP_BIN=$4
+
+if [[ ! -f $(realpath ${VCHIP_TB}) ]]; then
+ echo "Verilator testbench not found. Please make sure //hw:verilator is in data."
+ exit 1
+fi
+
+if [[ ! -f $(realpath ${ROM_BIN}) ]] || [[ ! -f $(realpath ${FLASH_BIN}) ]] ||
+ [[ ! -f $(realpath ${OTP_BIN}) ]]; then
+ echo "Software binaries not found. Please make sure the targets are in data and args."
+ exit 1
+fi
+
+# Run verilator testbench in the background
+${VCHIP_TB} \
+ "--meminit=rom,${ROM_BIN}" \
+ "--meminit=flash,${FLASH_BIN}" \
+ "--meminit=otp,${OTP_BIN}" -c "${TEST_CYCLES}" &
+
+VERILATOR_PID=$!
+
+# Pipe GPIO output to a log file
+sleep 5
+cat gpio0-read | tee "${TEST_UNDECLARED_OUTPUTS_DIR}/gpio0_read.log" &
+
+# Wait for 300s to reach the end of the hello_world initialization.
+sleep 300
+echo 'led gpio test' > "${TEST_UNDECLARED_OUTPUTS_DIR}/uart0_device"
+
+# Wait up to another 350s to complete the verilator simulation.
+timeout 350 tail --pid=${VERILATOR_PID} -f /dev/null
+
+# Check results in GPIO and UART logs.
+cat "${TEST_UNDECLARED_OUTPUTS_DIR}/uart0.log" | grep -q "led gpio test" || exit 1
+
+diff -q "${TEST_UNDECLARED_OUTPUTS_DIR}/gpio0_read.log" \
+ "sw/device/examples/hello_world/hello_world_test_expected_gpio.txt" || exit 1
diff --git a/sw/device/tests/BUILD b/sw/device/tests/BUILD
index b096765..c7df613 100644
--- a/sw/device/tests/BUILD
+++ b/sw/device/tests/BUILD
@@ -577,6 +577,7 @@
"verilator_supervisor_mode_test",
"verilator_tlul_mailbox_test",
"verilator_virtual_memory_test",
+ "//sw/device/examples/hello_world:verilator_hello_world_test",
"//sw/device/tests/smc:verilator_kelvin_checksum_test",
"//sw/device/tests/smc:verilator_kelvin_hello_test",
"//sw/device/tests/smc:verilator_ml_top_irq_test",
diff --git a/util/run_chip_verilator_sim.sh b/util/run_chip_verilator_sim.sh
index 6358763..7819142 100755
--- a/util/run_chip_verilator_sim.sh
+++ b/util/run_chip_verilator_sim.sh
@@ -21,12 +21,6 @@
exit 0
fi
-# In bazel build the verilator target has multiple outputs, so we need to trim
-# the non-executable one.
-while [[ $1 != *"Vchip_sim_tb" ]]; do
- shift 1
-done
-
VCHIP_TB=$1
ROM_BIN=$2
FLASH_BIN=$3