Add a verilator test to test hello_world gpio-write function The test is not part of the presubmit suite because its timing is really tricky to tune. The test is mainly used as a local test and show the gpio-write usage. Change-Id: Ie10d8f45926830439d930710978790506f8fb6a5
diff --git a/sw/device/examples/hello_world/BUILD b/sw/device/examples/hello_world/BUILD index fa9fce8..e6d7f3a 100644 --- a/sw/device/examples/hello_world/BUILD +++ b/sw/device/examples/hello_world/BUILD
@@ -65,3 +65,25 @@ "verilator", ], ) + +sh_test( + name = "verilator_hello_world_gpio_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)", + "gpio_test", + ], + data = [ + ":hello_world_sim_verilator_vmem", + "//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.c b/sw/device/examples/hello_world/hello_world.c index 216178b..577e7c5 100644 --- a/sw/device/examples/hello_world/hello_world.c +++ b/sw/device/examples/hello_world/hello_world.c
@@ -107,7 +107,11 @@ // Now have UART <-> Buttons/LEDs demo // all LEDs off CHECK_DIF_OK(dif_gpio_write_all(&gpio, 0x0000)); - LOG_INFO("Try out the switches on the board"); + if (kDeviceType == kDeviceFpgaNexus) { + LOG_INFO("Try out the switches on the board"); + } else if (kDeviceType == kDeviceSimVerilator) { + LOG_INFO("Try out the GPIO switches 28, 29, 31"); + } LOG_INFO("or type anything into the console window."); LOG_INFO( "The LEDs show the bits of the ASCII code of the last "
diff --git a/sw/device/examples/hello_world/run_verilator_hello_world.sh b/sw/device/examples/hello_world/run_verilator_hello_world.sh index e85af45..e220a8a 100755 --- a/sw/device/examples/hello_world/run_verilator_hello_world.sh +++ b/sw/device/examples/hello_world/run_verilator_hello_world.sh
@@ -17,7 +17,7 @@ # 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>" + echo "Usage: run_verilator_hello_world.sh <verilator testbench> <rom binary> <flash binary> <otp binary> [gpio_test]" } if [[ $1 == "--help" ]]; then @@ -25,7 +25,7 @@ exit 0 fi -if [[ $# -ne 4 ]]; then +if [[ $# -lt 4 ]]; then print_usage exit 1 fi @@ -35,8 +35,16 @@ exit 1 fi +# This cycle count is tuned so we don't need to wait too long for the test to +# finish. +TEST_CYCLES=700000 -TEST_CYCLES=650000 +GPIO_TEST=0 + +if [[ $# -eq 5 ]] && [[ $5 == "gpio_test" ]]; then + GPIO_TEST=1 + TEST_CYCLES=900000 +fi VCHIP_TB=$1 ROM_BIN=$2 @@ -62,19 +70,37 @@ VERILATOR_PID=$! -# Pipe GPIO output to a log file -sleep 5 -cat gpio0-read | tee "${TEST_UNDECLARED_OUTPUTS_DIR}/gpio0_read.log" & +if (( ${GPIO_TEST} == 0 )); then + # 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 for 300s to reach the end of the hello_world initialization. + # Note: The value is tuned for the CICD to run. For local failing tests, + # consider to reduce the wait or increase the TEST_CYCLES. + 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 + 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 + # 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 -q "${TEST_UNDECLARED_OUTPUTS_DIR}/gpio0_read.log" \ + "sw/device/examples/hello_world/hello_world_test_expected_gpio.txt" || exit 1 +else + # Wait for 260s to reach the end of the hello_world initialization. + # Note: This value may need to tuned by the machine performance. Need to + # reduce the wait if the verilator simulation is fast (or increase the + # TEST_CYCLES variable). + sleep 260 + echo 'h28 h29 h31' > gpio0-write + + tail --pid=${VERILATOR_PID} -f /dev/null + + # Check GPIO toggle result in the UART log + for switch in "9" "10" "11"; do + cat "${TEST_UNDECLARED_OUTPUTS_DIR}/uart0.log" | \ + grep -q "GPIO switch #${switch} changed to 1" || exit 1 + done +fi