-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapbTest.cpp
141 lines (130 loc) · 3.39 KB
/
apbTest.cpp
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
// Verilator testbench for testing the APB Driver
// SPDX-FileCopyrightText: © 2022 Aadi Desai <21363892+supleed2@users.noreply.github.com>
// SPDX-License-Identifier: Apache-2.0
#include "VerilatorTbFst.h"
#include <VapbTest.h>
#include <VapbTest__Dpi.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <svdpi.h>
#include <verilated.h>
#ifndef N_CYCLES
#define N_CYCLES 100
#endif
int main(int argc, char **argv, char **env) {
Verilated::commandArgs(argc, argv);
VerilatorTbFst<VapbTest> *tb = new VerilatorTbFst<VapbTest>();
tb->setScope("apbTest.u_apbDriver");
// Get SystemVerilog Parameters
const uint64_t CLOCK_PERIOD_PS = 10;
tb->setClockPeriodPS(2 * (CLOCK_PERIOD_PS / 3));
tb->opentrace("output/VapbTest.fst");
tb->m_trace->dump(0); // Initialize waveform at beginning of time.
printf("Starting!\n");
tb->m_dut->i_rst = 1;
tb->ticks(2);
tb->m_dut->i_rst = 0;
tb->ticks(2);
uint32_t addr, data, strb, prot;
int err = 0;
uint8_t SlvErr = 0;
uint32_t readData = 0;
addr = 0x100u;
data = 0x1234BEEFu;
strb = 0b1111u;
prot = 0b110u;
err = tryStartApbWrite(&addr, &data, &strb, &prot);
if (err != 0) {
printf("tryStartApbWrite failed!\n");
} else {
printf("tryStartApbWrite succeeded!\n");
tb->ticks(2);
err = tryFinishApbWrite(&SlvErr);
while (err != 0) {
printf("tryFinishApbWrite failed!\n");
tb->tick();
err = tryFinishApbWrite(&SlvErr);
}
printf("tryFinishApbWrite succeeded!\n");
if (SlvErr != 0) {
printf("Apb Write failed!\n");
} else {
printf("Apb Write succeeded!\n");
}
}
tb->tick();
tb->tick();
err = tryStartApbRead(&addr, &prot);
if (err != 0) {
printf("tryStartApbRead failed!\n");
} else {
printf("tryStartApbRead succeeded!\n");
tb->ticks(2);
err = tryFinishApbRead(&SlvErr, &readData);
while (err != 0) {
printf("tryFinishApbRead failed!\n");
tb->tick();
err = tryFinishApbRead(&SlvErr, &readData);
}
printf("tryFinishApbRead succeeded!\n");
if (SlvErr != 0) {
printf("Apb Read failed!\n");
} else {
printf("Apb Read succeeded!\nReceived Read Data: 0x%x\n", readData);
}
}
tb->tick();
tb->tick();
data = 0xDEAD5678u;
strb = 0b1100u;
err = tryStartApbWrite(&addr, &data, &strb, &prot);
if (err != 0) {
printf("tryStartApbWrite failed!\n");
} else {
printf("tryStartApbWrite succeeded!\n");
tb->ticks(2);
err = tryFinishApbWrite(&SlvErr);
while (err != 0) {
printf("tryFinishApbWrite failed!\n");
tb->tick();
err = tryFinishApbWrite(&SlvErr);
}
printf("tryFinishApbWrite succeeded!\n");
if (SlvErr != 0) {
printf("Apb Write failed!\n");
} else {
printf("Apb Write succeeded!\n");
}
}
tb->tick();
tb->tick();
err = tryStartApbRead(&addr, &prot);
if (err != 0) {
printf("tryStartApbRead failed!\n");
} else {
printf("tryStartApbRead succeeded!\n");
tb->ticks(2);
err = tryFinishApbRead(&SlvErr, &readData);
while (err != 0) {
printf("tryFinishApbRead failed!\n");
tb->tick();
err = tryFinishApbRead(&SlvErr, &readData);
}
printf("tryFinishApbRead succeeded!\n");
if (SlvErr != 0) {
printf("Apb Read failed!\n");
} else {
printf("Apb Read succeeded!\nExpected Read Data: 0x%x\nReceived Read Data: 0x%x\n", 0xDEADBEEFu, readData);
}
}
tb->tick();
tb->tick();
while (tb->tickcount() < N_CYCLES * 2) {
tb->ticks(2); // Run Tests
}
printf("Time: %ldns\n", tb->tickcount());
printf("Stopped.\n");
tb->closetrace();
exit(EXIT_SUCCESS);
}