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

Subversion Repositories dma_axi

[/] [dma_axi/] [trunk/] [src/] [dma_axi64/] [dma_axi64_core0_ch_reg.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 eyalhoc
//---------------------------------------------------------
2
//-- File generated by RobustVerilog parser
3
//-- Version: 1.0
4
//-- Invoked Fri Mar 25 23:36:56 2011
5
//--
6
//-- Source file: dma_ch_reg.v
7
//---------------------------------------------------------
8
 
9
 
10
 
11
 
12
module dma_axi64_core0_ch_reg(clk,clken,pclken,reset,psel,penable,paddr,pwrite,pwdata,prdata,pslverr,timeout_bus,wdt_timeout,ch_start,load_addr,load_in_prog,load_req_in_prog,load_wr,load_wr_cycle,load_wdata,load_cmd,rd_ch_end,wr_ch_end,wr_clr_last,rd_slverr,rd_decerr,wr_slverr,wr_decerr,int_all_proc,ch_rd_active,ch_wr_active,ch_in_prog,rd_x_offset,rd_y_offset,wr_x_offset,wr_y_offset,wr_fullness,rd_gap,fifo_overflow,fifo_underflow,ch_update,rd_start_addr,wr_start_addr,x_size,y_size,rd_burst_max_size,wr_burst_max_size,block,allow_line_cmd,frame_width,width_align,rd_periph_delay,rd_periph_block,wr_periph_delay,wr_periph_block,rd_tokens,wr_tokens,rd_port_num,wr_port_num,rd_outs_max,wr_outs_max,rd_outs,wr_outs,outs_empty,rd_wait_limit,wr_wait_limit,rd_incr,wr_incr,rd_periph_num,wr_periph_num,wr_outstanding,rd_outstanding,ch_retry_wait,joint_mode,joint_remote,joint_cross,page_cross,joint,joint_flush,end_swap);
13
 
14
   parameter              DATA_SHIFT    = 0 ? 32 : 0;
15
 
16
 
17
   input                  clk;
18
   input              clken;
19
   input              pclken;
20
   input              reset;
21
 
22
   input              psel;
23
   input              penable;
24
   input [7:0]              paddr;
25
   input              pwrite;
26
   input [31:0]          pwdata;
27
   output [31:0]          prdata;
28
   output              pslverr;
29
 
30
   input [4:0]              timeout_bus;
31
   input              wdt_timeout;
32
 
33
   input              ch_start;
34
 
35
   output [32-1:0]      load_addr;
36
   output              load_in_prog;
37
   output              load_req_in_prog;
38
   input              load_wr;
39
   input [1:0]              load_wr_cycle;
40
   input [64-1:0]      load_wdata;
41
   input              load_cmd;
42
 
43
   input              rd_ch_end;
44
   input              wr_ch_end;
45
   input              wr_clr_last;
46
   input              rd_slverr;
47
   input              rd_decerr;
48
   input              wr_slverr;
49
   input              wr_decerr;
50
   output [1-1:0]         int_all_proc;
51
 
52
   output              ch_rd_active;
53
   output              ch_wr_active;
54
   output              ch_in_prog;
55
 
56
   input [10-1:0]      rd_x_offset;
57
   input [10-`X_BITS-1:0]          rd_y_offset;
58
   input [10-1:0]      wr_x_offset;
59
   input [10-`X_BITS-1:0]          wr_y_offset;
60
   input [5:0]          wr_fullness;
61
   input [5:0]          rd_gap;
62
   input              fifo_overflow;
63
   input              fifo_underflow;
64
 
65
   output              ch_update;
66
   output [32-1:0]      rd_start_addr;
67
   output [32-1:0]      wr_start_addr;
68
   output [10-1:0]      x_size;
69
   output [10-`X_BITS-1:0]          y_size;
70
 
71
   output [8-1:0]      rd_burst_max_size;
72
   output [8-1:0]      wr_burst_max_size;
73
   output              block;
74
   input              allow_line_cmd;
75
   output [`FRAME_BITS-1:0]      frame_width;
76
   output [3-1:0]      width_align;
77
   output [`DELAY_BITS-1:0]      rd_periph_delay;
78
   output              rd_periph_block;
79
   output [`DELAY_BITS-1:0]      wr_periph_delay;
80
   output              wr_periph_block;
81
   output [`TOKEN_BITS-1:0]      rd_tokens;
82
   output [`TOKEN_BITS-1:0]      wr_tokens;
83
   output              rd_port_num;
84
   output              wr_port_num;
85
   output [`OUT_BITS-1:0]      rd_outs_max;
86
   output [`OUT_BITS-1:0]      wr_outs_max;
87
   input [`OUT_BITS-1:0]      rd_outs;
88
   input [`OUT_BITS-1:0]      wr_outs;
89
   input              outs_empty;
90
   output [`WAIT_BITS-1:0]      rd_wait_limit;
91
   output [`WAIT_BITS-1:0]      wr_wait_limit;
92
   output              rd_incr;
93
   output              wr_incr;
94
   output [4:0]          rd_periph_num;
95
   output [4:0]          wr_periph_num;
96
   output              wr_outstanding;
97
   output              rd_outstanding;
98
   output              ch_retry_wait;
99
   input              joint_mode;
100
   input              joint_remote;
101
   input              joint_cross;
102
   input              page_cross;
103
   output              joint;
104
   input              joint_flush;
105
   output [1:0]          end_swap;
106
 
107
 
108
`include "dma_axi64_ch_reg_params.v"
109
 
110
 
111
  parameter     INT_NUM = 13;
112
 
113
 
114
   wire [7:0]              gpaddr;
115
   wire              gpwrite;
116
   wire              gpread;
117
   reg [31:0]              prdata_pre;
118
   reg                  pslverr_pre;
119
   reg [31:0]              prdata;
120
   reg                  pslverr;
121
 
122
   reg                  ch_enable;
123
   reg                  ch_in_prog;
124
   reg                  rd_ch_in_prog;
125
   reg                  wr_ch_in_prog;
126
   reg                  load_in_prog_reg;
127
   reg                  load_req_in_prog_reg;
128
 
129
   //current cmd
130
   reg [32-1:0]          rd_start_addr;
131
   reg [32-1:0]          wr_start_addr;
132
   reg [10-1:0]          buff_size;
133
   wire [10-1:0]      x_size;
134
   wire [10-`X_BITS-1:0]          y_size;
