-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathutmi_driver.cpp
More file actions
122 lines (105 loc) · 2.87 KB
/
utmi_driver.cpp
File metadata and controls
122 lines (105 loc) · 2.87 KB
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
#include "utmi_driver.h"
//-----------------------------------------------------------------
// tx_drive
//-----------------------------------------------------------------
void utmi_driver::tx_drive(void)
{
// Wait until reset complete
while (rst_i.read())
wait();
// I/O
// utmi_txvalid_o
// utmi_data_o
// utmi_txready_i
utmi_txvalid_o.write(false);
utmi_data_o.write(false);
while (true)
{
bool last;
sc_uint <8> data;
do
{
last = tx_read(data);
utmi_txvalid_o.write(true);
utmi_data_o.write(data);
do
{
wait();
}
while (!utmi_txready_i.read());
utmi_txvalid_o.write(false);
utmi_data_o.write(0);
}
while (!last);
wait();
}
}
//-----------------------------------------------------------------
// rx_mon
//-----------------------------------------------------------------
void utmi_driver::rx_mon(void)
{
// Wait until reset complete
while (rst_i.read())
wait();
// I/O
// utmi_data_i
// utmi_rxvalid_i
// utmi_rxactive_i
bool last_valid = false;
sc_uint <8> last_data = 0;
while (true)
{
if (utmi_rxvalid_i.read())
{
if (last_valid)
rx_write(last_data, false);
last_valid = true;
last_data = utmi_data_i.read();
}
if (!utmi_rxactive_i.read() && last_valid)
{
rx_write(last_data, true);
last_valid = false;
}
wait();
}
}
//-----------------------------------------------------------------
// write
//-----------------------------------------------------------------
void utmi_driver::write(sc_uint <8> data, bool last)
{
sc_uint <9> fifo_data;
fifo_data.range(7,0) = data;
fifo_data.range(8,8) = last;
m_tx_fifo.write(fifo_data);
}
//-----------------------------------------------------------------
// read
//-----------------------------------------------------------------
bool utmi_driver::read(sc_uint <8> &data)
{
sc_uint <9> fifo_data = m_rx_fifo.read();
data = fifo_data.range(7,0);
return (bool)fifo_data.range(8,8);
}
//-----------------------------------------------------------------
// rx_write
//-----------------------------------------------------------------
void utmi_driver::rx_write(sc_uint <8> data, bool last)
{
sc_uint <9> fifo_data;
fifo_data.range(7,0) = data;
fifo_data.range(8,8) = last;
m_rx_fifo.write(fifo_data);
}
//-----------------------------------------------------------------
// tx_read
//-----------------------------------------------------------------
bool utmi_driver::tx_read(sc_uint <8> &data)
{
sc_uint <9> fifo_data = m_tx_fifo.read();
data = fifo_data.range(7,0);
return (bool)fifo_data.range(8,8);
}