Skip to content

Commit 0d17d54

Browse files
johnymil-chipflowrobtaylor
authored andcommitted
Adding new tests for SPI (#27)
* Adding new tests for SPI * Removing unused signal
1 parent c6c04fe commit 0d17d54

File tree

3 files changed

+59
-74
lines changed

3 files changed

+59
-74
lines changed

pyuvm_verif/testbench_spi.py

Lines changed: 28 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -115,49 +115,6 @@ async def body(self):
115115
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
116116
await spiwr3.start(seqr)
117117

118-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x87, 1)
119-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
120-
spiwr2 = SpiSeq("spiwr2", 0xb, 0x45, 1)
121-
await spiwr0.start(seqr)
122-
await spiwr1.start(seqr)
123-
await spiwr2.start(seqr)
124-
for i in range(1):
125-
data3 = random.randint(0, 255)
126-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
127-
await spiwr3.start(seqr)
128-
129-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x86, 1)
130-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
131-
spiwr2 = SpiSeq("spiwr2", 0xb, 0x45, 1)
132-
await spiwr0.start(seqr)
133-
await spiwr1.start(seqr)
134-
await spiwr2.start(seqr)
135-
for i in range(1):
136-
data3 = random.randint(0, 255)
137-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
138-
await spiwr3.start(seqr)
139-
140-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x3d, 1)
141-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
142-
spiwr2 = SpiSeq("spiwr2", 0xb, 0x45, 1)
143-
await spiwr0.start(seqr)
144-
await spiwr1.start(seqr)
145-
await spiwr2.start(seqr)
146-
for i in range(0):
147-
data3 = random.randint(0, 255)
148-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
149-
await spiwr3.start(seqr)
150-
151-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x3c, 1)
152-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
153-
spiwr2 = SpiSeq("spiwr2", 0xb, 0x45, 1)
154-
await spiwr0.start(seqr)
155-
await spiwr1.start(seqr)
156-
await spiwr2.start(seqr)
157-
for i in range(0):
158-
data3 = random.randint(0, 255)
159-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
160-
await spiwr3.start(seqr)
161118

162119
class TestRdSeq(uvm_sequence):
163120
async def body(self):
@@ -185,40 +142,33 @@ async def body(self):
185142
spird = SpiSeq("spird", 0xc, data3, 2)
186143
await spird.start(seqr)
187144

188-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x3d, 1)
189-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
190-
await spiwr0.start(seqr)
191-
await spiwr1.start(seqr)
192-
for i in range(1):
193-
data3 = random.randint(0, 255)
194-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
195-
await spiwr3.start(seqr)
196-
spird = SpiSeq("spird", 0xc, data3, 2)
197-
await spird.start(seqr)
198-
199-
spiwr0 = SpiSeq("spiwr0", 0x0, 0x3c, 1)
200-
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
201-
await spiwr0.start(seqr)
202-
await spiwr1.start(seqr)
203-
for i in range(1):
204-
data3 = random.randint(0, 255)
205-
spiwr3 = SpiSeq("spiwr3", 0xb, data3, 1)
206-
await spiwr3.start(seqr)
207-
spird = SpiSeq("spird", 0xc, data3, 2)
208-
await spird.start(seqr)
209-
210145
class TestClkdivSeq(uvm_sequence):
211146
async def body(self):
212147
uvm_root().logger.info(f"TEST: CLOCK DIVIDER")
213148
seqr = ConfigDB().get(None, "", "SEQR")
214149
spiwr0 = SpiSeq("spiwr0", 0x0, 0x3f, 1)
215150
await spiwr0.start(seqr)
216-
data1 = random.randint(0, 255)
217-
spiwr1 = SpiSeq("spiwr1", 0x4, data1, 1)
218-
await spiwr1.start(seqr)
219-
data2 = random.randint(0, 255)
220-
spiwr2 = SpiSeq("spiwr2", 0xb, data2, 1)
221-
await spiwr2.start(seqr)
151+
for i in (1,25,63,127):
152+
data1 = i
153+
spiwr1 = SpiSeq("spiwr1", 0x4, data1, 1)
154+
await spiwr1.start(seqr)
155+
data2 = random.randint(0, 255)
156+
spiwr2 = SpiSeq("spiwr2", 0xb, data2, 1)
157+
await spiwr2.start(seqr)
158+
159+
class WidthSeq(uvm_sequence):
160+
async def body(self):
161+
uvm_root().logger.info(f"TEST: SPI WIDTH")
162+
seqr = ConfigDB().get(None, "", "SEQR")
163+
for i in (0x3f, 0x47):
164+
data1 = i;
165+
spiwr0 = SpiSeq("spiwr0", 0x0, data1, 1)
166+
await spiwr0.start(seqr)
167+
spiwr1 = SpiSeq("spiwr1", 0x4, 0x0, 1)
168+
await spiwr1.start(seqr)
169+
data2 = random.randint(0, 255)
170+
spiwr2 = SpiSeq("spiwr2", 0xb, data2, 1)
171+
await spiwr2.start(seqr)
222172

