Skip to content
Snippets Groups Projects
vm_integration_tests.py 6.24 KiB
Newer Older
import itertools
import logging
import os
from numpy import random
import numpy as np

import cocotb
from cocotb.clock import Clock
from cocotb.triggers import RisingEdge, Timer, ClockCycles
from cocotb.regression import TestFactory

from cocotbext.ahb import AHBLiteMaster, AHBBus

class TB:
    def __init__(self,dut):
        self.dut = dut
        
        self.log = logging.getLogger("cocotb.tb")
        self.log.setLevel(logging.DEBUG)
        cocotb.start_soon(Clock(dut.HCLK, 10, units="ns").start())
        self.config_ahb_master = AHBLiteMaster(AHBBus.from_prefix(dut,"config", optional_signals = {"hsel":"HSEL", "hready_in":"HREADY_IN", "hburst":"HBURST"}), dut.HCLK, dut.HRESETn)

    async def cycle_reset(self):
        self.dut.HRESETn.setimmediatevalue(0)
        await ClockCycles(self.dut.HCLK,20)
        self.dut.HRESETn.setimmediatevalue(1)
        await ClockCycles(self.dut.HCLK,30)
            



async def wait_reg0_write(dut, tb):
    tb.log.info("Wait for write ack reg0")
    reg1 = await tb.config_ahb_master.read(0x04,4)
    reg1 = int(reg1[0]['data'],16)
    while ((reg1 & (1<<16))==0):
        await ClockCycles(dut.HCLK,2)
        reg1 = await tb.config_ahb_master.read(0x04,4)
        reg1 = int(reg1[0]['data'],16)

    tb.log.info("Wait for write ack low reg0")
    while ((reg1 & (1<<16))!=0):
        await ClockCycles(dut.HCLK,2)
        reg1 = await tb.config_ahb_master.read(0x04,4)
        reg1 = int(reg1[0]['data'],16)

async def wait_reg2_write(dut, tb):
    tb.log.info("Wait for write ack reg2")
    reg1 = await tb.config_ahb_master.read(0x04,4)
    reg1 = int(reg1[0]['data'],16)
    while ((reg1 & (1<<24))==0):
        await ClockCycles(dut.HCLK,2)
        reg1 = await tb.config_ahb_master.read(0x04,4)
        reg1 = int(reg1[0]['data'],16)
        
    tb.log.info("Wait for write ack low reg2")
    while ((reg1 & (1<<24))!=0):
        await ClockCycles(dut.HCLK,2)
        reg1 = await tb.config_ahb_master.read(0x04,4)
        reg1 = int(reg1[0]['data'],16)

async def VM_read_APB_regs(dut, tb):
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg1 = await tb.config_ahb_master.read(0x04,4)
    reg2 = await tb.config_ahb_master.read(0x08,4)
    reg3 = await tb.config_ahb_master.read(0x0C,4)

    tb.log.info("Reg 0: 0x%0x", int(reg0[0]['data'],16))
    tb.log.info("Reg 1: 0x%0x", int(reg1[0]['data'],16))
    tb.log.info("Reg 2: 0x%0x", int(reg2[0]['data'],16))
    tb.log.info("Reg 3: 0x%0x", int(reg3[0]['data'],16))

async def VM_enable_clk(dut,tb):
    tb.log.info("Enabling VM clock and power up")
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ 2
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)
    reg0 = await tb.config_ahb_master.read(0x00,4)
    tb.log.info("Reg 0: 0x%0x", int(reg0[0]['data'],16))
    await ClockCycles(dut.HCLK,5000)

    tb.log.info("Releasing VM reset")
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ (1<<16)
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)
    reg0 = await tb.config_ahb_master.read(0x00,4)
    tb.log.info("Reg 0: 0x%0x", int(reg0[0]['data'],16))


async def VM_run_once(dut,tb):
    tb.log.info("Running VM")
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ 1
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)

    reg0 = reg0 ^ 1
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)

    tb.log.info("Wait for conversion")
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    while ((reg0 &(1<<24))==0):
        reg0 = await tb.config_ahb_master.read(0x00,4)
        reg0 = int(reg0[0]['data'],16)
    tb.log.info("Conversion finished")
    
    reg1 = await tb.config_ahb_master.read(0x04,4)
    reg1 = int(reg1[0]['data'],16)

    v_out = 1.224*(reg1+1)/256
    tb.log.info("Output is: 0x%x - %f",reg1, v_out)
    
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ (1<<3)
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ (1<<3)
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)


async def VM_run_once_irq(dut,tb):
    tb.log.info("Running VM with irq")
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ 1
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)

    reg0 = reg0 ^ 1
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)

    tb.log.info("Wait for conversion")
    while dut.irq_vm_rdy.value==0:
        await ClockCycles(dut.HCLK,30)
    tb.log.info("Conversion finished")
    
    reg1 = await tb.config_ahb_master.read(0x04,4)
    reg1 = int(reg1[0]['data'],16)

    v_out = 1.224*(reg1+1)/256
    tb.log.info("Output is: 0x%x - %f",reg1, v_out)
    
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ (1<<3)
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)
    reg0 = await tb.config_ahb_master.read(0x00,4)
    reg0 = int(reg0[0]['data'],16)
    reg0 = reg0 ^ (1<<3)
    await tb.config_ahb_master.write(0x00,reg0)
    await wait_reg0_write(dut,tb)

async def VM_set_an(dut,tb,n):
    tb.log.info("Set voltage input to %d",n)
    reg2 = await tb.config_ahb_master.read(0x08,4)
    reg2 = int(reg2[0]['data'],16)
    reg2 = reg2 & 0xFFFFFFF0
    reg2 = reg2 | (1<<3) 
    reg2 = reg2 | (n)   
    await tb.config_ahb_master.write(0x08,reg2)
    await wait_reg2_write(dut,tb)

@cocotb.test()
async def VM_test1(dut):
    tb = TB(dut)
    await tb.cycle_reset()
    VM_ID = await tb.config_ahb_master.read(0x0C,4)
    tb.log.info("VM_ID: 0x%0x", int(VM_ID[0]['data'],16))
    assert int(VM_ID[0]['data'],16) == 0x736E766D
    
    await VM_read_APB_regs(dut, tb)
    await VM_enable_clk(dut,tb)
    await VM_run_once(dut,tb)
    await VM_run_once_irq(dut,tb)
    await VM_set_an(dut,tb,0)
    await VM_run_once_irq(dut,tb)
    await VM_set_an(dut,tb,1)
    await VM_run_once_irq(dut,tb)
    await VM_set_an(dut,tb,2)
    await VM_run_once_irq(dut,tb)