From e2245ad33366ec70530a21149da492e7f71ba406 Mon Sep 17 00:00:00 2001 From: M0stafaRady Date: Mon, 10 Oct 2022 07:42:02 -0700 Subject: [PATCH] enhance gpio_all_i test to include more checkers --- verilog/dv/cocotb/tests/gpio/gpio.py | 101 ++++++++++++------ verilog/dv/cocotb/tests/gpio/gpio_all_i.c | 29 +++-- .../dv/cocotb/tests/gpio/gpio_all_o_user.c | 2 +- verilog/dv/cocotb/tests/gpio/gpio_user.py | 2 +- 4 files changed, 92 insertions(+), 42 deletions(-) diff --git a/verilog/dv/cocotb/tests/gpio/gpio.py b/verilog/dv/cocotb/tests/gpio/gpio.py index 388034d2..92bb82c0 100644 --- a/verilog/dv/cocotb/tests/gpio/gpio.py +++ b/verilog/dv/cocotb/tests/gpio/gpio.py @@ -51,7 +51,7 @@ async def gpio_all_o(dut): await wait_reg1(cpu,caravelEnv,0XBB) data_in = 0x8F66FD7B - cocotb.log.info(f"[TEST] try send {hex(data_in)} to gpio[31:0]") + cocotb.log.info(f"[TEST] try drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) reg2 =0 await wait_reg1(cpu,caravelEnv,0XFF) @@ -73,47 +73,82 @@ async def gpio_all_o(dut): @cocotb.test() @repot_test async def gpio_all_i(dut): - caravelEnv,clock = await test_configure(dut,timeout_cycles=44980) + caravelEnv,clock = await test_configure(dut,timeout_cycles=56837) cpu = RiskV(dut) cpu.cpu_force_reset() cpu.cpu_release_reset() - uut = dut.uut await wait_reg1(cpu,caravelEnv,0xAA) cocotb.log.info(f"[TEST] configuration finished") - data_in = 0x8F66FD7B - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + data_in = 0xFFFFFFFF + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xBB) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") - data_in = 0xFFA88C5A - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") + data_in = 0xAAAAAAAA + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xCC) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") - data_in = 0xC9536346 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") + data_in = 0x55555555 + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") + caravelEnv.drive_gpio_in((31,0),data_in) + await wait_reg1(cpu,caravelEnv,0xDD) + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") + data_in = 0x0 + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xD1) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0x3F - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD2) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[37:32]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[37:32]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datah has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0x0 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD3) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[37:32]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[37:32]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datah has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0x15 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD4) - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[37:32]") + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[37:32]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datah has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0x2A - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) - await wait_reg2(cpu,caravelEnv,0xFF) + await wait_reg1(cpu,caravelEnv,0XD5) + if cpu.read_debug_reg2() == data_in: + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[37:32]") + else: + cocotb.log.error(f"[TEST] Error: reg_mprj_datah has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") + caravelEnv.release_gpio((37,0)) + await wait_reg2(cpu,caravelEnv,0XFF) + if caravelEnv.monitor_gpio((37,0)).binstr != "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz": + cocotb.log.error(f"[TEST] ERROR: firmware can write to the gpios while they are configured as input_nopull gpio= {caravelEnv.monitor_gpio((37,0))}") + else: + cocotb.log.info(f"[TEST] [TEST] PASS: firmware cannot write to the gpios while they are configured as input_nopull gpio= {caravelEnv.monitor_gpio((37,0))}") cocotb.log.info(f"[TEST] finish") @@ -361,59 +396,59 @@ async def gpio_all_bidir(dut): await wait_reg1(cpu,caravelEnv,0x2A) cocotb.log.info(f"[TEST] configuration finished") data_in = 0x8F66FD7B - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xBB) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xFFA88C5A - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xCC) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xC9536346 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[31:0]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[31:0]") caravelEnv.drive_gpio_in((31,0),data_in) await wait_reg1(cpu,caravelEnv,0xD1) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xC9536346 data_in = 0x3F - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD2) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xC9536346 data_in = 0x0 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD3) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xC9536346 data_in = 0x15 - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg1(cpu,caravelEnv,0xD4) if cpu.read_debug_reg2() == data_in: - cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully to gpio[31:0]") + cocotb.log.info(f"[TEST] data {hex(data_in)} sent successfully through gpio[31:0]") else: cocotb.log.error(f"[TEST] Error: reg_mprj_datal has recieved wrong data {cpu.read_debug_reg2()} instead of {data_in}") data_in = 0xC9536346 data_in = 0x2A - cocotb.log.info(f"[TEST] send {hex(data_in)} to gpio[37:32]") + cocotb.log.info(f"[TEST] drive {hex(data_in)} to gpio[37:32]") caravelEnv.drive_gpio_in((37,32),data_in) await wait_reg2(cpu,caravelEnv,0xFF) cocotb.log.info(f"[TEST] finish") diff --git a/verilog/dv/cocotb/tests/gpio/gpio_all_i.c b/verilog/dv/cocotb/tests/gpio/gpio_all_i.c index 4882b056..ff2bb319 100644 --- a/verilog/dv/cocotb/tests/gpio/gpio_all_i.c +++ b/verilog/dv/cocotb/tests/gpio/gpio_all_i.c @@ -7,7 +7,7 @@ void main(){ reg_wb_enable =1; // for enable writing to reg_debug_1 and reg_debug_2 reg_debug_1 = 0x0; reg_debug_2 = 0x0; - + reg_hkspi_disable = 1; reg_mprj_io_37 = GPIO_MODE_MGMT_STD_INPUT_NOPULL; reg_mprj_io_36 = GPIO_MODE_MGMT_STD_INPUT_NOPULL; reg_mprj_io_35 = GPIO_MODE_MGMT_STD_INPUT_NOPULL; @@ -51,20 +51,35 @@ void main(){ reg_mprj_xfer = 1; while (reg_mprj_xfer == 1); - reg_debug_1 = 0XAA; // configuration done wait environment to send 0x8F66FD7B to reg_mprj_datal - while (reg_mprj_datal != 0x8F66FD7B); - reg_debug_1 = 0XBB; // configuration done wait environment to send 0xFFA88C5A to reg_mprj_datal - while (reg_mprj_datal != 0xFFA88C5A); - reg_debug_1 = 0XCC; // configuration done wait environment to send 0xC9536346 to reg_mprj_datal - while (reg_mprj_datal != 0xC9536346); + reg_debug_1 = 0XAA; // configuration done wait environment to send 0xFFFFFFFF to reg_mprj_datal + while (reg_mprj_datal != 0xFFFFFFFF); + reg_debug_2 = reg_mprj_datal; + reg_debug_1 = 0XBB; // configuration done wait environment to send 0xAAAAAAAA to reg_mprj_datal + while (reg_mprj_datal != 0xAAAAAAAA); + reg_debug_2 = reg_mprj_datal; + reg_debug_1 = 0XCC; // configuration done wait environment to send 0x55555555 to reg_mprj_datal + while (reg_mprj_datal != 0x55555555); + reg_debug_2 = reg_mprj_datal; + reg_debug_1 = 0XDD; // configuration done wait environment to send 0x0 to reg_mprj_datal + while (reg_mprj_datal != 0x0); + reg_debug_2 = reg_mprj_datal; reg_debug_1 = 0XD1; while (reg_mprj_datah != 0x3F); + reg_debug_2 = reg_mprj_datah; reg_debug_1 = 0XD2; while (reg_mprj_datah != 0x0); + reg_debug_2 = reg_mprj_datah; reg_debug_1 = 0XD3; while (reg_mprj_datah != 0x15); + reg_debug_2 = reg_mprj_datah; reg_debug_1 = 0XD4; while (reg_mprj_datah != 0x2A); + reg_debug_2 = reg_mprj_datah; + reg_debug_1 = 0XD5; + reg_debug_1 = 0XD5; // for delay insertion for release + // trying to inject error by sending data to gpio by firmware where gpios configured as input + reg_mprj_datal = 0x5AE1FFB8; // random number + reg_mprj_datah = 0x5AE1FFB8; // random number reg_debug_2 = 0xFF; } diff --git a/verilog/dv/cocotb/tests/gpio/gpio_all_o_user.c b/verilog/dv/cocotb/tests/gpio/gpio_all_o_user.c index 851b25ea..f31f3adb 100644 --- a/verilog/dv/cocotb/tests/gpio/gpio_all_o_user.c +++ b/verilog/dv/cocotb/tests/gpio/gpio_all_o_user.c @@ -80,7 +80,7 @@ void main(){ // try to give input reg_debug_1 = 0XBB; // configuration done wait environment to send 0x8F66FD7B to reg_mprj_userl - int timeout = 1000; + int timeout = 100; while (reg_mprj_userl != 0x8F66FD7B){ timeout--; if (timeout==0){ diff --git a/verilog/dv/cocotb/tests/gpio/gpio_user.py b/verilog/dv/cocotb/tests/gpio/gpio_user.py index d68dad6a..f8169e49 100644 --- a/verilog/dv/cocotb/tests/gpio/gpio_user.py +++ b/verilog/dv/cocotb/tests/gpio/gpio_user.py @@ -15,7 +15,7 @@ reg = Regs() @cocotb.test() @repot_test async def gpio_all_o_user(dut): - caravelEnv,clock = await test_configure(dut,timeout_cycles=376123) + caravelEnv,clock = await test_configure(dut,timeout_cycles=585321) cpu = RiskV(dut) cpu.cpu_force_reset() cpu.cpu_release_reset()