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

Subversion Repositories cfi_ctrl

[/] [cfi_ctrl/] [trunk/] [bench/] [verilog/] [cfi_ctrl_engine_bench.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 julius
 
2
`include "def.h"
3
`include "data.h"
4
 
5
`timescale 1ns/1ps
6
 
7
module cfi_ctrl_engine_bench();
8
 
9
 
10
  // Signal Bus
11
  wire [`ADDRBUS_dim - 1:0] A;         // Address Bus 
12
  wire [`DATABUS_dim - 1:0] DQ;        // Data I/0 Bus
13
  // Control Signal
14
  wire WE_N;                            // Write Enable 
15
  wire OE_N;                            // Output Enable
16
  wire CE_N;                            // Chip Enable
17
  wire RST_N;                           // Reset
18
  wire WP_N;                           // Write Protect
19
  wire ADV_N;                            // Latch Enable
20
  wire CLK;                              // Clock
21
  wire WAIT;                           // Wait
22
 
23
  // Voltage signal rappresentad by integer Vector which correspond to millivolts
24
  wire [`Voltage_range] VCC;  // Supply Voltage
25
  wire [`Voltage_range] VCCQ; // Supply Voltage for I/O Buffers
26
  wire [`Voltage_range] VPP; // Optional Supply Voltage for Fast Program & Erase  
27
 
28
  //wire STS;
29
 
30
  wire Info;      // Activate/Deactivate info device operation
31
assign Info = 1;
32
assign VCC = 36'd1700;
33
assign VCCQ = 36'd1700;
34
assign VPP = 36'd2000;
35
 
36
parameter sys_clk_half_period = 15.15/2;
37
parameter sys_clk_period = sys_clk_half_period*2;
38
   reg sys_clk;
39
   reg sys_rst;
40
 
41
initial begin
42
   sys_clk  = 0;
43
   forever
44
      #sys_clk_half_period sys_clk  = ~sys_clk;
45
end
46
 
47
initial begin
48
   sys_rst  = 1;
49
   #sys_clk_period;
50
   #sys_clk_period;
51
   sys_rst  = 0;
52
end
53
 
54
   reg do_rst, do_init, do_readstatus, do_clearstatus,
55
       do_eraseblock, do_write, do_read,
56
       do_unlockblock;
57
   reg [15:0] bus_dat_i;
58
   reg [23:0] bus_adr_i;
59
   wire       bus_ack_o;
60
   wire [15:0] bus_dat_o;
61
   wire        bus_busy_o;
62
 
63
/* used in testbench only */
64
   reg [7:0]   cfi_status;
65
   reg [15:0]  cfi_read_data;
66
 
67
 
68
task cfi_engine_wait_for_ready;
69
   begin
70
      while (bus_busy_o)
71
         #sys_clk_period;
72
   end
73
endtask
74
 
75
task cfi_engine_read_status;
76
   output [7:0] status_o;
77
   begin
78
      //$display("%t: Reading status ",$time);
79
      do_readstatus  = 1;
80
      #sys_clk_period;
81
      do_readstatus  = 0;
82
      while(!bus_ack_o) /* wait for ack back from internal FSMs */
83
         #sys_clk_period;
84
      //$display("%t: status: %h", $time, bus_dat_o[7:0]);
85
      status_o  = bus_dat_o[7:0];
86
      cfi_engine_wait_for_ready();
87
      /* status:
88
       7 : write status ( 0 - busy, 1 - ready )
89
       6 : erase suspend status
90
       5 : erase status ( 0 - successful, 1 - error)
91
       4 : program status ( 0  - successful, 1 - error)
92
       others aren't important
93
       */
94
   end
95
endtask
96
 
97
 
98
task cfi_engine_clear_status;
99
   begin
100
      $display("%t: Clearing status register ",$time);
101
      do_clearstatus  = 1;
102
      #sys_clk_period;
103
      do_clearstatus  = 0;
104
 
105
      cfi_engine_wait_for_ready();
106
 
107
   end
108
endtask
109
 
110
task cfi_engine_unlock_block;
111
   input [23:0] address;
112
   begin
113
      $display("%t: Unlocking block at address %h ",$time, address);
114
      bus_adr_i = address;
115
      do_unlockblock  = 1;
116
      #sys_clk_period;
117
      do_unlockblock  = 0;
118
 
119
      cfi_engine_wait_for_ready();
120
 
121
      cfi_engine_read_status(cfi_status);
122
      while (!cfi_status[7])
123
         cfi_engine_read_status(cfi_status);
124
 
125
   end
126
endtask
127
 
128
 
129
task cfi_engine_erase_block;
130
   input [23:0] address;
131
   begin
132
      $display("%t: Erasing block at address %h ",$time, address);
133
      bus_adr_i = address;
134
      do_eraseblock  = 1;
135
      #sys_clk_period;
136
      do_eraseblock  = 0;
137
 
138
      cfi_engine_wait_for_ready();
139
 
140
      cfi_engine_read_status(cfi_status);
141
      while (!cfi_status[7])
142
         cfi_engine_read_status(cfi_status);
143
 
144
      /* Check status */
145
      if (cfi_status[5])
146
         $display("$t: Erase failed for address %h",$time, address);
147
      else
148
         $display("$t: Erase succeeded for address %h",$time, address);
149
 
150
   end
151
endtask
152
 
153
 
154
task cfi_engine_write_word;
155
   input [23:0] address;
156
   input [15:0] data;
157
   begin
158
      $display("%t: Writing data %h to address %h",$time , data, address);
159
      bus_adr_i  = address;
