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 4

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
    int cycles = 0;
49
    while (true)
50
    {
51
        // Random delay
52
        int wait_len = rand() % 10;
53
        if (wait_len)
54
            wait(wait_len);
55
 
56
        if (!(rand() % 32))
57
        {
58
            if (rand() & 1)
59
                utmi_opmode_i.write(rand());
60
            else
61
                utmi_dppulldown_i.write(rand() & 1);
62
        }
63
 
64
        if (cycles++ == 1000)
65
            m_dut.stopSimulation();
66
    }
67
}
68
//-----------------------------------------------------------------
69
// phy_rx: PHY Rx Thread
70
//-----------------------------------------------------------------
71
void ulpi_wrapper_tb::phy_rx(void)
72
{
73
    sc_uint <8> data;
74
    sc_uint <1> last;
75
 
76
    sc_uint <8> ulpi_data;
77
    sc_uint <1> ulpi_last;
78
 
79
    while (ulpi_rst_i.read())
80
        wait();
81
 
82
    while (1)
83
    {
84
        // Wait for data from ULPI interface
85
        ulpi_last = m_ulpi.read(ulpi_data);
86
 
87
        // Read actual data FIFO
88
        (last, data) = m_link_phy_queue.read();
89
 
90
        cout << hex << "EXPECT: DATA " << data << " LAST " << last << endl;
91
        cout << hex << "GOT:    DATA " << ulpi_data << " LAST " << ulpi_last << endl;
92
 
93
        sc_assert(ulpi_data == data);
94
        sc_assert(ulpi_last == last);
95
    }
96
}
97
//-----------------------------------------------------------------
98
// link_rx: Link Rx Thread
99
//-----------------------------------------------------------------
100
void ulpi_wrapper_tb::link_rx(void)
101
{
102
    sc_uint <8> data;
103
    sc_uint <1> last;
104
 
105
    sc_uint <8> ulpi_data;
106
    sc_uint <1> ulpi_last;
107
 
108
    while (ulpi_rst_i.read())
109
        wait();
110
 
111
    while (1)
112
    {
113
        // Wait for data from UTMI interface
114
        ulpi_last = m_utmi.read(ulpi_data);
115
 
116
        // Read actual data FIFO
117
        (last, data) = m_phy_link_queue.read();
118
 
119
        cout << hex << "EXPECT: DATA " << data << " LAST " << last << endl;
120
        cout << hex << "GOT:    DATA " << ulpi_data << " LAST " << ulpi_last << endl;
121
 
122
        sc_assert(ulpi_data == data);
123
        sc_assert(ulpi_last == last);
124
    }
125
}
126
//-----------------------------------------------------------------
127
// phy_tx: PHY Tx Thread
128
//-----------------------------------------------------------------
129
void ulpi_wrapper_tb::phy_tx(void)
130
{
131
    while (ulpi_rst_i.read())
132
        wait();
133
 
134
    while (1)
135
    {
136
        wait(10 + (rand() % 16));
137
 
138
        m_mutex.lock();
139
 
140
        int len = 1 + (rand() % 8);
141
        while (len--)
142
        {
143
            sc_uint <8> data = rand();
144
            sc_uint <1> last = (len == 0);
145
 
146
            cout << hex << "QUEUE (RX): DATA " << data << " LAST " << last << endl;
147
            m_phy_link_queue.write((last, data));
148
            m_ulpi.write(data, last);
149
        }
150
 
151
        do
152
        {
153
            wait(1);
154
        }
155
        while (m_phy_link_queue.num_available());
156
 
157
        m_mutex.unlock();
158
    }
159
}
160
//-----------------------------------------------------------------
161
// link_tx: Link Tx Thread
162
//-----------------------------------------------------------------
163
void ulpi_wrapper_tb::link_tx(void)
164
{
165
    while (ulpi_rst_i.read())
166
        wait();
167
 
168
    while (1)
169
    {
170
        wait(10 + (rand() % 16));
171
 
172
        m_mutex.lock();
173
 
174
        int len = 1 + (rand() % 8);
175
        bool first = true;
176
        while (len--)
177
        {
178
            sc_uint <8> data = rand();
179
            sc_uint <1> last = (len == 0);
180
 
181
            // First byte is PID
182
            if (first)
183
                data.range(7,4) = ~data.range(3,0);
184
 
185
            first = false;
186
 
187
            cout << hex << "QUEUE (TX): DATA " << data << " LAST " << last << endl;
188
            m_link_phy_queue.write((last, data));
189
            m_utmi.write(data, last);
190
        }
191
 
192
        // Wait until transfer completed
193
        do
194
        {
195
            wait();
196
        }
197
        while (m_link_phy_queue.num_available());
198
 
199
        m_mutex.unlock();
200
    }
201
}

powered by: WebSVN 2.1.0

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