from curses import baudrate import random import cocotb from cocotb.triggers import FallingEdge,RisingEdge,ClockCycles,Timer,Edge import cocotb.log from interfaces.cpu import RiskV from interfaces.defsParser import Regs from cocotb.result import TestSuccess from tests.common_functions.test_functions import * from tests.bitbang.bitbang_functions import * from interfaces.caravel import GPIO_MODE from interfaces.common import Macros bit_time_ns = 0 reg = Regs() @cocotb.test() @repot_test async def debug(dut): caravelEnv,clock = await test_configure(dut,timeout_cycles=375862) cpu = RiskV(dut) cpu.cpu_force_reset() cpu.cpu_release_reset() # calculate bit time clk = clock.period/1000 global bit_time_ns bit_time_ns = round(10**5 * clk / (96)) cocotb.log.info(f"[TEST] bit time in nano second = {bit_time_ns}") caravelEnv.drive_gpio_in((0,0),0) # IO[0] affects the uart selecting btw system and debug caravelEnv.drive_gpio_in((5,5),1) # wait for start of sending await wait_reg1(cpu,caravelEnv,0XAA) cocotb.log.info(f"[TEST] Start debug test") # send random data to address 30'h00400024 and expect to recieve the same data back it back address = 0x00000410 data = random.getrandbits(32) data = 0xFFFFFFFF cocotb.log.info (f"[TEST] Executing DFF2 write address={hex(address)} data = {hex(data)}") await wb_write(caravelEnv,address,data) receieved_data = await wb_read(caravelEnv,address) if data != receieved_data: cocotb.log.error(f"[TEST] DFF2 write failed expected data = {hex(data)} recieved data = {hex(receieved_data)}") else: cocotb.log.info(f"[TEST] DFF2 write succeeded") async def start_of_tx(caravelEnv): while (True): # wait for the start of the transimission it 1 then 0 if (caravelEnv.monitor_gpio((6,6)).integer == 0): break await Timer(bit_time_ns, units='ns') await Timer(bit_time_ns, units='ns') async def uart_send_char(caravelEnv,char): cocotb.log.info (f"[uart_send_char] start sending on uart {char}") #send start bit caravelEnv.drive_gpio_in((5,5),0) await Timer(bit_time_ns, units='ns') #send bits for i in range(8): caravelEnv.drive_gpio_in((5,5),char[i]) await Timer(bit_time_ns, units='ns') # stop of frame caravelEnv.drive_gpio_in((5,5),1) await Timer(bit_time_ns, units='ns') await Timer(bit_time_ns, units='ns') # insert 4 bit delay just for debugging await Timer(bit_time_ns, units='ns') await Timer(bit_time_ns, units='ns') await Timer(bit_time_ns, units='ns') await Timer(bit_time_ns, units='ns') async def uart_get_char(caravelEnv): await start_of_tx(caravelEnv) char = '' for i in range (8): char = char + caravelEnv.monitor_gpio((6,6)).binstr await Timer(bit_time_ns, units='ns') cocotb.log.info (f"[uart_get_char] recieving {char} from uart") return char async def wb_write(caravelEnv,addr,data): addr_bits = bin(addr)[2:].zfill(32)[::-1] data_bits = bin(data)[2:].zfill(32)[::-1] cocotb.log.info(f"[TEST] address bits = {addr_bits} {type(addr_bits)}") await uart_send_char(caravelEnv, '10000000') # write cmd await uart_send_char(caravelEnv, '10000000') # size await uart_send_char(caravelEnv, addr_bits[24:32]) await uart_send_char(caravelEnv, addr_bits[16:24]) await uart_send_char(caravelEnv, addr_bits[8:16]) await uart_send_char(caravelEnv, addr_bits[0:8]) await uart_send_char(caravelEnv, data_bits[24:32]) await uart_send_char(caravelEnv, data_bits[16:24]) await uart_send_char(caravelEnv, data_bits[8:16]) await uart_send_char(caravelEnv, data_bits[0:8]) async def wb_read(caravelEnv,addr): addr_bits = bin(addr)[2:].zfill(32)[::-1] await uart_send_char(caravelEnv, '01000000') # read cmd await uart_send_char(caravelEnv, '10000000') # size await uart_send_char(caravelEnv, addr_bits[24:32]) await uart_send_char(caravelEnv, addr_bits[16:24]) await uart_send_char(caravelEnv, addr_bits[8:16]) await uart_send_char(caravelEnv, addr_bits[0:8]) data_bits = await uart_get_char(caravelEnv) data_bits += await uart_get_char(caravelEnv) data_bits += await uart_get_char(caravelEnv) data_bits += await uart_get_char(caravelEnv) return int(data_bits,2)