Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
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)