135
 
136
   reg [`FRAME_BITS-1:0]      frame_width_reg;
137
   reg                  block_reg;
138
   reg                  joint_reg;
139
   reg                  simple_mem;
140
   wire              joint;
141
   wire              joint_mux;
142
   reg                  auto_retry_reg;
143
   wire              auto_retry;
144
   reg [1:0]              end_swap_reg;
145
 
146
   //static
147
   wire [8-1:0]      rd_burst_max_size_rd;
148
   wire [8-1:0]      rd_burst_max_size_pre;
149
   reg [8-1:0]      rd_burst_max_size_reg;
150
   reg [`DELAY_BITS-1:0]      rd_periph_delay_reg;
151
   reg                  rd_periph_block_reg;
152
   reg [`TOKEN_BITS-1:0]      rd_tokens_reg;
153
   reg [`OUT_BITS-1:0]          rd_outs_max_reg;
154
   reg                  rd_port_num_reg;
155
   reg                  cmd_port_num_reg;
156
   wire              rd_port_num_cfg;
157
   wire              cmd_port_num;
158
   reg                  rd_outstanding_reg;
159
   wire              rd_outstanding_cfg;
160
   reg                  rd_incr_reg;
161
   reg [4:0]              rd_periph_num_reg;
162
   reg [`WAIT_BITS-1:4]      rd_wait_limit_reg;
163
 
164
   wire [8-1:0]      wr_burst_max_size_rd;
165
   wire [8-1:0]      wr_burst_max_size_pre;
166
   reg [8-1:0]      wr_burst_max_size_reg;
167
   reg [`DELAY_BITS-1:0]      wr_periph_delay_reg;
168
   reg                  wr_periph_block_reg;
169
   reg [`TOKEN_BITS-1:0]      wr_tokens_reg;
170
   reg [`OUT_BITS-1:0]          wr_outs_max_reg;
171
   reg                  wr_port_num_reg;
172
   reg                  wr_outstanding_reg;
173
   wire              wr_outstanding_cfg;
174
   reg                  wr_incr_reg;
175
   reg [4:0]              wr_periph_num_reg;
176
   reg [`WAIT_BITS-1:4]      wr_wait_limit_reg;
177
 
178
   wire              rd_allow_full_fifo;
179
   wire              wr_allow_full_fifo;
180
   wire              allow_full_fifo;
181
   wire              allow_full_burst;
182
   wire              allow_joint_burst;
183
   wire              burst_max_size_update_pre;
184
   wire              burst_max_size_update;
185
 
186
   reg                  cmd_set_int_reg;
187
   reg                  cmd_last_reg;
188
   reg [32-1:2]          cmd_next_addr_reg;
189
   reg [`CMD_CNT_BITS-1:0]      cmd_counter_reg;
190
   reg [`INT_CNT_BITS-1:0]      int_counter_reg;
191
   wire              cmd_set_int;
192
   wire              cmd_last;
193
   wire [32-1:2]      cmd_next_addr;
194
   wire [`CMD_CNT_BITS-1:0]      cmd_counter;