223173
class Driver(uvm_driver):
224174
def build_phase(self):
@@ -359,4 +309,11 @@ class ClkdividerTest(BasicTest):
359309

360310
def build_phase(self):
361311
uvm_factory().set_type_override_by_type(TestSeq, TestClkdivSeq)
312+
super().build_phase()
313+
314+
@pyuvm.test()
315+
class WidthTest(BasicTest):
316+
317+
def build_phase(self):
318+
uvm_factory().set_type_override_by_type(TestSeq, WidthSeq)
362319
super().build_phase()

pyuvm_verif/utils_spi.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ def __init__(self):
3434
self.result_mon_queue = Queue(maxsize=0)
3535
self.data_miso = 0
3636
self.clk_div = 0
37+
self.width_num = 0
38+
self.width_en = 0
3739
def reverse_bits(self, number, bit_size):
3840
binary = bin(number)
3941
reverse = binary[-1:1:-1]
@@ -53,6 +55,7 @@ async def get_result(self):
5355
result = await self.result_mon_queue.get()
5456
return result
5557
async def cmd_mon_bfm(self):
58+
global wid_end
5659
while True:
5760
await RisingEdge(self.dut.clk_test)
5861
wstb = get_int(self.dut.wstb)
@@ -65,11 +68,20 @@ async def cmd_mon_bfm(self):
6568
if addr == 0:
6669
self.sck_start = (data & 0x01)
6770
self.sck_edge = (data & 0x02)
71+
width_bin = bin(data)[2:].zfill(8)
72+
self.width_num = int(width_bin[:5],2)
6873
uvm_root().logger.info(f"SCK EDGE: {self.sck_edge}")
6974
uvm_root().logger.info(f"SCK START: {self.sck_start}")
75+
uvm_root().logger.info(f"!!!WIDTH NUMBER: {self.width_num}!!!")
76+
wid_end = self.width_num + 10
7077
if addr == 4:
7178
self.clk_div = get_int(self.dut.wdata)
7279
uvm_root().logger.info(f"CLK DIV: {self.clk_div}")
80+
if addr == 11:
81+
self.width_en = 1
82+
for i in range(0,wid_end):
83+
await FallingEdge(self.dut.clk_test)
84+
self.width_en = 0
7385
else:
7486
op = 2
7587
cmd_tuple = (addr,
@@ -180,7 +192,6 @@ async def clkdiv_assert_bfm(self):
180192
wstb = get_int(self.dut.wstb)
181193
if wstb == 1:
182194
await FallingEdge(self.dut.clk_test)
183-
result = get_int(self.dut.wdata)
184195
addr = get_int(self.dut.addr)
185196
if addr == 11:
186197
await RisingEdge(self.dut.sck)
@@ -191,8 +202,26 @@ async def clkdiv_assert_bfm(self):
191202
uvm_root().logger.info(f"CLK DIVIDER MEASURED: {clk_div_measr}")
192203
assert self.clk_div == (clk_div_measr-2), f"CLK DIV {self.clk_div} NOT EQUAL TO CLK DIV MEASURED {clk_div_measr-2}"
193204

205+
async def width_assert_bfm(self):
206+
while True:
207+
await RisingEdge(self.dut.clk_test)
208+
wstb = get_int(self.dut.wstb)
209+
if wstb == 1:
210+
await FallingEdge(self.dut.clk_test)
211+
addr = get_int(self.dut.addr)
212+
if addr == 11:
213+
width_measer = 0
214+
while self.width_en == 1:
215+
await RisingEdge(self.dut.sck)
216+
width_measer = width_measer + 1
217+
uvm_root().logger.info(f"!!!! WIDTH OF SPI MEASURED: {width_measer} !!!!")
218+
if self.clk_div == 0:
219+
assert self.width_num == (
220+
width_measer-1), f"WIDTH {self.width_num} NOT EQUAL TO WIDTH MEASURED {width_measer-1}"
221+
194222
def start_bfm(self):
195223
cocotb.start_soon(self.driver_bfm())
196224
cocotb.start_soon(self.cmd_mon_bfm())
197225
cocotb.start_soon(self.result_mon_bfm())
198-
cocotb.start_soon(self.clkdiv_assert_bfm())
226+
cocotb.start_soon(self.clkdiv_assert_bfm())
227+
cocotb.start_soon(self.width_assert_bfm())

pyuvm_verif/verilog/spi_wrap.v

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ module spi_wrap
2020

2121
//clock generation
2222
bit clk_test;
23-
bit wstb_test;
2423

2524
initial clk_test = 0;
2625
always #5 clk_test = ~clk_test;

0 commit comments

Comments
 (0)