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

Subversion Repositories nysa_sata

[/] [nysa_sata/] [trunk/] [sim/] [simple_tb.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 cospan
`timescale 1ns/1ps
2
 
3
`define SCLK_HALF_PERIOD 3
4
 
5
`define SCLK_PERIOD (2 * `SCLK_HALF_PERIOD)
6
 
7
`define STARTUP_TIMEOUT   32'h00000100
8
`define ERROR_TIMEOUT     32'h00000100
9
`define TXRX_TIMEOUT      32'h00001000
10
 
11
`include "sata_defines.v"
12
 
13
module simple_tb ();
14
 
15
//Parameters
16
//Registers/Wires
17
reg                 rst           = 0;            //reset
18
reg                 sata_clk      = 0;
19
 
20
wire                linkup;           //link is finished
21
wire                sata_ready;
22
wire                busy;
23
 
24
 
25
reg                 write_data_en;
26
reg                 read_data_en;
27
 
28
reg                 soft_reset_en   = 0;
29
reg         [15:0]  sector_count    = 8;
30
reg         [47:0]  sector_address  = 0;
31
 
32
wire                d2h_interrupt;
33
wire                d2h_notification;
34
wire        [3:0]   d2h_port_mult;
35
wire        [7:0]   d2h_device;
36
wire        [47:0]  d2h_lba;
37
wire        [15:0]  d2h_sector_count;
38
wire        [7:0]   d2h_status;
39
wire        [7:0]   d2h_error;
40
 
41
 
42
reg         [31:0]  user_din;
43
reg                 user_din_stb;
44
wire        [1:0]   user_din_ready;
45
reg         [1:0]   user_din_activate;
46
wire        [23:0]  user_din_size;
47
 
48
wire        [31:0]  user_dout;
49
wire                user_dout_ready;
50
reg                 user_dout_activate;
51
reg                 user_dout_stb;
52
wire        [23:0]  user_dout_size;
53
 
54
 
55
wire                transport_layer_ready;
56
wire                link_layer_ready;
57
wire                phy_ready;
58
 
59
wire    [31:0]      tx_dout;
60
wire                tx_isk;
61
wire                tx_comm_reset;
62
wire                tx_comm_wake;
63
wire                tx_elec_idle;
64
 
65
wire    [31:0]      rx_din;
66
wire    [3:0]       rx_isk;
67
wire                rx_elec_idle;
68
wire                comm_init_detect;
69
wire                comm_wake_detect;
70
 
71
wire                rx_byte_is_aligned;
72
 
73
wire                prim_scrambler_en;
74
wire                data_scrambler_en;
75
 
76
//Data Interface
77
wire                tx_set_elec_idle;
78
wire                rx_is_elec_idle;
79
wire                hd_ready;
80
wire                platform_ready;
81
 
82
//Debug
83
wire        [31:0]  hd_data_to_host;
84
 
85
reg         [23:0]  din_count;
86
reg         [23:0]  dout_count;
87
reg                 hold;
88
 
89
reg                 single_rdwr = 0;
90
 
91
 
92
reg                 clk         = 0;
93
 
94
 
95
 
96
 
97
//Submodules
98
 