195
   wire [`INT_CNT_BITS-1:0]      int_counter;
196
 
197
   //interrupt
198
   wire              ch_end;
199
   wire              ch_end_set;
200
   wire              ch_end_clear;
201
   wire              ch_end_int;
202
   wire [2:0]              int_proc_num;
203
   reg [2:0]              int_proc_num_reg;
204
   wire [INT_NUM-1:0]          int_bus;
205
   wire [INT_NUM-1:0]          int_rawstat;
206
   reg [INT_NUM-1:0]          int_enable;
207
   wire [INT_NUM-1:0]          int_status;
208
   wire [7:0]                    int_all_proc_bus;
209
 
210
   wire              wr_cmd_line0;
211
   wire              wr_cmd_line1;
212
   wire              wr_cmd_line2;
213
   wire              wr_cmd_line3;
214
   wire              wr_static_line0;
215
   wire              wr_static_line1;
216
   wire              wr_static_line2;
217
   wire              wr_static_line3;
218
   wire              wr_static_line4;
219
   wire              wr_ch_enable;
220
   wire              wr_ch_start;
221
   wire              wr_int_rawstat;
222
   wire              wr_int_clear;
223
   wire              wr_int_enable;
224
   wire              wr_frame_width;
225
 
226
   reg [31:0]              rd_cmd_line0;
227
   reg [31:0]              rd_cmd_line1;
228
   reg [31:0]              rd_cmd_line2;
229
   reg [31:0]              rd_cmd_line3;
230
   reg [31:0]              rd_static_line0;
231
   reg [31:0]              rd_static_line1;
232
   reg [31:0]              rd_static_line2;
233
   reg [31:0]              rd_static_line3;
234
   reg [31:0]              rd_static_line4;
235
   reg [31:0]              rd_restrict;
236
   reg [31:0]              rd_rd_offsets;
237
   reg [31:0]              rd_wr_offsets;
238
   reg [31:0]              rd_fifo_fullness;
239
   reg [31:0]              rd_cmd_outs;
240
   reg [31:0]              rd_ch_enable;
241
   reg [31:0]              rd_ch_active;
242
   reg [31:0]              rd_cmd_counter;
243
   reg [31:0]              rd_int_rawstat;
244
   reg [31:0]              rd_int_enable;
245
   reg [31:0]              rd_int_status;
246
 
247
   wire              load_wr_cycle0;
248
   wire              load_wr_cycle1;
249
   wire              load_wr_cycle2;
250
   wire              load_wr_cycle3;
251
   wire              load_wr0;
252
   wire              load_wr1;
253
   wire              load_wr2;
254
   wire              load_wr3;
255
   wire              load_wr_last;
256
   wire              load_req;
257
 
258
   wire              timeout_aw;
259
   wire              timeout_w;
260
   wire              timeout_b;
261
   wire              timeout_ar;
262
   wire              timeout_r;
263
 
264
   wire              ch_retry_wait_pre;
265
   reg                  ch_retry_wait_reg;
266
   wire              ch_retry_wait;
267
   wire              ch_retry;
268
   wire              ch_update_pre;
269
   reg                  ch_update;
270
   wire              ch_update_d;
271
 
272
   wire              ch_int;
273
 
274
 
275
   //---------------------- gating -------------------------------------
276
 
277
 
278
   //assign             gpaddr      = {8{psel}} & paddr;
279
   assign             gpaddr      = paddr; //removed for timing
280
   assign             gpwrite     = psel & (~penable) & pwrite;
281
   assign             gpread      = psel & (~penable) & (~pwrite);
282
 
283
 
284
   //---------------------- Write Operations ----------------------------------
285
   assign             wr_cmd_line0      = gpwrite & gpaddr == CMD_LINE0;
286
   assign             wr_cmd_line1      = gpwrite & gpaddr == CMD_LINE1;
287
   assign             wr_cmd_line2      = gpwrite & gpaddr == CMD_LINE2;
288
   assign             wr_cmd_line3      = gpwrite & gpaddr == CMD_LINE3;
289
   assign             wr_static_line0   = gpwrite & gpaddr == STATIC_LINE0;
290
   assign             wr_static_line1   = gpwrite & gpaddr == STATIC_LINE1;
291
   assign             wr_static_line2   = gpwrite & gpaddr == STATIC_LINE2;
292
   assign             wr_static_line3   = gpwrite & gpaddr == STATIC_LINE3;
293
   assign             wr_static_line4   = gpwrite & gpaddr == STATIC_LINE4;
294
   assign             wr_ch_enable      = gpwrite & gpaddr == CH_ENABLE;
295
   assign             wr_ch_start       = (gpwrite & gpaddr == CH_START) | ch_start;
296
   assign             wr_int_rawstat    = gpwrite & gpaddr == INT_RAWSTAT;
297
   assign             wr_int_clear      = gpwrite & gpaddr == INT_CLEAR;
298
   assign             wr_int_enable     = gpwrite & gpaddr == INT_ENABLE;
299
 
300
   assign             load_wr_cycle0 = load_wr & load_wr_cycle == 2'd0;
301
   assign             load_wr_cycle1 = load_wr & load_wr_cycle == 2'd1;
302
   assign             load_wr_cycle2 = load_wr & load_wr_cycle == 2'd2;
303
   assign             load_wr_cycle3 = load_wr & load_wr_cycle == 2'd3;
304
 
305
   assign             load_wr0 = 0 ? load_wr_cycle0 : load_wr_cycle0;
306
   assign             load_wr1 = 0 ? load_wr_cycle1 : load_wr_cycle0;
307
   assign             load_wr2 = 0 ? load_wr_cycle2 : load_wr_cycle1;
308
   assign             load_wr3 = 0 ? load_wr_cycle3 : load_wr_cycle1;
309
 
310
   assign             load_wr_last       = load_wr3;
311
 
312
 
313
 
314
 
315
   always @(posedge clk or posedge reset)
316
     if (reset)
317
       begin
318
      rd_start_addr <= #1 {32{1'b0}};
319
       end
320
     else if (wr_cmd_line0)
321
       begin
322
      rd_start_addr <= #1 pwdata[32-1:0];
323
       end
324
     else if (load_wr0)
325
       begin
326
      rd_start_addr <= #1 load_wdata[32-1:0];
327
       end
328
 
329
   always @(posedge clk or posedge reset)
330
     if (reset)
331
       begin
332
      wr_start_addr <= #1 {32{1'b0}};
333
       end
334
     else if (wr_cmd_line1)
335
       begin
336
      wr_start_addr <= #1 pwdata[32-1:0];
337
       end
338
     else if (load_wr1)
339
       begin
340
      wr_start_addr <= #1 load_wdata[32+32-DATA_SHIFT-1:32-DATA_SHIFT];
341
       end
342
 
343
   always @(posedge clk or posedge reset)
344
     if (reset)
345
       begin
346
      buff_size <= #1 {10{1'b0}};
347
       end
348
     else if (wr_cmd_line2)
349
       begin
350
      buff_size <= #1 pwdata[10-1:0];
351
       end
352
     else if (load_wr2)
353
       begin
354
      buff_size <= #1 load_wdata[10-1:0];
355
       end
356
 
357
   always @(posedge clk or posedge reset)
358
     if (reset)
359
       begin
360
     cmd_set_int_reg   <= #1 1'b0;
361
     cmd_last_reg      <= #1 1'b0;
362
     cmd_next_addr_reg <= #1 {30{1'b0}};
363
       end
364
     else if (wr_cmd_line3)
365
       begin
366
      cmd_set_int_reg   <= #1 pwdata[0];
367
      cmd_last_reg      <= #1 pwdata[1];
368
      cmd_next_addr_reg <= #1 pwdata[32-1:2];
369
       end
370
     else if (load_wr3)
371
       begin
372
      cmd_set_int_reg   <= #1 load_wdata[32-DATA_SHIFT];
373
      cmd_last_reg      <= #1 load_wdata[33-DATA_SHIFT];
374
      cmd_next_addr_reg <= #1 load_wdata[32+32-DATA_SHIFT-1:34-DATA_SHIFT];
375
       end
376
 
377
   always @(posedge clk or posedge reset)
378
     if (reset)
379
       cmd_counter_reg <= #1 {`CMD_CNT_BITS{1'b0}};
380
     else if (wr_ch_start)
381
       cmd_counter_reg <= #1 {`CMD_CNT_BITS{1'b0}};
382
     else if (ch_end & clken)
383
       cmd_counter_reg <= #1 cmd_counter_reg + 1'b1;
384
 
385
 
386
   always @(posedge clk or posedge reset)
387
     if (reset)
388
       int_counter_reg <= #1 {`INT_CNT_BITS{1'b0}};
389
     else if (wr_ch_start)
390
       int_counter_reg <= #1 {`INT_CNT_BITS{1'b0}};
391
     else if ((ch_end_int & clken) | ch_end_clear)
392
       int_counter_reg <= #1 int_counter_reg + (ch_end_int & clken) - ch_end_clear;
393
 
394
   assign cmd_set_int   = cmd_set_int_reg;
395
   assign cmd_last      = cmd_last_reg;
396
   assign cmd_next_addr = cmd_next_addr_reg;
397
 
398
   assign cmd_counter   = cmd_counter_reg;
399
   assign int_counter   = int_counter_reg;
400
 
401
 
402
   assign x_size = block ? {{10-`X_BITS{1'b0}}, buff_size[`X_BITS-1:0]} : buff_size;
403
   assign y_size = block ? buff_size[10-1:`X_BITS] : 'd1;
404
 
405
 
406
   always @(posedge clk or posedge reset)
407
     if (reset)
408
       begin
409
            rd_burst_max_size_reg <= #1 'd0;
410
   rd_tokens_reg         <= #1 'd1;
411
    rd_outs_max_reg       <= #1 {`OUT_BITS{1'b0}};
412
            rd_incr_reg           <= #1 'd1;
413
       end
414
     else if (wr_static_line0)
415
       begin
416
            rd_burst_max_size_reg <= #1 pwdata[8-1:0];
417
  rd_tokens_reg         <= #1 pwdata[`TOKEN_BITS+16-1:16];
418
     rd_outs_max_reg       <= #1 pwdata[`OUT_BITS+24-1:24];
419
            rd_incr_reg           <= #1 pwdata[31];
420
       end
421
 
422
 
423
   always @(posedge clk or posedge reset)
424
     if (reset)
425
       begin
426
            wr_burst_max_size_reg <= #1 'd0;
427
  wr_tokens_reg         <= #1 'd1;
428
     wr_outs_max_reg       <= #1 {`OUT_BITS{1'b0}};
429
      wr_incr_reg           <= #1 'd1;
430
       end
431
     else if (wr_static_line1)
432
       begin
433
      wr_burst_max_size_reg <= #1 pwdata[8-1:0];
434
  wr_tokens_reg         <= #1 pwdata[`TOKEN_BITS+16-1:16];
435
     wr_outs_max_reg       <= #1 pwdata[`OUT_BITS+24-1:24];
436
      wr_incr_reg           <= #1 pwdata[31];
437
       end
438
 
439
   assign rd_incr = rd_incr_reg;
440
   assign wr_incr = wr_incr_reg;
441
 
442
   assign rd_outstanding_cfg = 1'b0;
443
   assign wr_outstanding_cfg = 1'b0;
444
   assign rd_outstanding     = 1'b0;
445
   assign wr_outstanding     = 1'b0;
446
 
447
   assign rd_tokens = rd_tokens_reg;
448
   assign wr_tokens = joint_mux ? rd_tokens_reg : wr_tokens_reg;
449
 
450
   assign rd_outs_max = rd_outs_max_reg;
451
   assign wr_outs_max = joint_mux ? rd_outs_max_reg : wr_outs_max_reg;
452
 
453
 
454
   assign rd_allow_full_fifo = rd_start_addr[5-1:0] == 'd0;
455
   assign wr_allow_full_fifo = wr_start_addr[5-1:0] == 'd0;
456
 
457
   assign allow_full_fifo    = rd_allow_full_fifo & wr_allow_full_fifo;
458
 
459
   assign rd_burst_max_size  = rd_burst_max_size_pre;
460
   assign wr_burst_max_size  = joint_mux ? rd_burst_max_size_pre : wr_burst_max_size_pre;
461
 
462
   assign allow_joint_burst  = joint & (~joint_flush) & (~page_cross) & (~joint_cross);
463
 
464
  assign allow_full_burst   = allow_joint_burst;
465
 
466
   assign burst_max_size_update_pre = ch_update | ch_update_d | joint;
467
 
468
   prgen_delay #(1) delay_max_size_update (.clk(clk), .reset(reset), .din(burst_max_size_update_pre), .dout(burst_max_size_update));
469
 
470
   dma_axi64_core0_ch_reg_size
471
   dma_axi64_core0_ch_reg_size_rd (
472
                .clk(clk),
473
                .reset(reset),
474
                .update(burst_max_size_update),
475
                .start_addr(rd_start_addr),
476
                .burst_max_size_reg(rd_burst_max_size_reg),
477
                .burst_max_size_other(wr_burst_max_size_rd),
478
                .allow_full_burst(allow_full_burst),
479
                .allow_full_fifo(allow_full_fifo),
480
                .joint_flush(joint_flush),
481
                .burst_max_size(rd_burst_max_size_pre)
482
                );
483
 
484
 
485
   dma_axi64_core0_ch_reg_size
486
   dma_axi64_core0_ch_reg_size_wr (
487
                .clk(clk),
488
                .reset(reset),
489
                .update(burst_max_size_update),
490
                .start_addr(wr_start_addr),
491
                .burst_max_size_reg(wr_burst_max_size_reg),
492
                .burst_max_size_other(rd_burst_max_size_reg),
493
                .allow_full_burst(1'b0),
494
                .allow_full_fifo(allow_full_fifo),
495
                .joint_flush(joint_flush),
496
                .burst_max_size(wr_burst_max_size_pre)
497
                );
498
 
499
 
500
   always @(posedge clk or posedge reset)
501
     if (reset)
502
       begin
503
                 joint_reg        <= #1 1'b1;
504
         end_swap_reg     <= #1 2'b00;
505
       end
506
     else if (wr_static_line2)
507
       begin
508
                 joint_reg        <= #1 pwdata[16];
509
         end_swap_reg     <= #1 pwdata[29:28];
510
       end
511
 
512
 
513
   always @(posedge clk or posedge reset)
514
     if (reset)
515
       simple_mem <= #1 1'b0;
516
     else if (ch_update)
517
       simple_mem <= #1 (rd_periph_num == 'd0) & (wr_periph_num == 'd0) & (~allow_line_cmd);
518
 
519
   assign joint     = joint_mode & joint_reg & simple_mem & 1'b1;
520
 
521
   assign joint_mux = joint;
522
 
523
 
524
 
525
   assign cmd_port_num     = 1'b0;
526
   assign rd_port_num_cfg  = 1'b0;
527
   assign wr_port_num      = 1'b0;
528
   assign rd_port_num      = 1'b0;
529
 
530
 
531
   assign frame_width = {`FRAME_BITS{1'b0}};
532
   assign block       = 1'b0;
533
 
534
   assign width_align = frame_width[3-1:0];
535
 
536
 
537
   assign rd_wait_limit = {`WAIT_BITS-4{1'b0}};
538
   assign wr_wait_limit = {`WAIT_BITS-4{1'b0}};
539
 
540
 
541
 
542
   always @(posedge clk or posedge reset)
543
     if (reset)
544
       begin
545
          rd_periph_num_reg   <= #1 'd0; //0 is memory
546
          rd_periph_delay_reg <= #1 'd0; //0 is memory
547
            wr_periph_num_reg   <= #1 'd0; //0 is memory
548
          wr_periph_delay_reg <= #1 'd0; //0 is memory
549
       end
550
     else if (wr_static_line4)
551
       begin
552
          rd_periph_num_reg   <= #1 pwdata[4:0];
553
          rd_periph_delay_reg <= #1 pwdata[`DELAY_BITS+8-1:8];
554
          wr_periph_num_reg   <= #1 pwdata[20:16];
555
          wr_periph_delay_reg <= #1 pwdata[`DELAY_BITS+24-1:24];
556
       end
557
 
558
   assign rd_periph_num   = rd_periph_num_reg;
559
   assign wr_periph_num   = wr_periph_num_reg;
560
   assign rd_periph_delay = rd_periph_delay_reg;
561
   assign wr_periph_delay = wr_periph_delay_reg;
562
 
563
   assign rd_periph_block = 1'b0;
564
   assign wr_periph_block = 1'b0;
565
 
566
 
567
 
568
   always @(posedge clk or posedge reset)
569
     if (reset)
570
       begin
571
      ch_enable <= #1 1'b1;
572
       end
573
     else if (wr_ch_enable)
574
       begin
575
      ch_enable <= #1 pwdata[0];
576
       end
577
 
578
   always @(posedge clk or posedge reset)
579
     if (reset)
580
       ch_in_prog <= #1 1'b0;
581
     else if (ch_update)
582
       ch_in_prog <= #1 1'b1;
583
     else if (ch_end & clken)
584
       ch_in_prog <= #1 1'b0;
585
 
586
   always @(posedge clk or posedge reset)
587
     if (reset)
588
       rd_ch_in_prog <= #1 1'b0;
589
     else if (ch_update)
590
       rd_ch_in_prog <= #1 1'b1;
591
     else if (fifo_underflow | fifo_overflow)
592
       rd_ch_in_prog <= #1 1'b0;
593
     else if (rd_ch_end & clken)
594
       rd_ch_in_prog <= #1 1'b0;
595
 
596
   always @(posedge clk or posedge reset)
597
     if (reset)
598
       wr_ch_in_prog <= #1 1'b0;
599
     else if (ch_update)
600
       wr_ch_in_prog <= #1 1'b1;
601
     else if (fifo_underflow | fifo_overflow)
602
       wr_ch_in_prog <= #1 1'b0;
603
     else if (wr_ch_end & clken)
604
       wr_ch_in_prog <= #1 1'b0;
605
 
606
   always @(posedge clk or posedge reset)
607
     if (reset)
608
       load_in_prog_reg <= #1 1'b0;
609
     else if (load_req & clken)
610
       load_in_prog_reg <= #1 1'b1;
611
     else if (ch_update & clken)
612
       load_in_prog_reg <= #1 1'b0;
613
 
614
   always @(posedge clk or posedge reset)
615
     if (reset)
616
       load_req_in_prog_reg <= #1 1'b0;
617
     else if (load_req & clken)
618
       load_req_in_prog_reg <= #1 1'b1;
619
     else if (load_cmd & clken)
620
       load_req_in_prog_reg <= #1 1'b0;
621
 
622
   assign load_in_prog     = load_in_prog_reg;
623
   assign load_req_in_prog = load_req_in_prog_reg;
624
 
625
   assign auto_retry    = 1'b0;
626
   assign ch_retry_wait = 1'b0;
627
   assign ch_retry      = 1'b0;
628
 
629
   assign ch_update_pre = wr_ch_start | load_wr_last | ch_retry;
630
 
631
   always @(posedge clk or posedge reset)
632
     if (reset)
633
       ch_update <= #1 1'b0;
634
     else if (ch_update_pre)
635
       ch_update <= #1 1'b1;
636
     else if (clken)
637
       ch_update <= #1 1'b0;
638
 
639
   prgen_delay #(1) delay_ch_update (.clk(clk), .reset(reset), .din(ch_update), .dout(ch_update_d));
640
 
641
   assign load_req       = (ch_enable & ch_end & (~cmd_last)) | (ch_update & (x_size == 'd0));
642
   assign load_addr      = {cmd_next_addr[32-1:2], 2'b00};
643
 
644
   assign ch_end         = rd_ch_end & wr_ch_end & wr_clr_last & (~ch_retry_wait);
645
 
646
   assign ch_end_int     = ch_enable & ch_end & cmd_set_int;
647
   assign ch_rd_active   = ch_enable & (rd_ch_in_prog | load_req_in_prog);
648
   assign ch_wr_active   = ch_enable & wr_ch_in_prog;
649
 
650
   assign ch_end_set     = |int_counter;
651
   assign ch_end_clear   = wr_int_clear & pwdata[0];
652
 
653
   assign {timeout_aw,
654
           timeout_w,
655
           timeout_b,
656
           timeout_ar,
657
           timeout_r} = timeout_bus[4:0];
658
 
659
 
660
 
661
   assign int_bus        = {INT_NUM{clken}} & {
662
                           wdt_timeout,
663
                           timeout_aw,
664
                           timeout_w,
665
                           timeout_b,
666
                           timeout_ar,
667
                           timeout_r,
668
                           fifo_underflow,
669
                           fifo_overflow,
670
                           wr_decerr,
671
                           rd_decerr,
672
                           wr_slverr,
673
                           rd_slverr,
674
                           ch_end_set
675
                           };
676
 
677
   prgen_rawstat #(INT_NUM) rawstat(
678
                    .clk(clk),
679
                    .reset(reset),
680
                    .clear(wr_int_clear),
681
                    .write(wr_int_rawstat),
682
                    .pwdata(pwdata[INT_NUM-1:0]),
683
                    .int_bus(int_bus),
684
                    .rawstat(int_rawstat)
685
                    );
686
 
687
 
688
   always @(posedge clk or posedge reset)
689
     if (reset)
690
       int_enable <= #1 {INT_NUM{1'b1}};
691
     else if (wr_int_enable)
692
       int_enable <= #1 pwdata[INT_NUM-1:0];
693
 
694
   assign int_status = int_rawstat & int_enable;
695
 
696
   assign ch_int     = |int_status;
697
 
698
   assign int_proc_num = 3'd0;
699
   assign int_all_proc = ch_int;
700
 
701
   assign end_swap = end_swap_reg;
702
 
703
   //---------------------- Read Operations -----------------------------------  
704
   assign rd_burst_max_size_rd = rd_burst_max_size_reg;
705
   assign wr_burst_max_size_rd = wr_burst_max_size_reg;
706
 
707
 
708
   //always @(/*AUTOSENSE*/) - no AUTOSENSE because of include file  
709
   always @(allow_full_burst or allow_full_fifo
710
        or allow_joint_burst or allow_line_cmd or auto_retry
711
        or block or buff_size or ch_enable or ch_rd_active
712
        or ch_wr_active or cmd_counter or cmd_last
713
        or cmd_next_addr or cmd_port_num or cmd_set_int
714
        or end_swap or frame_width or int_counter or int_enable
715
        or int_proc_num or int_rawstat or int_status or joint_reg
716
        or rd_allow_full_fifo or rd_burst_max_size_rd or rd_gap
717
        or rd_incr or rd_outs or rd_outs_max or rd_outstanding
718
        or rd_outstanding_cfg or rd_periph_block_reg
719
        or rd_periph_delay or rd_periph_num or rd_port_num_cfg
720
        or rd_start_addr or rd_tokens or rd_wait_limit
721
        or rd_x_offset or rd_y_offset or simple_mem
722
        or wr_allow_full_fifo or wr_burst_max_size_rd
723
        or wr_fullness or wr_incr or wr_outs or wr_outs_max
724
        or wr_outstanding or wr_outstanding_cfg
725
        or wr_periph_block_reg or wr_periph_delay or wr_periph_num
726
        or wr_port_num or wr_start_addr or wr_tokens
727
        or wr_wait_limit or wr_x_offset or wr_y_offset)
728
     begin
729
    rd_cmd_line0     = {32{1'b0}};
730
    rd_cmd_line1     = {32{1'b0}};
731
    rd_cmd_line2     = {32{1'b0}};
732
    rd_cmd_line3     = {32{1'b0}};
733
    rd_static_line0  = {32{1'b0}};
734
    rd_static_line1  = {32{1'b0}};
735
    rd_static_line2  = {32{1'b0}};
736
    rd_static_line3  = {32{1'b0}};
737
    rd_static_line4  = {32{1'b0}};
738
    rd_restrict      = {32{1'b0}};
739
     rd_rd_offsets    = {32{1'b0}};
740
     rd_wr_offsets    = {32{1'b0}};
741
      rd_fifo_fullness = {32{1'b0}};
742
      rd_cmd_outs      = {32{1'b0}};
743
    rd_ch_enable     = {32{1'b0}};
744
    rd_ch_active     = {32{1'b0}};
745
    rd_cmd_counter   = {32{1'b0}};
746
    rd_int_rawstat   = {32{1'b0}};
747
    rd_int_enable    = {32{1'b0}};
748
    rd_int_status    = {32{1'b0}};
749
 
750
 
751
    rd_cmd_line0[32-1:0]           = rd_start_addr;
752
 
753
    rd_cmd_line1[32-1:0]           = wr_start_addr;
754
 
755
    rd_cmd_line2[10-1:0]           = buff_size;
756
 
757
    rd_cmd_line3[0]                       = cmd_set_int;
758
    rd_cmd_line3[1]                       = cmd_last;
759
    rd_cmd_line3[32-1:2]           = cmd_next_addr;
760
 
761
    rd_static_line0[8-1:0]       = rd_burst_max_size_rd;
762
    rd_static_line0[`TOKEN_BITS+16-1:16]  = rd_tokens;
763
    rd_static_line0[`OUT_BITS+24-1:24]    = rd_outs_max;
764
    rd_static_line0[30]                   = rd_outstanding_cfg;
765
    rd_static_line0[31]                   = rd_incr;
766
 
767
    rd_static_line1[8-1:0]       = wr_burst_max_size_rd;
768
    rd_static_line1[`TOKEN_BITS+16-1:16]  = wr_tokens;
769
    rd_static_line1[`OUT_BITS+24-1:24]    = wr_outs_max;
770
    rd_static_line1[30]                   = wr_outstanding_cfg;
771
    rd_static_line1[31]                   = wr_incr;
772
 
773
    rd_static_line2[`FRAME_BITS-1:0]      = frame_width;
774
    rd_static_line2[15]                   = block;
775
    rd_static_line2[16]                   = joint_reg;
776
    rd_static_line2[17]                   = auto_retry;
777
    rd_static_line2[20]                   = cmd_port_num;
778
    rd_static_line2[21]                   = rd_port_num_cfg;
779
    rd_static_line2[22]                   = wr_port_num;
780
    rd_static_line2[26:24]                = int_proc_num;
781
    rd_static_line2[29:28]                = end_swap;
782
 
783
 
784
    rd_static_line4[4:0]                  = rd_periph_num;
785
    rd_static_line4[`DELAY_BITS+8-1:8]    = rd_periph_delay;
786
    rd_static_line4[20:16]                = wr_periph_num;
787
    rd_static_line4[`DELAY_BITS+24-1:24]  = wr_periph_delay;
788
 
789
    rd_restrict[0]                        = rd_allow_full_fifo;
790
    rd_restrict[1]                        = wr_allow_full_fifo;
791
    rd_restrict[2]                        = allow_full_fifo;
792
    rd_restrict[3]                        = allow_full_burst;
793
    rd_restrict[4]                        = allow_joint_burst;
794
    rd_restrict[5]                        = rd_outstanding;
795
    rd_restrict[6]                        = wr_outstanding;
796
    rd_restrict[7]                        = allow_line_cmd;
797
    rd_restrict[8]                        = simple_mem;
798
 
799
    rd_rd_offsets[10-1:0]          = rd_x_offset;
800
    rd_rd_offsets[10-`X_BITS+16-1:16]     = rd_y_offset;
801
 
802
    rd_wr_offsets[10-1:0]          = wr_x_offset;
803
    rd_wr_offsets[10-`X_BITS+16-1:16]     = wr_y_offset;
804
 
805
    rd_fifo_fullness[5:0]           = rd_gap;
806
    rd_fifo_fullness[5+16:16]     = wr_fullness;
807
 
808
    rd_cmd_outs[`OUT_BITS-1:0]            = rd_outs;
809
    rd_cmd_outs[`OUT_BITS-1+8:8]          = wr_outs;
810
 
811
    rd_ch_enable[0]                       = ch_enable;
812
 
813
    rd_ch_active[0]                       = ch_rd_active;
814
    rd_ch_active[1]                       = ch_wr_active;
815
 
816
    rd_cmd_counter[`CMD_CNT_BITS-1:0]     = cmd_counter;
817
    rd_cmd_counter[`INT_CNT_BITS-1+16:16] = int_counter;
818
 
819
    rd_int_rawstat[INT_NUM-1:0]           = int_rawstat;
820
 
821
    rd_int_enable[INT_NUM-1:0]            = int_enable;
822
 
823
    rd_int_status[INT_NUM-1:0]            = int_status;
824
     end
825
 
826
 
827
   //always @(/*AUTOSENSE*/) - no AUTOSENSE because of include file
828
   always @(gpaddr or rd_ch_active or rd_ch_enable
829
        or rd_cmd_counter or rd_cmd_line0 or rd_cmd_line1
830
        or rd_cmd_line2 or rd_cmd_line3 or rd_cmd_outs
831
        or rd_fifo_fullness or rd_int_enable or rd_int_rawstat
832
        or rd_int_status or rd_rd_offsets or rd_restrict
833
        or rd_static_line0 or rd_static_line1 or rd_static_line2
834
        or rd_static_line3 or rd_static_line4 or rd_wr_offsets)
835
     begin
836
    prdata_pre  = {32{1'b0}};
837
 
838
    case (gpaddr)
839
      CMD_LINE0                 : prdata_pre  = rd_cmd_line0;
840
      CMD_LINE1                 : prdata_pre  = rd_cmd_line1;
841
      CMD_LINE2                 : prdata_pre  = rd_cmd_line2;
842
      CMD_LINE3                 : prdata_pre  = rd_cmd_line3;
843
 
844
      STATIC_LINE0              : prdata_pre  = rd_static_line0;
845
      STATIC_LINE1              : prdata_pre  = rd_static_line1;
846
      STATIC_LINE2              : prdata_pre  = rd_static_line2;
847
      STATIC_LINE3              : prdata_pre  = rd_static_line3;
848
      STATIC_LINE4              : prdata_pre  = rd_static_line4;
849
 
850
      RESTRICT                  : prdata_pre  = rd_restrict;
851
      RD_OFFSETS                : prdata_pre  = rd_rd_offsets;
852
      WR_OFFSETS                : prdata_pre  = rd_wr_offsets;
853
      FIFO_FULLNESS             : prdata_pre  = rd_fifo_fullness;
854
      CMD_OUTS                  : prdata_pre  = rd_cmd_outs;
855
 
856
      CH_ENABLE                 : prdata_pre  = rd_ch_enable;
857
      CH_START                  : prdata_pre  = {32{1'b0}};
858
      CH_ACTIVE                 : prdata_pre  = rd_ch_active;
859
      CH_CMD_COUNTER            : prdata_pre  = rd_cmd_counter;
860
 
861
      INT_RAWSTAT               : prdata_pre  = rd_int_rawstat;
862
      INT_CLEAR                 : prdata_pre  = {32{1'b0}};
863
      INT_ENABLE                : prdata_pre  = rd_int_enable;
864
      INT_STATUS                : prdata_pre  = rd_int_status;
865
 
866
      default                   : prdata_pre  = {32{1'b0}};
867
    endcase
868
     end
869
 
870
 
871
   //always @(/*AUTOSENSE*/) - no AUTOSENSE because of include file
872
   always @(gpaddr or gpread or gpwrite or psel)
873
     begin
874
    pslverr_pre = 1'b0;
875
 
876
    case (gpaddr)
877
      CMD_LINE0                 : pslverr_pre = 1'b0;    //read and write  
878
      CMD_LINE1                 : pslverr_pre = 1'b0;    //read and write  
879
      CMD_LINE2                 : pslverr_pre = 1'b0;    //read and write  
880
      CMD_LINE3                 : pslverr_pre = 1'b0;    //read and write  
881
 
882
      STATIC_LINE0              : pslverr_pre = 1'b0;    //read and write  
883
      STATIC_LINE1              : pslverr_pre = 1'b0;    //read and write  
884
      STATIC_LINE2              : pslverr_pre = 1'b0;    //read and write   
885
      STATIC_LINE3              : pslverr_pre = 1'b0;    //read and write   
886
      STATIC_LINE4              : pslverr_pre = 1'b0;    //read and write  
887
 
888
      RESTRICT                  : pslverr_pre = gpwrite; //read only
889
      RD_OFFSETS                : pslverr_pre = gpwrite; //read only
890
      WR_OFFSETS                : pslverr_pre = gpwrite; //read only
891
      FIFO_FULLNESS             : pslverr_pre = gpwrite; //read only
892
      CMD_OUTS                  : pslverr_pre = gpwrite; //read only
893
 
894
      CH_ENABLE                 : pslverr_pre = 1'b0;    //read and write  
895
      CH_START                  : pslverr_pre = gpread;  //write only
896
      CH_ACTIVE                 : pslverr_pre = gpwrite; //read only
897
      CH_CMD_COUNTER            : pslverr_pre = gpwrite; //read only
898
 
899
      INT_RAWSTAT               : pslverr_pre = 1'b0;    //read and write  
900
      INT_CLEAR                 : pslverr_pre = gpread;  //write only
901
      INT_ENABLE                : pslverr_pre = 1'b0;    //read and write  
902
      INT_STATUS                : pslverr_pre = gpwrite; //read only
903
 
904
      default                   : pslverr_pre = psel;    //decode error
905
    endcase
906
     end
907
 
908
   always @(posedge clk or posedge reset)
909
     if (reset)
910
       prdata <= #1 {32{1'b0}};
911
     else if (gpread & pclken)
912
       prdata <= #1 prdata_pre;
913
     else if (pclken)
914
       prdata <= #1 {32{1'b0}};
915
 
916
   always @(posedge clk or posedge reset)
917
     if (reset)
918
       pslverr <= #1 1'b0;
919
     else if ((gpread | gpwrite) & pclken)
920
       pslverr <= #1 pslverr_pre;
921
     else if (pclken)
922
       pslverr <= #1 1'b0;
923
 
924
 
925
 
926
endmodule
927
 
928
 

powered by: WebSVN 2.1.0

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