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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [sim/] [iverilog/] [hdd/] [tb_hdd.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
`timescale 1 ps / 1 ps
3
 
4
module tb_hdd();
5
 
6
reg clk;
7
reg rst_n;
8
 
9
wire        interrupt;
10
 
11
reg         io_address                  = 1'b0;
12
reg  [3:0]  io_byteenable               = 4'd0;
13
reg         io_read                     = 1'b0;
14
wire [31:0] io_readdata;
15
reg         io_write                    = 1'b0;
16
reg  [31:0] io_writedata                = 32'd0;
17
 
18
reg         ide_3f6_read                = 1'b0;
19
wire [7:0]  ide_3f6_readdata;
20
reg         ide_3f6_write               = 1'b0;
21
reg  [7:0]  ide_3f6_writedata           = 8'd0;
22
 
23
wire [31:0] sd_master_address;
24
reg         sd_master_waitrequest       = 1'b0;
25
wire        sd_master_read;
26
reg         sd_master_readdatavalid     = 1'b0;
27
reg  [31:0] sd_master_readdata          = 1'b0;
28
wire        sd_master_write;
29
wire [31:0] sd_master_writedata;
30
 
31
reg  [8:0]  sd_slave_address            = 9'd0;
32
reg         sd_slave_read               = 1'b0;
33
wire [31:0] sd_slave_readdata;
34
reg         sd_slave_write              = 1'b0;
35
reg  [31:0] sd_slave_writedata          = 32'd0;
36
 
37
reg  [2:0]  mgmt_address                = 3'd0;
38
reg         mgmt_write                  = 1'b0;
39
reg  [31:0] mgmt_writedata              = 32'd0;
40
 
41
hdd hdd_inst(
42
    .clk                        (clk),
43
    .rst_n                      (rst_n),
44
 
45
    //irq
46
    .interrupt                  (interrupt),              //output
47
 
48
    //avalon slave
49
    .io_address                 (io_address),             //input
50
    .io_byteenable              (io_byteenable),          //input [3:0]
51
    .io_read                    (io_read),                //input
52
    .io_readdata                (io_readdata),            //output [31:0]
53
    .io_write                   (io_write),               //input
54
    .io_writedata               (io_writedata),           //input [31:0]
55
 
56
    //ide shared port 0x3F6
57
    .ide_3f6_read               (ide_3f6_read),           //input
58
    .ide_3f6_readdata           (ide_3f6_readdata),       //output [7:0]
59
    .ide_3f6_write              (ide_3f6_write),          //input
60
    .ide_3f6_writedata          (ide_3f6_writedata),      //input [7:0]
61
 
62
    //master to control sd
63
    .sd_master_address          (sd_master_address),      //output [31:0]
64
    .sd_master_waitrequest      (sd_master_waitrequest),  //input
65
    .sd_master_read             (sd_master_read),         //output
66
    .sd_master_readdatavalid    (sd_master_readdatavalid),//input
67
    .sd_master_readdata         (sd_master_readdata),     //input [31:0]
68
    .sd_master_write            (sd_master_write),        //output
69
    .sd_master_writedata        (sd_master_writedata),    //output [31:0]
70
 
71
    //slave with data from/to sd
72
    .sd_slave_address           (sd_slave_address),       //input [8:0]
73
    .sd_slave_read              (sd_slave_read),          //input
74
    .sd_slave_readdata          (sd_slave_readdata),      //output [31:0]
75
    .sd_slave_write             (sd_slave_write),         //input
76
    .sd_slave_writedata         (sd_slave_writedata),     //input [31:0]
77
 
78
    //management slave
79
    .mgmt_address               (mgmt_address),           //input [2:0]
80
    .mgmt_write                 (mgmt_write),             //input
81
    .mgmt_writedata             (mgmt_writedata)          //input [31:0]
82
);
83
 
84
initial begin
85
    clk = 1'b0;
86
    forever #5 clk = ~clk;
87
end
88
 
89
//------------------------------------------------------------------------------
90
 
91
`define WRITE_MGMT(addr, data)  \
92
    mgmt_write        = 1'b1;   \
93
    mgmt_address      = addr;   \
94
    mgmt_writedata    = data;   \
95
    #10;                        \
96
    mgmt_write        = 1'b0;
97
 
98
`define WRITE_IO(addr, enable, data)  \
99
    io_write        = 1'b1;   \
100
    io_address      = addr;   \
101
    io_byteenable   = enable; \
102
    io_writedata    = data;   \
103
    #10;                      \
104
    io_write        = 1'b0;
105
 
106
`define READ_IO(addr, enable) \
107
    io_read         = 1'b1;   \
108
    io_address      = addr;   \
109
    io_byteenable   = enable; \
110
    #10;                      \
111
    io_read         = 1'b0;
112
 
113
//------------------------------------------------------------------------------ read
114
 
115
/*
116
integer read_count = 0;
117
 
118
always @(posedge clk) begin
119
    if(sd_master_address == 32'd4 && sd_master_read) begin
120
        sd_master_readdatavalid <= 1'b1;
121
        sd_master_readdata <= 3'd2;
122
    end
123
    else if(sd_master_address == 32'd12 && sd_master_write && sd_master_writedata == 32'd2) begin
124
        #22;
125
 
126
        for(read_count=0; read_count < 16*128; read_count = read_count+1) begin
127
            sd_slave_address = read_count;
128
            sd_slave_write   = 1;
129
            sd_slave_writedata = read_count;
130
            #10;
131
        end
132
 
133
        sd_slave_address = 0;
134
        sd_slave_write   = 0;
135
        sd_slave_writedata = 0;
136
 
137
        #100;
138
 
139
        for(read_count=0; read_count < 16*128; read_count = read_count+1) begin
140
            `READ_IO(0, 4'b1111)
141
        end
142
 
143
        #100;
144
 
145
        `READ_IO(1, 4'b1000)
146
 
147
    end
148
    else begin
149
        sd_master_readdatavalid <= 1'b0;
150
        sd_master_readdata <= 3'd0;
151
    end
152
end
153
*/
154
 
155
//------------------------------------------------------------------------------ write
156
 
157
/*
158
integer read_count = 0;
159
integer write_count = 0;
160
 
161
always @(posedge clk) begin
162
    if(sd_master_address == 32'd4 && sd_master_read) begin
163
        sd_master_readdatavalid <= 1'b1;
164
        sd_master_readdata <= 3'd2;
165
    end
166
    else if(sd_master_address == 32'd12 && sd_master_write && sd_master_writedata == 32'd3) begin
167
        #22;
168
 
169
        for(read_count=0; read_count < 128; read_count = read_count+1) begin
170
            sd_slave_address = read_count;
171
            sd_slave_read   = 1;
172
            #10;
173
        end
174
 
175
        sd_slave_address = 0;
176
        sd_slave_read   = 0;
177
        sd_slave_writedata = 0;
178
    end
179
    else begin
180
        sd_master_readdatavalid <= 1'b0;
181
        sd_master_readdata <= 3'd0;
182
    end
183
 
184
    if(hdd_inst.status_drq) begin
185
 
186
        #22;
187
 
188
        for(write_count = 0; write_count < 128; write_count = write_count + 1) begin
189
            `WRITE_IO(0, 4'b1111, write_count)
190
        end
191
 
192
        #22;
193
    end
194
end
195
*/
196
 
197
//------------------------------------------------------------------------------ identify
198
 
199
/*
200
integer read_count = 0;
201
 
202
always @(posedge clk) begin
203
    if(hdd_inst.status_drq) begin
204
 
205
        #100;
206
 
207
        for(read_count=0; read_count < 128; read_count = read_count+1) begin
208
            `READ_IO(0, 4'b1111)
209
        end
210
 
211
        #100;
212
 
213
        `READ_IO(1, 4'b1000)
214
 
215
    end
216
    else begin
217
        sd_master_readdatavalid <= 1'b0;
218
        sd_master_readdata <= 3'd0;
219
    end
220
end
221
*/
222
 
223
//------------------------------------------------------------------------------
224
 
225
integer finished = 0;
226
 
227
integer identify_counter = 0;
228
 
229
reg [255:0] dumpfile_name;
230
initial begin
231
    if( $value$plusargs("dumpfile=%s", dumpfile_name) == 0 ) begin
232
        dumpfile_name = "default.vcd";
233
    end
234
 
235
    $dumpfile(dumpfile_name);
236
    $dumpvars(0);
237
    $dumpon();
238
 
239
    $display("START");
240
 
241
    rst_n = 1'b0;
242
    #10 rst_n = 1'b1;
243
 
244
    // 0x00.[31:0]:    identify write
245
    // 0x01.[16:0]:    media cylinders
246
    // 0x02.[4:0]:     media heads
247
    // 0x03.[8:0]:     media spt
248
    // 0x04.[13:0]:    media sectors per cylinder = spt * heads
249
    // 0x05.[31:0]:    media sectors total
250
    // 0x06.[31:0]:    media sd base
251
 
252
    for(identify_counter = 0; identify_counter < 128; identify_counter = identify_counter + 1) begin
253
        `WRITE_MGMT(0, (1 << 31) | (identify_counter << 24) | identify_counter) //identify
254
    end
255
 
256
    `WRITE_MGMT(1, 600)             //cylinders
257
    `WRITE_MGMT(2, 16)              //heads
258
    `WRITE_MGMT(3, 63)              //spt
259
    `WRITE_MGMT(4, 63*16)           //spc
260
    `WRITE_MGMT(5, 600*16*63)       //total
261
    `WRITE_MGMT(6, 32'h0A0B0C0D)    //sd base
262
 
263
    //-------------------------------------------------------------------------- read
264
 
265
    // 0 - data
266
    // 1 - features
267
    // 2 - sector count
268
    // 3 - sector number
269
    // 4 - cylinder low
270
    // 5 - cylinder high
271
    // 6 - lba,drive,head
272
    // 7 - command
273
    // 3f6 - reset/disable_irq
274
 
275
    /*
276
    `WRITE_IO(0, 4'b0100, 5 << 16)      //count
277
    `WRITE_IO(0, 4'b1000, 63 << 24)     //sector
278
    `WRITE_IO(1, 4'b0001, 7)            //cylinder low
279
    `WRITE_IO(1, 4'b0010, 1 << 8)       //cylinder high
280
    `WRITE_IO(1, 4'b0100, 15 << 16)      //lba,drive,head
281
 
282
    `WRITE_IO(1, 4'b1000, 32'h21 << 24) //command read
283
    */
284
 
285
    /*
286
    `WRITE_IO(0, 4'b0100, 16 << 16)      //count
287
    `WRITE_IO(1, 4'b1000, 32'hC6 << 24)  //set multiple
288
 
289
    `WRITE_IO(0, 4'b0100, 0 << 16)          //count
290
    `WRITE_IO(0, 4'b0100, 32 << 16)         //count
291
    `WRITE_IO(0, 4'b1000, 0 << 24)          //sector
292
    `WRITE_IO(0, 4'b1000, 63 << 24)         //sector
293
    `WRITE_IO(1, 4'b0001, 7)                //cylinder low
294
    `WRITE_IO(1, 4'b0010, 1 << 8)           //cylinder high
295
    `WRITE_IO(1, 4'b0100, (64+15) << 16)    //lba,drive,head
296
 
297
    `WRITE_IO(1, 4'b1000, 32'h29 << 24) //command read
298
    */
299
 
300
    //-------------------------------------------------------------------------- write
301
 
302
    /*
303
    `WRITE_IO(0, 4'b0100, 5 << 16)          //count
304
    `WRITE_IO(0, 4'b1000, 63 << 24)         //sector
305
    `WRITE_IO(1, 4'b0001, 7)                //cylinder low
306
    `WRITE_IO(1, 4'b0010, 1 << 8)           //cylinder high
307
    `WRITE_IO(1, 4'b0100, (64+0) << 16)     //lba,drive,head
308
 
309
    `WRITE_IO(1, 4'b1000, 32'h30 << 24)     //command write
310
    */
311
 
312
    //-------------------------------------------------------------------------- identify
313
 
314
    `WRITE_IO(1, 4'b1000, 32'hEC << 24)     //command identify
315
 
316
    #1000;
317
    `READ_IO(1, 4'b1000)
318
 
319
    #1000;
320
    `READ_IO(1, 4'b1000)
321
 
322
    #1000;
323
    `READ_IO(1, 4'b1000)
324
 
325
    #1000;
326
    `READ_IO(1, 4'b1000)
327
 
328
    #1000;
329
    `READ_IO(1, 4'b1000)
330
 
331
    //--------------------------------------------------------------------------
332
 
333
    while(finished == 0) begin
334
        if($time > 100000) $finish_and_return(-1);
335
        #10;
336
 
337
        //$dumpflush();
338
    end
339
 
340
    #60;
341
 
342
    $dumpoff();
343
    $finish_and_return(0);
344
end
345
 
346
endmodule

powered by: WebSVN 2.1.0

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