OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_peripheral/] [ni/] [ni_vc_dma.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
 
2
/**********************************************************************
3
**      File:  ni_vc_dma.v
4
**      Date:2017-06-11
5
**
6
**      Copyright (C) 2014-2017  Alireza Monemi
7
**
8
**      This file is part of ProNoC
9
**
10
**      ProNoC ( stands for Prototype Network-on-chip)  is free software:
11
**      you can redistribute it and/or modify it under the terms of the GNU
12
**      Lesser General Public License as published by the Free Software Foundation,
13
**      either version 2 of the License, or (at your option) any later version.
14
**
15
**      ProNoC is distributed in the hope that it will be useful, but WITHOUT
16
**      ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17
**      or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
18
**      Public License for more details.
19
**
20
**      You should have received a copy of the GNU Lesser General Public
21
**      License along with ProNoC. If not, see <http:**www.gnu.org/licenses/>.
22
**
23
**
24
**      Description:
25
**      NI send-/receive-DMA
26
**
27
**
28
*******************************************************************/
29
 
30
 
31
// synthesis translate_off
32
`timescale 1ns / 1ps
33
// synthesis translate_on
34
 
35
 
36
 
37
module ni_vc_dma #(
38
    parameter MAX_TRANSACTION_WIDTH = 10, // MAximum transaction size will be 2 power of MAX_DMA_TRANSACTION_WIDTH words 
39
    parameter CRC_EN = "NO",// "YES","NO" if CRC is enable then the CRC32 of all packet data is calculated and sent via tail flit. 
40
    parameter Fpay=32,
41
    parameter BYTE_EN = 0,
42
    //wishbone port parameters
43
    parameter Dw            =   32,
44
    parameter M_Aw          =   32,
45
    parameter TAGw          =   3,
46
    parameter SELw          =   4
47
)
48
(
49
    // 
50
    reset,
51
    clk,
52
 
53
    //ctrl signals
54
    send_enable,
55
    send_is_busy,
56
    send_is_active,
57
    send_hdr,
58
    send_tail,
59
    send_done,
60
    send_fsm_is_ideal,
61
    send_pointer_addr,
62
    send_data_size,
63
    send_start,
64
 
65
 
66
    receive_enable,
67
    receive_is_busy,
68
    receive_is_active,
69
    receive_done,
70
    receive_fsm_is_ideal,
71
    received_flit_is_tail,
72
    receive_pointer_addr,
73
    receive_start_index,
74
    receive_start_index_offset,
75
    receive_start,
76
    receive_dat_size_in_byte,
77
    receive_be,
78
    receive_max_buff_siz,
79
 
80
 
81
    last_burst,
82
    status,
83
    save_hdr_info,
84
 
85
 
86
 
87
    //fifo signals
88
 
89
    send_fifo_wr,
90
    send_fifo_full,
91
    send_fifo_nearly_full,
92
    send_fifo_rd,
93
    receive_fifo_rd,
94
    receive_fifo_empty,
95
 
96
    //busrdt counter control signals
97
    burst_counter_ld,
98
    burst_counter_dec,
99
    burst_size_is_set,
100
 
101
    //errors
102
    burst_size_err,
103
    send_data_size_err,
104
    rcive_buff_ovrflw_err,
105
    invalid_send_req_err,
106
 
107
    //wishbone master rd interface signals
108
    m_send_sel_o,
109
    m_send_addr_o,
110
    m_send_cti_o,
111
    m_send_stb_o,
112
    m_send_cyc_o,
113
    m_send_we_o,
114
  //  m_send_dat_i,
115
    m_send_ack_i,
116
 
117
 
118
     //wishbone master wr interface signals
119
 
120
    m_receive_sel_o,
121
   // m_receive_dat_o,
122
    m_receive_addr_o,
123
    m_receive_cti_o,
124
    m_receive_stb_o,
125
    m_receive_cyc_o,
126
    m_receive_we_o,
127
    m_receive_ack_i
128
 
129
 
130
 
131
 
132
);
133
 
134
 
135
    function integer log2;
136
      input integer number; begin
137
         log2=(number <=1) ? 1: 0;
138
         while(2**log2<number) begin
139
            log2=log2+1;
140
         end
141
      end
142
    endfunction // log2  
143
 
144
 
145
    //state machine registers/parameters
146
    localparam
147
        SEND_ST_NUM=5,
148
        RECEIVE_ST_NUM=4;
149
 
150
    localparam [SEND_ST_NUM-1 :   0]
151
        SEND_IDEAL = 1,
152
        SEND_HDR=2,
153
        SEND_BODY =4,
154
        SEND_CRC=8,
155
        SEND_WAIT=16;
156
 
157
 
158
    localparam [RECEIVE_ST_NUM-1:0]
159
        RECEIVE_IDEAL = 1,
160
        RECEIVE_READ_FIFO=2,
161
        RECEIVE_ACTIVE =4,
162
        RECEIVE_RELEASE_WB=8;
163
 
164
    localparam [2 : 0]
165
        CLASSIC = 3'b000,
166
        CONST_ADDR_BURST = 3'b010,
167
        INCREMENT_BURST = 3'b011,
168
        END_OF_BURST = 3'b111;
169
 
170
 
171
 
172
      //control Registers/ parameters 
173
 
174
 
175
 
176
    localparam
177
        STATUSw=SEND_ST_NUM+RECEIVE_ST_NUM,
178
        MAX_PCK_SIZE_IN_BYTE = MAX_TRANSACTION_WIDTH + log2(Fpay/8),
179
        OFFSETw= log2(Fpay/8),
180
        BEw = (BYTE_EN)? log2(Fpay/8) : 1;
181
 
182
    output  [STATUSw-1  :0] status;
183
 
184
 
185
    input reset,clk,send_enable,receive_enable;
186
    output  send_is_busy, receive_is_busy;
187
    output reg burst_counter_ld,    burst_counter_dec;
188
    input burst_size_is_set;
189
    input last_burst;
190
    output reg  send_hdr;
191
    output reg  send_done,receive_done;
192
 
193
    output send_tail;
194
    output reg send_is_active, receive_is_active;
195
    input received_flit_is_tail;
196
 
197
 
198
    output reg save_hdr_info;
199
 
200
    output send_fsm_is_ideal,receive_fsm_is_ideal;
201
    input  [Dw-1   :   0] send_pointer_addr;
202
    input  [Dw-1   :   0] receive_pointer_addr;
203
    input [MAX_TRANSACTION_WIDTH-1    :   0] receive_start_index;
204
    input [OFFSETw-1 : 0] receive_start_index_offset;
205
 
206
    input  [MAX_TRANSACTION_WIDTH-1    :   0] send_data_size;
207
    input  [MAX_TRANSACTION_WIDTH-1    :   0] receive_max_buff_siz;
208
    output [MAX_PCK_SIZE_IN_BYTE-1     :   0] receive_dat_size_in_byte;
209
 
210
    input  send_start, receive_start;
211
    input [BEw-1 : 0] receive_be;
212
 
213
    //fifo
214
    output reg  send_fifo_wr, receive_fifo_rd;
215
    input       send_fifo_full, send_fifo_nearly_full,send_fifo_rd, receive_fifo_empty;
216
 
217
   //errors 
218
 
219
    output reg burst_size_err;
220
    output reg send_data_size_err;
221
    output reg rcive_buff_ovrflw_err;
222
    output reg invalid_send_req_err;
223
 
224
 
225
    //wishbone read master interface signals
226
    output  [SELw-1          :   0] m_send_sel_o;
227
    output  [M_Aw-1          :   0] m_send_addr_o;
228
    output reg [TAGw-1       :   0] m_send_cti_o;
229
    output                          m_send_stb_o;
230
    output   reg                    m_send_cyc_o;
231
    output                          m_send_we_o;
232
   // input   [Dw-1           :  0]   m_send_dat_i;
233
    input                           m_send_ack_i;
234
 
235
     //wishbone write master interface signals
236
    output  [SELw-1          :   0] m_receive_sel_o;
237
  //  output  [Dw-1            :   0] m_receive_dat_o;
238
    output  [M_Aw-1          :   0] m_receive_addr_o;
239
    output  reg [TAGw-1      :   0] m_receive_cti_o;
240
    output                          m_receive_stb_o;
241
    output  reg                     m_receive_cyc_o;
242
    output                          m_receive_we_o;
243
    input                           m_receive_ack_i;
244
 
245
 
246
    reg [MAX_TRANSACTION_WIDTH-1    :   0] send_counter, send_counter_next;
247
    reg [MAX_TRANSACTION_WIDTH-1    :   0] receive_counter_next;
248
    reg [MAX_TRANSACTION_WIDTH-1    :   0] receive_index,receive_index_next ;
249
    reg [MAX_TRANSACTION_WIDTH-1    :   0] receive_counter;
250
    reg hdr_flit_is_received,hdr_flit_is_received_next;
251
 
252
    wire last_data = (send_counter == send_data_size-1'b1);
253
 
254
    wire receive_overflow= (receive_counter == receive_max_buff_siz);
255
 
256
    reg [SEND_ST_NUM-1    :0] send_ps,send_ns; // read  peresent state, read next sate 
257
    reg [RECEIVE_ST_NUM-1    :0] receive_ps,receive_ns; // read  peresent state, read next sate
258
 
259
    //reg receive_is_busy_next, send_is_busy_next;
260
 
261
 
262
    assign status= {receive_ps,send_ps};
263
   // assign s_dat_o={{(Dw-STATUSw){1'b0}}, status};
264
 
265
    reg  send_crc;
266
 
267
    /* verilator lint_off WIDTH */
268
    assign send_tail =  ( CRC_EN == "NO") ?  last_data : send_crc;
269
    /* verilator lint_on WIDTH */
270
 
271
 
272
    assign send_fsm_is_ideal = (send_ps== SEND_IDEAL);
273
    assign receive_fsm_is_ideal = (receive_ps== RECEIVE_IDEAL);
274
    /* verilator lint_off WIDTH */
275
    assign m_send_addr_o =  send_pointer_addr  + send_counter;
276
    //assign m_receive_addr_o =  receive_pointer_addr  + receive_counter;
277
    assign m_receive_addr_o =  receive_pointer_addr  + receive_index;
278
 
279
 
280
     /* verilator lint_on WIDTH */
281
    assign m_send_stb_o =  m_send_cyc_o;
282
    assign m_receive_stb_o =  m_receive_cyc_o;
283
    assign m_receive_we_o = 1'b1;
284
    assign m_send_we_o = 1'b0;
285
 
286
    assign m_send_sel_o = {SELw{1'b1}};
287
 
288
 
289
 
290
 generate
291
 if(BYTE_EN)begin:be
292
    wire [OFFSETw:0] byte2 = (receive_be==0)? (1<<OFFSETw) : {1'b0,receive_be};
293
    wire [OFFSETw:0] byte1 = byte2 - {1'b0,receive_start_index_offset};
294
 
295
    reg  [MAX_PCK_SIZE_IN_BYTE-1     :   0] receive_size_cal;
296
    always @(*)begin
297
        receive_size_cal={MAX_PCK_SIZE_IN_BYTE{1'b0}};
298
        if (receive_counter==1)begin
299
            receive_size_cal [OFFSETw:0]= byte1;
300
        end else begin
301
            /* verilator lint_off WIDTH */
302
            receive_size_cal = (((receive_counter-1'b1)<<OFFSETw)+byte2)-receive_start_index_offset;
303
            /* verilator lint_on WIDTH */
304
        end
305
    end
306
    assign receive_dat_size_in_byte= receive_size_cal;
307
 
308
   /*************
309
    *  sel generator
310
    * ***********/
311
      wire [SELw-1 : 0]  first_flit_sel,last_flit_sel,first_flit_sel_not;
312
 
313
     little_endian_sel_gen #(
314
        .SELw(SELw),
315
        .BEw(BEw)
316
     )
317
     last_sel_gen
318
     (
319
        .byte_location(receive_be),
320
        .sel(last_flit_sel)
321
 
322
     );
323
 
324
 
325
    little_endian_sel_gen #(
326
        .SELw(SELw),
327
        .BEw(BEw)
328
     )
329
     first_sel_gen
330
     (
331
        .byte_location(receive_start_index_offset),
332
        .sel(first_flit_sel_not)
333
 
334
     );
335
 
336
     assign first_flit_sel =(receive_start_index_offset==0)?{SELw{1'b1}}:   ~first_flit_sel_not;
337
 
338
    reg  [SELw-1 : 0] receive_sel;
339
    wire recive_first_word= (receive_counter == 0);
340
 
341
    always @(*) begin
342
        receive_sel = {SELw{1'b1}}; // default all byte enable bits are set. It may changed only for tail flit
343
 
344
        if(recive_first_word & received_flit_is_tail) begin
345
             receive_sel=  first_flit_sel & last_flit_sel;
346
        end else  if(recive_first_word )begin
347
            receive_sel=  first_flit_sel;
348
        end else  if (received_flit_is_tail) begin
349
            receive_sel=  last_flit_sel;
350
        end
351
    end
352
 
353
 
354
      assign m_receive_sel_o  = (hdr_flit_is_received)? receive_sel: {SELw{1'b0}};
355
 
356
 
357
 end else begin: nbe
358
     assign receive_dat_size_in_byte= (receive_counter<< OFFSETw );
359
     assign m_receive_sel_o = {SELw{1'b1}};
360
 end
361
 endgenerate
362
 
363
 
364
 
365
 
366
 
367
 
368
 
369
 
370
    reg [1:0] active_st,active_st_next;
371
     //send state machine
372
    always @ (*) begin
373
        // default values 
374
        send_ns = send_ps;
375
        send_counter_next=send_counter;
376
        burst_counter_ld=1'b0;
377
        burst_counter_dec=1'b0;
378
        m_send_cti_o =  CONST_ADDR_BURST;
379
        m_send_cyc_o=1'b0;
380
        send_fifo_wr=1'b0;
381
        send_done = 1'b0;
382
        send_is_active =1'b0;
383
        send_hdr = 1'b0;
384
        send_crc = 1'b0;
385
        active_st_next = active_st;
386
 
387
        burst_size_err=1'b0;
388
        send_data_size_err=1'b0;
389
        invalid_send_req_err = 1'b0;
390
 
391
        // the send req must be asserted only when the Ni_send_DMA(v) is in ideal status  
392
        if( (send_ps != SEND_IDEAL && send_ps != SEND_HDR) & send_start) invalid_send_req_err=1'b1;
393
 
394
        case(send_ps)
395
            SEND_IDEAL: begin
396
                if(send_start) begin
397
                    if (burst_size_is_set && (send_data_size>0)) begin
398
                        send_counter_next= {MAX_TRANSACTION_WIDTH{1'b0}};
399
                        burst_counter_ld=1'b1;
400
                        send_ns = SEND_HDR;
401
                    end else begin // set error reg
402
                        if(!burst_size_is_set) burst_size_err=1'b1;
403
                        else send_data_size_err=1'b1;
404
                    end
405
                end
406
            end // SEND_IDEAL
407
            SEND_HDR: begin
408
                    active_st_next =2'd1;
409
                    send_is_active =1'b1; // this signal sends request to the send_arbiter, the granted signal is send_enable
410
                    if(send_enable) begin
411
                        send_hdr = 1'b1;
412
                        if(send_fifo_nearly_full & !send_fifo_rd)  begin
413
                            send_ns =  SEND_WAIT;
414
                        end else begin
415
                            send_fifo_wr=1'b1;
416
                            send_ns =  SEND_BODY;
417
                        end
418
                    end
419
 
420
            end // SEND_ACTIVE
421
 
422
 
423
            SEND_BODY: begin
424
                    active_st_next =2'd2;
425
                    send_is_active =1'b1; // this signal sends request to the send_arbiter, the granted signal is send_enable
426
                    if(send_enable) begin
427
                        m_send_cyc_o=1'b1;
428
 
429
                        if(last_data |  last_burst | (send_fifo_nearly_full & !send_fifo_rd))  m_send_cti_o= END_OF_BURST;
430
                        if(send_fifo_nearly_full & !send_fifo_rd)  send_ns =  SEND_WAIT;
431
 
432
 
433
                        if (m_send_ack_i) begin
434
                                send_fifo_wr=1'b1;
435
                                send_counter_next=send_counter +1'b1;
436
                                burst_counter_dec=1'b1;
437
 
438
                                if(last_data) begin
439
                                    send_ns = ( CRC_EN == "NO") ? SEND_IDEAL : SEND_CRC;
440
                                  send_done = 1'b1;
441
 
442
                                end else if (last_burst | (send_fifo_nearly_full & !send_fifo_rd)) begin
443
                                  send_ns = SEND_WAIT;
444
 
445
                                end
446
                        end
447
                    end
448
 
449
            end // SEND_BODY
450
 
451
          SEND_CRC: begin
452
                    active_st_next =2'd3;
453
                    send_is_active =1'b1; // this signal sends request to the send_arbiter, the granted signal is send_enable
454
                    if(send_enable) begin
455
                        send_crc = 1'b1;
456
                        if(send_fifo_nearly_full & !send_fifo_rd)  begin
457
                                send_ns =  SEND_WAIT;
458
                        end else begin
459
                                send_fifo_wr=1'b1;
460
                                send_ns =  SEND_IDEAL;
461
 
462
                        end
463
                    end
464
 
465
            end // SEND_ACTIVE
466
 
467
 
468
 
469
 
470
 
471
             SEND_WAIT: begin
472
                    //burst_counter_next = burst_size;
473
 
474
                burst_counter_ld=1'b1;
475
                if(!send_fifo_full) begin
476
                        send_ns = ( active_st ==2'd1) ? SEND_HDR :
477
                                  ( active_st ==2'd2) ? SEND_BODY : SEND_CRC;
478
                end
479
 
480
            end //SEND_RELEASE_WB
481
            default: begin
482
 
483
 
484
            end
485
       endcase
486
    end//alays
487
 
488
   reg header_ack,header_ack_next;
489
   always @(posedge clk) header_ack<= header_ack_next;
490
 
491
 
492
 //receive state machine    
493
    always @ (*) begin
494
        // default values 
495
        receive_ns = receive_ps;
496
        receive_counter_next=receive_counter;
497
        receive_index_next = receive_index;
498
        m_receive_cyc_o=1'b0;
499
        m_receive_cti_o= CONST_ADDR_BURST;
500
        receive_fifo_rd=1'b0;
501
        receive_done=1'b0;
502
        receive_is_active =1'b0;
503
        hdr_flit_is_received_next=hdr_flit_is_received;
504
        save_hdr_info=1'b0;
505
        rcive_buff_ovrflw_err=1'b0;
506
        header_ack_next=1'b0;
507
            case(receive_ps)
508
                RECEIVE_IDEAL: begin
509
 
510
                    hdr_flit_is_received_next =1'b0;
511
                    if(receive_start )begin
512
                        receive_counter_next = {MAX_TRANSACTION_WIDTH{1'b0}};
513
                        receive_index_next = receive_start_index;
514
                        receive_ns = RECEIVE_READ_FIFO;
515
                    end
516
 
517
                end // RECEIVE_IDEAL
518
                RECEIVE_READ_FIFO: begin
519
                     receive_is_active =1'b1; // this signal sends request to the receive_arbiter, the granted signal is receive_enable
520
                     if(receive_enable) begin
521
                          receive_ns = RECEIVE_ACTIVE;
522
                          receive_fifo_rd=1'b1;
523
                    end
524
                end
525
 
526
 
527
 
528
 
529
 
530
                RECEIVE_ACTIVE: begin
531
                     receive_is_active =1'b1; // this signal sends request to the receive_arbiter, the granted signal is receive_enable
532
                     if(receive_enable) begin
533
                     /* verilator lint_off WIDTH */
534
  //                          if(CRC_EN == "YES")begin 
535
                    /* verilator lint_on WIDTH */
536
  //                              if(received_flit_is_tail)begin 
537
  //                                  m_receive_cyc_o = 1'b0;// make sure do not save crc on data memory
538
  //                                  receive_ns = RECEIVE_IDEAL;
539
  //                                  m_receive_cti_o= END_OF_BURST;
540
  //                                  receive_done=1'b1;  
541
  //                              end else begin 
542
  //                                  m_receive_cyc_o=1'b1; 
543
   //                             end
544
  //                          end else  
545
                            m_receive_cyc_o =  hdr_flit_is_received;
546
                            header_ack_next = !hdr_flit_is_received & (header_ack == 1'b0) ;
547
 
548
 
549
 
550
                            if (receive_fifo_empty | received_flit_is_tail) begin
551
                                m_receive_cti_o= END_OF_BURST;
552
                            end
553
 
554
 
555
                            if (m_receive_ack_i | header_ack) begin
556
                                hdr_flit_is_received_next=1'b1;
557
                                if(! hdr_flit_is_received) save_hdr_info=1'b1;
558
                                if(! receive_overflow && hdr_flit_is_received) begin
559
                                    receive_counter_next=receive_counter +1'b1; //Donot save hedaer flit in memory
560
                                    receive_index_next = (receive_index==receive_max_buff_siz-1'b1)? {MAX_TRANSACTION_WIDTH{1'b0}}:receive_index+1'b1;
561
                                end
562
                                if( receive_overflow)  rcive_buff_ovrflw_err = 1'b1;//set error  
563
                                if (received_flit_is_tail) begin
564
                                    receive_ns = RECEIVE_IDEAL;
565
                                    m_receive_cti_o= END_OF_BURST;
566
                                    receive_done=1'b1;
567
                                end
568
                                else if (receive_fifo_empty) begin
569
                                    receive_ns = RECEIVE_RELEASE_WB;
570
 
571
                                end else begin
572
                                    receive_fifo_rd=1'b1;
573
                                end
574
                            end
575
                     end
576
                end // RECEIVE_ACTIVE
577
               RECEIVE_RELEASE_WB: begin
578
                    if (! receive_fifo_empty) begin
579
                                    receive_ns = RECEIVE_READ_FIFO;
580
                    end
581
                end //RELEASE_WB                
582
                default: begin
583
 
584
 
585
                    end
586
            endcase
587
 
588
    end//alays
589
 
590
 /*
591
    always @(*)begin
592
        send_is_busy_next= send_is_busy;
593
        if(send_start) send_is_busy_next =1'b1;
594
        else if(send_done) send_is_busy_next=1'b0;
595
    end
596
 */
597
    assign send_is_busy = (send_ps != SEND_IDEAL);
598
    assign receive_is_busy =  (receive_ps != RECEIVE_IDEAL);
599
 
600
   /*
601
     always @(*)begin
602
        receive_is_busy_next= receive_is_busy;
603
        if(receive_done) receive_is_busy_next =1'b0;
604
        else if(receive_start) receive_is_busy_next=1'b1;
605
    end
606
   */
607
 
608
 
609
 
610
    //registers assigmnet
611
 
612
`ifdef SYNC_RESET_MODE
613
    always @ (posedge clk )begin
614
`else
615
    always @ (posedge clk or posedge reset)begin
616
`endif
617
        if(reset) begin
618
            send_ps <= SEND_IDEAL;
619
            receive_ps <= RECEIVE_IDEAL;
620
            send_counter <=  {MAX_TRANSACTION_WIDTH{1'b0}};
621
            receive_counter <=   {MAX_TRANSACTION_WIDTH{1'b0}};
622
            receive_index<= {MAX_TRANSACTION_WIDTH{1'b0}};
623
            hdr_flit_is_received<=1'b0;
624
            active_st <= 2'd0;
625
 
626
        end else begin
627
 
628
            send_ps <= send_ns;
629
            receive_ps <= receive_ns;
630
            send_counter <=  send_counter_next;
631
            receive_counter <=  receive_counter_next;
632
            receive_index<=receive_index_next;
633
            hdr_flit_is_received<=hdr_flit_is_received_next;
634
            active_st <= active_st_next;
635
        end
636
    end
637
 
638
 
639
 
640
/*
641
    dma_fifo  #(
642
         .Dw(Dw),//data_width
643
         .B(B) // buffer num
644
    )
645
    the_fifo
646
    (
647
         .din(m_send_dat_i),
648
         .receive_en(send_fifo_wr),
649
         .send_en(fifo_rd),
650
         .dout(m_receive_dat_o),
651
         .full(send_fifo_full),
652
         .nearly_full(send_fifo_nearly_full),
653
         .empty(receive_fifo_empty),
654
         .reset(reset),
655
         .clk(clk)
656
    );
657
*/
658
 
659
 
660
 
661
endmodule
662
 
663
 
664
module  little_endian_sel_gen #(
665
    parameter SELw=4,
666
    parameter BEw=2
667
)(
668
    byte_location,
669
    sel
670
);
671
 
672
     localparam BE_ONEHOTw= 2**BEw;
673
 
674
     output [SELw-1 : 0]  sel;
675
     input  [BEw-1 :  0]  byte_location;
676
 
677
     wire [SELw-1 : 0]  sel_gen;
678
     wire [BE_ONEHOTw-1 : 0] one_hot_code,sel_reversed;
679
 
680
      bin_to_one_hot #(
681
        .BIN_WIDTH(BEw),
682
        .ONE_HOT_WIDTH(BE_ONEHOTw)
683
      )
684
      be_cnv
685
      (
686
        .bin_code(byte_location),
687
        .one_hot_code(one_hot_code)
688
      );
689
 
690
    assign sel_reversed = one_hot_code-1'b1;
691
 
692
   genvar i;
693
   generate
694
    for (i=0; i<BE_ONEHOTw; i=i+1)begin :ff
695
        assign sel_gen[i] = sel_reversed[BE_ONEHOTw-i-1];
696
     //assign tail_flit_sel[i] = sel_reversed[i];
697
    end//for  
698
   endgenerate
699
   assign sel= (byte_location == {BEw{1'b0}})? {SELw{1'b1}} : sel_gen;
700
 
701
endmodule
702
 

powered by: WebSVN 2.1.0

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