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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [wishbone/] [testbecnh/] [dev_pb_wishbone_ctrl/] [sim/] [ds_dma_pb_if.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
//////////////////////////////////////////////////////////////////////////////////
2
// Company:         ;)
3
// Engineer:        Kuzmi4
4
// 
5
// Create Date:     14:39:52 05/19/2010 
6
// Design Name:     
7
// Module Name:     ds_dma_pb_if
8
// Project Name:    DS_DMA
9
// Target Devices:  no
10
// Tool versions:   any with SV support
11
// Description: 
12
//
13
//
14
// Revision: 
15
// Revision 0.01 - File Created
16
//
17
//////////////////////////////////////////////////////////////////////////////////
18
 
19
interface ds_dma_pb_if # ( parameter time pt_Tclk = 10ns, parameter time pt_Tdly = 1ns )
20
(
21
    input   i_clk
22
);
23
//////////////////////////////////////////////////////////////////////////////////
24
    //
25
    // B_MASTER (OUT dir) IF
26
    logic               o_pb_master_stb0;   // CMD STB
27
    logic               o_pb_master_stb1;   // DATA STB
28
    logic       [ 2:0]  ov_pb_master_cmd;   // CMD
29
    logic       [31:0]  ov_pb_master_addr;  // ADDR
30
    logic       [63:0]  ov_pb_master_data;  // DATA
31
    //
32
    // PB_SLAVE (IN dir) IF:
33
    logic               i_pb_slave_ready;
34
    logic               i_pb_slave_complete;
35
    logic               i_pb_slave_stb0;    // WR CMD ACK STB 
36
    logic               i_pb_slave_stb1;    // DATA ACK STB   
37
    logic       [63:0]  iv_pb_slave_data;   // DATA           
38
    logic       [ 1:0]  iv_pb_slave_dmar;   // ...
39
    logic               i_pb_slave_irq;     // ...
40
 
41
//////////////////////////////////////////////////////////////////////////////////
42
//
43
// Define Clocking block:
44
//
45
default clocking cb @(posedge i_clk);
46
    default input #(pt_Tdly) output #(pt_Tdly);
47
    output o_pb_master_stb0, o_pb_master_stb1, ov_pb_master_cmd, ov_pb_master_addr, ov_pb_master_data;
48
    input i_pb_slave_ready, i_pb_slave_complete, i_pb_slave_stb0, i_pb_slave_stb1, iv_pb_slave_data, iv_pb_slave_dmar, i_pb_slave_irq;
49
endclocking
50
//////////////////////////////////////////////////////////////////////////////////
51
//
52
// Tasks:
53
//
54
// Init DATA_OUT
55
task    init;
56
    //
57
    o_pb_master_stb0    <= 0;
58
    o_pb_master_stb1    <= 0;
59
    ov_pb_master_cmd    <= 0;
60
    ov_pb_master_addr   <= 0;
61
    ov_pb_master_data   <= 0;
62
    //
63
endtask
64
//
65
task write_1_word (input [31:0] iv_addr=0, input [63:0] iv_data=0);
66
    //
67
    @cb;
68
    cb.o_pb_master_stb0     <= 1;
69
    cb.o_pb_master_stb1     <= 0;
70
    cb.ov_pb_master_addr    <= iv_addr;
71
    cb.ov_pb_master_cmd     <= 3'b0_0_1;
72
    @cb;
73
    cb.o_pb_master_stb0     <= 0;
74
    cb.o_pb_master_stb1     <= 1;
75
    cb.ov_pb_master_data    <= iv_data;
76
    cb.ov_pb_master_cmd     <= 3'b0_0_1;
77
    do
78
        begin   :   PB_SLAVE_STB_0
79
            ##1;
80
            cb.o_pb_master_stb0     <= 0;
81
            cb.o_pb_master_stb1     <= 0;
82
            cb.ov_pb_master_data    <= 0;
83
            cb.ov_pb_master_cmd     <= 3'b0;
84
        end
85
    while (cb.i_pb_slave_complete==0);
86
    //
87
endtask
88
// 
89
task write_512_word (input [31:0] iv_addr=0, input [63:0] iv_start_data=0, input i_rnd=0);
90
    //
91
    int i=0, rdy_counter=0;
92
    //
93
    @cb;
94
    cb.o_pb_master_stb0     <= 1;
95
    cb.o_pb_master_stb1     <= 0;
96
    cb.ov_pb_master_addr    <= iv_addr;
97
    cb.ov_pb_master_cmd     <= 3'b1_0_1;
98
    @cb;
99
    cb.o_pb_master_stb0     <= 0;
100
    cb.o_pb_master_stb1     <= 0;
101
    cb.ov_pb_master_cmd     <= 3'b1_0_1;
102
    @cb;
103
    //
104
    do
105
        begin   :   DATA
106
            @cb;
107
            if (cb.i_pb_slave_ready==0)
108
                rdy_counter++;
109
            else
110
                rdy_counter=0;
111
            if (rdy_counter < 4)
112
                begin   :   DATA_OUT
113
                    cb.o_pb_master_stb1     <= 1;
114
                    cb.ov_pb_master_data    <= (i_rnd)? $urandom()/*$urandom_range()*/ : (iv_start_data+i);
115
                    i++;
116
                end
117
            else
118
                begin   :   DATA_HALT
119
                    cb.o_pb_master_stb1     <= 0;
120
                    cb.ov_pb_master_data    <= 0;
121
                end
122
        end
123
    while (i<512+1);
124
 
125
    cb.o_pb_master_stb0     <= 0;
126
    cb.o_pb_master_stb1     <= 0;
127
    //
128
endtask
129
//
130
task read_1_word(input [31:0] iv_addr, output logic [63:0] ov_data);
131
    //
132
    //
133
    @cb;
134
    cb.o_pb_master_stb0     <= 1;
135
    cb.o_pb_master_stb1     <= 0;
136
    cb.ov_pb_master_addr    <= iv_addr;
137
    cb.ov_pb_master_cmd     <= 3'b0_1_0;
138
    @cb;
139
    cb.o_pb_master_stb0     <= 0;
140
    cb.o_pb_master_stb1     <= 1;
141
    cb.ov_pb_master_cmd     <= 3'b0_1_0;
142
    //
143
    do
144
        begin   :   PB_SLAVE_STB_0
145
            @cb;
146
            cb.o_pb_master_stb0     <= 0;
147
            cb.o_pb_master_stb1     <= 0;
148
            cb.ov_pb_master_cmd     <= 0;
149
        end
150
    while (cb.i_pb_slave_stb0==0);
151
    //
152
    do
153
        begin   :   PB_SLAVE_STB_1
154
            @cb;
155
            if (cb.i_pb_slave_stb1)
156
                ov_data = cb.iv_pb_slave_data;
157
        end
158
    while (cb.i_pb_slave_complete==0);
159
    //
160
endtask
161
//
162
task read_512_word (input [31:0] iv_addr, output [63:0] ov_data [512]);
163
    //
164
    int i=0;
165
    //
166
    @cb;
167
    cb.o_pb_master_stb0     <= 1;
168
    cb.o_pb_master_stb1     <= 0;
169
    cb.ov_pb_master_addr    <= iv_addr;
170
    cb.ov_pb_master_cmd     <= 3'b1_1_0;
171
    @cb;
172
    cb.o_pb_master_stb0     <= 0;
173
    cb.o_pb_master_stb1     <= 0;
174
    cb.ov_pb_master_cmd     <= 3'b1_1_0;
175
    // 
176
    do
177
        begin   :   GET_DATA
178
            @cb;
179
            if (cb.i_pb_slave_stb1)
180
                begin
181
                    ov_data[i] <= cb.iv_pb_slave_data;
182
                    i++;
183
                end
184
        end
185
    while (cb.i_pb_slave_complete==0);
186
    // CLR on EXIT
187
    cb.o_pb_master_stb0     <= 0;
188
    cb.o_pb_master_stb1     <= 0;
189
    cb.ov_pb_master_cmd     <= 0;
190
    // 
191
endtask
192
//////////////////////////////////////////////////////////////////////////////////
193
//
194
// Functions:
195
//
196
// for polling "iv_pb_slave_dmar"
197
function automatic bit [1:0] get_pb_slave_dmar;
198
    return cb.iv_pb_slave_dmar;
199
endfunction
200
// for polling "i_pb_slave_irq"
201
function automatic bit get_pb_slave_irq;
202
    return cb.i_pb_slave_irq;
203
endfunction
204
//////////////////////////////////////////////////////////////////////////////////
205
endinterface

powered by: WebSVN 2.1.0

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