GPIO Pulse Before Benchmark Run Edit kelvin benchmark to set GPIO high for duration of benchmark This can be used to synchronize/ trim kibble power measurements to the approximate duration of a benchmark test. Change-Id: I04480f49cf700cc39405080ff491fab81b269ef4
diff --git a/benchmarks/benchmark_sec.c b/benchmarks/benchmark_sec.c index 251bd08..be05531 100644 --- a/benchmarks/benchmark_sec.c +++ b/benchmarks/benchmark_sec.c
@@ -20,6 +20,7 @@ #include "sw/device/lib/dif/dif_pinmux.h" #include "sw/device/lib/dif/dif_rv_plic.h" #include "sw/device/lib/dif/dif_smc_ctrl.h" +#include "sw/device/lib/dif/dif_tlul_mailbox.h" #include "sw/device/lib/dif/dif_uart.h" #include "sw/device/lib/runtime/hart.h" #include "sw/device/lib/runtime/irq.h" @@ -31,6 +32,8 @@ #define STRINGIZE(x) #x #define STR(x) STRINGIZE(x) +#define TRIGGER_GPIO 16 + // In order to include the model data generate from Bazel, include the header // using the name passed as a macro. For some reason this binary (vs Kelvin) // adds space when concatinating so use the model format -smc_bin.h. @@ -39,12 +42,41 @@ #define SMC_BINARY STR(SMC_BINARY_DIRECTORY/BENCHMARK_NAME-SMC_BINARY_TYPE) #include SMC_BINARY +static dif_gpio_t gpio; +static dif_rv_plic_t plic_sec; +static dif_tlul_mailbox_t tlul_mailbox; static dif_pinmux_t pinmux; static dif_smc_ctrl_t smc_ctrl; static dif_uart_t uart; OTTF_DEFINE_TEST_CONFIG(); +void ottf_external_isr(void) { + uint32_t rx; + dif_rv_plic_irq_id_t plic_irq_id; + + CHECK_DIF_OK(dif_rv_plic_irq_claim(&plic_sec, kTopMatchaPlicTargetIbex0, + &plic_irq_id)); + top_matcha_plic_peripheral_t peripheral_id = + top_matcha_plic_interrupt_for_peripheral[plic_irq_id]; + + switch (peripheral_id) { + case kTopMatchaPlicPeripheralTlulMailboxSec: { + CHECK_DIF_OK(dif_tlul_mailbox_irq_acknowledge(&tlul_mailbox, + kDifTlulMailboxIrqRtirq)); + CHECK_DIF_OK(dif_tlul_mailbox_read_message(&tlul_mailbox, &rx)); + CHECK_DIF_OK(dif_gpio_write(&gpio, TRIGGER_GPIO, rx)); + break; + } + default: + LOG_FATAL("Unhandled interrupt"); + break; + } + + CHECK_DIF_OK(dif_rv_plic_irq_complete(&plic_sec, kTopMatchaPlicTargetIbex0, + plic_irq_id)); +} + void _ottf_main(void) { // Initialize the UART to enable logging for non-DV simulation platforms. if (kDeviceType != kDeviceSimDV) { @@ -56,6 +88,19 @@ CHECK_DIF_OK(dif_smc_ctrl_init( mmio_region_from_addr(TOP_MATCHA_SMC_CTRL_BASE_ADDR), &smc_ctrl)); +// PinMux: J52.5 for Sparrow (IOR7) :: PMOD3.7 on Nexus (IOD4) +#if defined(MATCHA_SPARROW) + CHECK_DIF_OK(dif_pinmux_output_select(&pinmux, kTopMatchaPinmuxMioOutIor7, + kTopMatchaPinmuxOutselGpioGpio16)); +#else + CHECK_DIF_OK(dif_pinmux_output_select(&pinmux, kTopMatchaPinmuxMioOutIod4, + kTopMatchaPinmuxOutselGpioGpio16)); +#endif + CHECK_DIF_OK( + dif_gpio_init(mmio_region_from_addr(TOP_MATCHA_GPIO_BASE_ADDR), &gpio)); + CHECK_DIF_OK( + dif_gpio_output_set_enabled(&gpio, TRIGGER_GPIO, kDifToggleEnabled)); + LOG_INFO("Loading Kelvin binary"); spi_flash_init(); CHECK_DIF_OK(load_file_from_tar( @@ -66,6 +111,24 @@ LOG_INFO("Loading SMC binary"); memcpy((void*)TOP_MATCHA_RAM_SMC_BASE_ADDR, smc_bin, smc_bin_len); } + + // Enable Mailbox Interrupt + CHECK_DIF_OK(dif_tlul_mailbox_init( + mmio_region_from_addr(TOP_MATCHA_TLUL_MAILBOX_SEC_BASE_ADDR), + &tlul_mailbox)); + CHECK_DIF_OK(dif_tlul_mailbox_irq_set_enabled( + &tlul_mailbox, kDifTlulMailboxIrqRtirq, kDifToggleEnabled)); + + CHECK_DIF_OK(dif_rv_plic_init( + mmio_region_from_addr(TOP_MATCHA_RV_PLIC_BASE_ADDR), &plic_sec)); + CHECK_DIF_OK(dif_rv_plic_irq_set_enabled( + &plic_sec, kTopMatchaPlicIrqIdTlulMailboxSecRtirq, + kTopMatchaPlicTargetIbex0, kDifToggleEnabled)); + CHECK_DIF_OK(dif_rv_plic_irq_set_priority( + &plic_sec, kTopMatchaPlicIrqIdTlulMailboxSecRtirq, 1)); + irq_global_ctrl(true); + irq_external_ctrl(true); + CHECK_DIF_OK(dif_smc_ctrl_set_en(&smc_ctrl)); irq_global_ctrl(true); irq_external_ctrl(true);
diff --git a/benchmarks/benchmark_smc.c b/benchmarks/benchmark_smc.c index ca0c1f6..887f00c 100644 --- a/benchmarks/benchmark_smc.c +++ b/benchmarks/benchmark_smc.c
@@ -23,6 +23,7 @@ #include "sw/device/lib/dif/dif_ml_top.h" #include "sw/device/lib/dif/dif_rv_plic.h" #include "sw/device/lib/dif/dif_rv_timer.h" +#include "sw/device/lib/dif/dif_tlul_mailbox.h" #include "sw/device/lib/runtime/hart.h" #include "sw/device/lib/runtime/irq.h" #include "sw/device/lib/runtime/log.h" @@ -41,6 +42,7 @@ static dif_rv_timer_t rv_timer; static dif_uart_t smc_uart; static dif_ml_top_t ml_top; +static dif_tlul_mailbox_t tlul_mailbox; volatile bool ml_top_finish_done = false; @@ -113,9 +115,18 @@ irq_global_ctrl(true); irq_external_ctrl(true); + // Configure Mailbox. + CHECK_DIF_OK(dif_tlul_mailbox_init( + mmio_region_from_addr(TOP_MATCHA_TLUL_MAILBOX_SMC_BASE_ADDR), + &tlul_mailbox)); + { + uint32_t msg = 1; + CHECK_DIF_OK(dif_tlul_mailbox_send_message(&tlul_mailbox, &msg)); + } + LOG_INFO("========== Begin Benchmark (%s) ==========", STR(BENCHMARK_NAME)); - // start kelvin + // start kelvin and pulse GPIO for data logger (Kibble) ml_top_finish_done = false; uint64_t timer_start; CHECK_DIF_OK(dif_rv_timer_counter_read(&rv_timer, 0, &timer_start)); @@ -142,6 +153,13 @@ uint64_t average_cycles = udiv64_slow(cycles, iterations, NULL); uint64_t wall_time_us = timer_finish - timer_start; uint64_t average_wall_time_us = udiv64_slow(wall_time_us, iterations, NULL); + + // End Test Pulse + { + uint32_t msg = 0; + CHECK_DIF_OK(dif_tlul_mailbox_send_message(&tlul_mailbox, &msg)); + } + LOG_INFO("Iterations: %d", iterations); _print64("Total Cycles", cycles); _print64("Average Cycles per Iteration", average_cycles);