160
      bus_dat_i = data;
161
 
162
      do_write   = 1;
163
      #sys_clk_period;
164
      do_write  = 0;
165
 
166
      cfi_engine_wait_for_ready();
167
 
168
      cfi_engine_read_status(cfi_status);
169
      while (!cfi_status[7])
170
         cfi_engine_read_status(cfi_status);
171
 
172
   end
173
endtask
174
 
175
 
176
task cfi_engine_read_word;
177
   input [23:0] address;
178
   output [15:0] data;
179
   begin
180
      $display("%t: Reading word from address %h",$time , address);
181
      bus_adr_i  = address;
182
 
183
      do_read    = 1;
184
      #sys_clk_period;
185
      do_read  = 0;
186
 
187
      cfi_engine_wait_for_ready();
188
      data = bus_dat_o;
189
 
190
   end
191
endtask // cfi_engine_read_word
192
 
193
   task cfi_engine_reset;
194
      begin
195
         $display("%t: Resetting flash device", $time);
196
 
197
         do_rst          = 1;
198
         #sys_clk_period;
199
         do_rst  = 0;
200
 
201
         cfi_engine_wait_for_ready();
202
      end
203
   endtask
204
 
205
 
206
 /* Main test stimulus block */
207
initial begin
208
   do_rst          = 0;
209
   do_init         = 0;
210
   do_readstatus   =0;
211
   do_clearstatus = 0;
212
   do_eraseblock   =0;
213
   do_unlockblock  =0;
214
   do_write        =0;
215
   do_read         =0;
216
   bus_dat_i       = 0;
217
   bus_adr_i       = 0;
218
 
219
   $dumpfile("../out/cfi_ctrl_engine_bench.vcd");
220
   $dumpvars(0);
221
   $display("Starting CFI engine test");
222
   #550; // Wait for the part to power up
223
   cfi_engine_read_status(cfi_status);
224
   cfi_engine_wait_for_ready();
225
   cfi_engine_unlock_block(24'h00_1000);
226
   cfi_engine_wait_for_ready();
227
   cfi_engine_erase_block(24'h00_1000);
228
 
229
   cfi_engine_clear_status();
230
 
231
   cfi_engine_write_word(24'h00_1000, 16'hdead);
232
   cfi_engine_write_word(24'h00_1001, 16'hcafe);
233
   cfi_engine_write_word(24'h00_1002, 16'hc001);
234
   cfi_engine_write_word(24'h00_1003, 16'h4311);
235
   cfi_engine_write_word(24'h00_1004, 16'hecc1);
236
   cfi_engine_write_word(24'h00_1005, 16'hd311);
237
 
238
   cfi_engine_read_word(24'h00_1000, cfi_read_data);
239
   cfi_engine_read_word(24'h00_1001, cfi_read_data);
240
   cfi_engine_read_word(24'h00_1002, cfi_read_data);
241
   cfi_engine_read_word(24'h00_1003, cfi_read_data);
242
   cfi_engine_read_word(24'h00_1004, cfi_read_data);
243
   cfi_engine_read_word(24'h00_1005, cfi_read_data);
244
 
245
   cfi_engine_reset();
246
 
247
   cfi_engine_read_word(24'h00_1000, cfi_read_data);
248
   cfi_engine_read_word(24'h00_1001, cfi_read_data);
249
   cfi_engine_read_word(24'h00_1002, cfi_read_data);
250
   cfi_engine_read_word(24'h00_1003, cfi_read_data);
251
   cfi_engine_read_word(24'h00_1004, cfi_read_data);
252
   cfi_engine_read_word(24'h00_1005, cfi_read_data);
253
 
254
 
255
   #1000
256
   $display("Finishing CFI engine test");
257
   $finish;
258
end
259
 
260
/* timeout function - sim shouldn't run much longer than this */
261
initial begin
262
   #55000;
263
   $display("Simulation finish due to timeout");
264
   $finish;
265
end
266
 
267
 
268
 
269
cfi_ctrl_engine
270
/*# (.cfi_part_elov_cycles(10))*/
271
dut
272
   (
273
    .clk_i(sys_clk),
274
    .rst_i(sys_rst),
275
 
276
    .do_rst_i(do_rst),
277
    .do_init_i(do_init),
278
    .do_readstatus_i(do_readstatus),
279
    .do_clearstatus_i(do_clearstatus),
280
    .do_eraseblock_i(do_eraseblock),
281
    .do_unlockblock_i(do_unlockblock),
282
    .do_write_i(do_write),
283
    .do_read_i(do_read),
284
 
285
    .bus_dat_o(bus_dat_o),
286
    .bus_dat_i(bus_dat_i),
287
    .bus_adr_i(bus_adr_i),
288
    .bus_req_done_o(bus_ack_o),
289
    .bus_busy_o(bus_busy_o),
290
 
291
    .flash_dq_io(DQ),
292
    .flash_adr_o(A),
293
    .flash_adv_n_o(ADV_N),
294
    .flash_ce_n_o(CE_N),
295
    .flash_clk_o(CLK),
296
    .flash_oe_n_o(OE_N),
297
    .flash_rst_n_o(RST_N),
298
    .flash_wait_i(WAIT),
299
    .flash_we_n_o(WE_N),
300
    .flash_wp_n_o(WP_N)
301
 
302
    );
303
 
304
x28fxxxp30 part(A, DQ, WE_N, OE_N, CE_N, ADV_N, CLK,
305
                WAIT, WP_N, RST_N, VCC, VCCQ, VPP, Info);
306
 
307
 
308
endmodule

powered by: WebSVN 2.1.0

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