99
sata_stack ss (
100
  .rst                   (rst                  ),  //reset
101
  .clk                   (sata_clk             ),  //clock used to run the stack
102
  .data_in_clk           (sata_clk             ),
103
  .data_out_clk          (sata_clk             ),
104
 
105
  .platform_ready        (platform_ready       ),  //the underlying physical platform is
106
  .linkup                (linkup               ),  //link is finished
107
  .sata_ready            (sata_ready           ),
108
 
109
 
110
  .busy                  (busy                 ),
111
 
112
 
113
  .write_data_en         (write_data_en        ),
114
  .single_rdwr           (single_rdwr          ),
115
  .read_data_en          (read_data_en         ),
116
 
117
  .send_user_command_stb (1'b0                 ),
118
  .soft_reset_en         (soft_reset_en        ),
119
  .command               (1'b0                 ),
120
 
121
  .sector_count          (sector_count         ),
122
  .sector_address        (sector_address       ),
123
 
124
  .d2h_interrupt         (d2h_interrupt        ),
125
  .d2h_notification      (d2h_notification     ),
126
  .d2h_port_mult         (d2h_port_mult        ),
127
  .d2h_device            (d2h_device           ),
128
  .d2h_lba               (d2h_lba              ),
129
  .d2h_sector_count      (d2h_sector_count     ),
130
  .d2h_status            (d2h_status           ),
131
  .d2h_error             (d2h_error            ),
132
 
133
  .user_din              (user_din             ),
134
  .user_din_stb          (user_din_stb         ),
135
  .user_din_ready        (user_din_ready       ),
136
  .user_din_activate     (user_din_activate    ),
137
  .user_din_size         (user_din_size        ),
138
 
139
  .user_dout             (user_dout            ),
140
  .user_dout_ready       (user_dout_ready      ),
141
  .user_dout_activate    (user_dout_activate   ),
142
  .user_dout_stb         (user_dout_stb        ),
143
  .user_dout_size        (user_dout_size       ),
144
 
145
  .transport_layer_ready (transport_layer_ready),
146
  .link_layer_ready      (link_layer_ready     ),
147
  .phy_ready             (phy_ready            ),
148
 
149
  .tx_dout               (tx_dout              ),
150
  .tx_isk                (tx_isk               ),
151
  .tx_comm_reset         (tx_comm_reset        ),
152
  .tx_comm_wake          (tx_comm_wake         ),
153
  .tx_elec_idle          (tx_elec_idle         ),
154
 
155
  .rx_din                (rx_din               ),
156
  .rx_isk                (rx_isk               ),
157
  .rx_elec_idle          (rx_elec_idle         ),
158
  .comm_init_detect      (comm_init_detect     ),
159
  .comm_wake_detect      (comm_wake_detect     ),
160
  .rx_byte_is_aligned    (rx_byte_is_aligned   ),
161
 
162
 
163
  .prim_scrambler_en     (prim_scrambler_en    ),
164
  .data_scrambler_en     (data_scrambler_en    )
165
);
166
 
167
faux_sata_hd  fshd   (
168
  .rst                   (rst                  ),
169
  .clk                   (sata_clk             ),
170
  .tx_dout               (rx_din               ),
171
  .tx_isk                (rx_isk               ),
172
 
173
  .rx_din                (tx_dout              ),
174
  .rx_isk                ({3'b000, tx_isk}     ),
175
  .rx_is_elec_idle       (tx_elec_idle         ),
176
  .rx_byte_is_aligned    (rx_byte_is_aligned   ),
177
 
178
  .comm_reset_detect     (tx_comm_reset        ),
179
  .comm_wake_detect      (tx_comm_wake         ),
180
 
181
  .tx_comm_reset         (comm_init_detect     ),
182
  .tx_comm_wake          (comm_wake_detect     ),
183
 
184
  .hd_ready              (hd_ready             ),
185
//  .phy_ready             (phy_ready            ),
186
 
187
 
188
  .dbg_data_scrambler_en (data_scrambler_en    ),
189
 
190
  .dbg_hold              (hold                ),
191
 
192
  .dbg_ll_write_start    (0                    ),
193
  .dbg_ll_write_data     (0                    ),
194
  .dbg_ll_write_size     (0                    ),
195
  .dbg_ll_write_hold     (0                    ),
196
  .dbg_ll_write_abort    (0                    ),
197
 
198
  .dbg_ll_read_ready     (0                    ),
199
  .dbg_t_en              (0                    ),
200
 
201
  .dbg_send_reg_stb      (0                    ),
202
  .dbg_send_dma_act_stb  (0                    ),
203
  .dbg_send_data_stb     (0                    ),
204
  .dbg_send_pio_stb      (0                    ),
205
  .dbg_send_dev_bits_stb (0                    ),
206
 
207
  .dbg_pio_transfer_count(0                    ),
208
  .dbg_pio_direction     (0                    ),
209
  .dbg_pio_e_status      (0                    ),
210
 
211
  .dbg_d2h_interrupt     (0                    ),
212
  .dbg_d2h_notification  (0                    ),
213
  .dbg_d2h_status        (0                    ),
214
  .dbg_d2h_error         (0                    ),
215
  .dbg_d2h_port_mult     (0                    ),
216
  .dbg_d2h_device        (0                    ),
217
  .dbg_d2h_lba           (0                    ),
218
  .dbg_d2h_sector_count  (0                    ),
219
 
220
  .dbg_cl_if_data        (0                    ),
221
  .dbg_cl_if_ready       (0                    ),
222
  .dbg_cl_if_size        (0                    ),
223
  .dbg_cl_of_ready       (0                    ),
224
  .dbg_cl_of_size        (0                    ),
225
  .hd_data_to_host       (hd_data_to_host      )
226
 
227
 
228
);
229
 
230
 
231
 
232
//Asynchronous Logic
233
assign  prim_scrambler_en             = 1;
234
assign  data_scrambler_en             = 1;
235
assign  platform_ready                = 1;
236
assign  hd_data_to_host               = 32'h01234567;
237
 
238
 
239
//Synchronous Logic
240
always #`SCLK_HALF_PERIOD sata_clk    = ~sata_clk;
241
always #1 clk                         = ~clk;
242
 
243
//Simulation Control
244
initial begin
245
  rst <=  1;
246
  $dumpfile ("design.vcd");
247
  $dumpvars(0, simple_tb);
248
  #(20 * `SCLK_PERIOD);
249
  rst <=  0;
250
  #40000;
251
  $finish();
252
end
253
 
254
 
255
//Simulation Conditions
256
initial begin
257
  sector_address                    <=  0;
258
  sector_count                      <=  8;
259
  write_data_en                     <=  0;
260
  read_data_en                      <=  0;
261
  single_rdwr                       <=  0;
262
 
263
  #(20 * `SCLK_PERIOD);
264
  while (!linkup) begin
265
    #1;
266
  end
267
  while (busy) begin
268
    #1;
269
  end
270
  //Send a command
271
//  #(700 * `SCLK_PERIOD);
272
  #(563 * `SCLK_PERIOD);
273
  write_data_en                     <=  1;
274
  #(1000 * `SCLK_PERIOD);
275
  while (!busy) begin
276
    #1;
277
  end
278
  write_data_en                     <=  0;
279
  #(100 * `SCLK_PERIOD);
280
 
281
 
282
  while (busy) begin
283
    #1;
284
  end
285
 
286
  #(200 * `SCLK_PERIOD);
287
  write_data_en                     <=  1;
288
  //read_data_en                     <=  1;
289
  #(20 * `SCLK_PERIOD);
290
  while (!busy) begin
291
    #1;
292
  end
293
  write_data_en                     <=  1;
294
  //read_data_en                     <=  0;
295
 
296
 
297
 
298
end
299
 
300
initial begin
301
  hold                              <=  0;
302
  #(20 * `SCLK_PERIOD);
303
  while (!write_data_en) begin
304
    #1;
305
 end
306
  #(800* `SCLK_PERIOD);
307
  hold                              <=  1;
308
  #(100 * `SCLK_PERIOD);
309
  hold                              <=  0;
310
end
311
/*
312
//inject a hold
313
initial begin
314
  hold                              <=  0;
315
  #(20 * `SCLK_PERIOD);
316
  while (!write_data_en) begin
317
    #1;
318
  end
319
  #(682 * `SCLK_PERIOD);
320
  hold                              <=  1;
321
  #(1 * `SCLK_PERIOD);
322
  hold                              <=  0;
323
end
324
*/
325
 
326
 
327
/*
328
initial begin
329
  sector_address                    <=  0;
330
  sector_count                      <=  0;
331
  write_data_en                     <=  0;
332
  read_data_en                      <=  0;
333
 
334
  #(20 * `SCLK_PERIOD);
335
  while (!linkup) begin
336
    #1;
337
  end
338
  while (busy) begin
339
    #1;
340
  end
341
  //Send a command
342
  #(824 * `SCLK_PERIOD);
343
  write_data_en                     <=  1;
344
  #(20 * `SCLK_PERIOD);
345
  while (!busy) begin
346
    #1;
347
  end
348
  write_data_en                     <=  0;
349
end
350
*/
351
 
352
//Buffer Fill/Drain
353
always @ (posedge sata_clk) begin
354
  if (rst) begin
355
    user_din                        <=  0;
356
    user_din_stb                    <=  0;
357
    user_din_activate               <=  0;
358
    din_count                       <=  0;
359
 
360
    user_dout_activate              <=  0;
361
    user_dout_stb                   <=  0;
362
    dout_count                      <=  0;
363
  end
364
  else begin
365
    user_din_stb                    <=  0;
366
    user_dout_stb                   <=  0;
367
 
368
    if ((user_din_ready > 0) && (user_din_activate == 0)) begin
369
      din_count                     <=  0;
370
      if (user_din_ready[0]) begin
371
        user_din_activate[0]        <=  1;
372
      end
373
      else begin
374
        user_din_activate[1]        <=  1;
375
      end
376
    end
377
 
378
    if (din_count >= user_din_size) begin
379
      user_din_activate            <=  0;
380
    end
381
    else if (user_din_activate > 0) begin
382
      user_din_stb                  <=  1;
383
      user_din                      <=  din_count;
384
      din_count                     <=  din_count + 1;
385
    end
386
 
387
    if (user_dout_ready && !user_dout_activate) begin
388
      dout_count                    <=  0;
389
      user_dout_activate            <=  1;
390
    end
391
 
392
    if (dout_count >= user_dout_size) begin
393
      user_dout_activate             <=  0;
394
    end
395
    else if (user_dout_activate) begin
396
      user_dout_stb                 <=  1;
397
    end
398
  end
399
end
400
 
401
 
402
endmodule

powered by: WebSVN 2.1.0

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