OpenCores
URL https://opencores.org/ocsvn/ulpi_wrapper/ulpi_wrapper/trunk

Subversion Repositories ulpi_wrapper

[/] [ulpi_wrapper/] [trunk/] [testbench/] [ulpi_wrapper_tb.cpp] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ultra_embe
#include "ulpi_wrapper_tb.h"
2
 
3
//-----------------------------------------------------------------
4
// sc_main_tb
5
//-----------------------------------------------------------------
6
static int attach_system_c(p_cb_data user_data)
7
{
8
    ulpi_wrapper_tb * u_tb  = new ulpi_wrapper_tb("ulpi_wrapper_tb");
9
 
10
    // Initialize SystemC
11
    sc_start(0, SC_NS);
12
 
13
    // Start clock
14
    u_tb->m_vpi_clk.start();
15
}
16
//-----------------------------------------------------------------
17
// _register
18
//-----------------------------------------------------------------
19
static void _register(void)
20
{
21
    s_cb_data          cb_data_s;
22
    cb_data_s.user_data = NULL;
23
    cb_data_s.reason    = cbStartOfSimulation;
24
    cb_data_s.cb_rtn    = attach_system_c;
25
    cb_data_s.time      = NULL;
26
    cb_data_s.value     = NULL;
27
    vpi_register_cb(&cb_data_s);
28
}
29
 
30
void (*vlog_startup_routines[])() =
31
{
32
    _register,
33
 
34
};
35
 
36
//-----------------------------------------------------------------
37
// testbench
38
//-----------------------------------------------------------------
39
void ulpi_wrapper_tb::testbench(void)
40
{
41
    sc_uint <8> last_wr = 0xFF;
42
 
43
    ulpi_rst_i.write(true);
44
    wait(5);
45
    ulpi_rst_i.write(false);
46
    wait(1);
47
 
48
    m_reg.write(ULPI_REG_SCRATCH, last_wr);
49
 
50
    int cycles = 0;
51
    while (true)
52
    {
53
        // Random delay
54
        int wait_len = rand() % 10;
55
        if (wait_len)
56
            wait(wait_len);
57
 
58
        // Random register write
59
        if (rand() & 1)
60
        {
61
            last_wr = rand();
62
            m_reg.write(ULPI_REG_SCRATCH, last_wr);
63
        }
64
        // Random register read
65
        else
66
        {
67
            sc_assert(m_reg.read(ULPI_REG_SCRATCH) == last_wr);
68
        }
69
 
70
        if (!(rand() % 32))
71
        {
72
            if (rand() & 1)
73
                utmi_opmode_i.write(rand());
74
            else
75
                utmi_dppulldown_i.write(rand() & 1);
76
        }
77
 
78
        if (cycles++ == 1000)
79
            m_dut.stopSimulation();
80
    }
81
}
82
//-----------------------------------------------------------------
83
// phy_rx: PHY Rx Thread
84
//-----------------------------------------------------------------
85
void ulpi_wrapper_tb::phy_rx(void)
86
{
87
    sc_uint <8> data;
88
    sc_uint <1> last;
89
 
90
    sc_uint <8> ulpi_data;
91
    sc_uint <1> ulpi_last;
92
 
93
    while (ulpi_rst_i.read())
94
        wait();
95
 
96
    while (1)
97
    {
98
        // Wait for data from ULPI interface
99
        ulpi_last = m_ulpi.read(ulpi_data);
100
 
101
        // Read actual data FIFO
102
        (last, data) = m_link_phy_queue.read();
103
 
104
        cout << hex << "EXPECT: DATA " << data << " LAST " << last << endl;
105
        cout << hex << "GOT:    DATA " << ulpi_data << " LAST " << ulpi_last << endl;
106
 
107
        sc_assert(ulpi_data == data);
108
        sc_assert(ulpi_last == last);
109
    }
110
}
111
//-----------------------------------------------------------------
112
// link_rx: Link Rx Thread
113
//-----------------------------------------------------------------
114
void ulpi_wrapper_tb::link_rx(void)
115
{
116
    sc_uint <8> data;
117
    sc_uint <1> last;
118
 
119
    sc_uint <8> ulpi_data;
120
    sc_uint <1> ulpi_last;
121
 
122
    while (ulpi_rst_i.read())
123
        wait();
124
 
125
    while (1)
126
    {
127
        // Wait for data from UTMI interface
128
        ulpi_last = m_utmi.read(ulpi_data);
129
 
130
        // Read actual data FIFO
131
        (last, data) = m_phy_link_queue.read();
132
 
133
        cout << hex << "EXPECT: DATA " << data << " LAST " << last << endl;
134
        cout << hex << "GOT:    DATA " << ulpi_data << " LAST " << ulpi_last << endl;
135
 
136
        sc_assert(ulpi_data == data);
137
        sc_assert(ulpi_last == last);
138
    }
139
}
140
//-----------------------------------------------------------------
141
// phy_tx: PHY Tx Thread
142
//-----------------------------------------------------------------
143
void ulpi_wrapper_tb::phy_tx(void)
144
{
145
    while (ulpi_rst_i.read())
146
        wait();
147
 
148
    while (1)
149
    {
150
        wait(10 + (rand() % 16));
151
 
152
        m_mutex.lock();
153
 
154
        int len = 1 + (rand() % 8);
155
        while (len--)
156
        {
157
            sc_uint <8> data = rand();
158
            sc_uint <1> last = (len == 0);
159
 
160
            cout << hex << "QUEUE (RX): DATA " << data << " LAST " << last << endl;
161
            m_phy_link_queue.write((last, data));
162
            m_ulpi.write(data, last);
163
        }
164
 
165
        do
166
        {
167
            wait(1);
168
        }
169
        while (m_phy_link_queue.num_available());
170
 
171
        m_mutex.unlock();
172
    }
173
}
174
//-----------------------------------------------------------------
175
// link_tx: Link Tx Thread
176
//-----------------------------------------------------------------
177
void ulpi_wrapper_tb::link_tx(void)
178
{
179
    while (ulpi_rst_i.read())
180
        wait();
181
 
182
    while (1)
183
    {
184
        wait(10 + (rand() % 16));
185
 
186
        m_mutex.lock();
187
 
188
        int len = 1 + (rand() % 8);
189
        bool first = true;
190
        while (len--)
191
        {
192
            sc_uint <8> data = rand();
193
            sc_uint <1> last = (len == 0);
194
 
195
            // First byte is PID
196
            if (first)
197
                data.range(7,4) = ~data.range(3,0);
198
 
199
            first = false;
200
 
201
            cout << hex << "QUEUE (TX): DATA " << data << " LAST " << last << endl;
202
            m_link_phy_queue.write((last, data));
203
            m_utmi.write(data, last);
204
        }
205
 
206
        // Wait until transfer completed
207
        do
208
        {
209
            wait();
210
        }
211
        while (m_link_phy_queue.num_available());
212
 
213
        m_mutex.unlock();
214
    }
215
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.