Changeset 1002


Ignore:
Timestamp:
07/18/14 14:03:29 (3 years ago)
Author:
prasanthi
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • design/trunk/cmn_eth/R5.0/src/cmn_eth_tx_user_eth_hdr_gen.v

    r982 r1002  
    33module cmn_eth_tx_user_eth_hdr_gen 
    44( 
    5         input                                                           i_clk,  
    6         input                                                                   i_rst, 
     5        input                           i_clk,  
     6        input                           i_rst, 
    77 
    88 
    99        // ETH INTERFACE // 
    10         input                                                           i_sof,  
    11         input                                                                   i_eof, 
    12         input           [31:0]                          i_data, 
    13         output  reg                                             o_data_re, 
    14         input                                                                   i_ff_empty_flg, 
     10        input                           i_sof,  
     11        input                           i_eof, 
     12        input           [31:0]          i_data, 
     13        output  reg                     o_data_re, 
     14        input                           i_ff_empty_flg, 
    1515 
    1616        // MEM INTERFACE // 
    1717        output  reg [11:0]              o_mem_addr, 
    18         output                  [31:0]          o_mem_data, 
    19         output  reg                                             o_mem_we, 
     18        output  [31:0]                  o_mem_data, 
     19        output  reg                     o_mem_we, 
    2020 
    2121        // CMD FIFO INTERFACE // 
    22         output  reg                                             o_cff_we,  
     22        output  reg                     o_cff_we,  
    2323        output  reg     [31:0]          o_cff_data, 
    24         input                                                                   i_cff_full_flg, 
     24        input                           i_cff_full_flg, 
    2525 
    2626  // ETH_HDER_GEN INTERFACE 
    27         output  reg                                             o_pkt_rdy, 
    28   input   [47:0]                                i_smac 
     27        output  reg                     o_pkt_rdy, 
     28        input     [47:0]                i_smac 
    2929); 
    3030         
     
    4343 
    4444        reg [15:0] dtemp; 
     45        reg [11:0] temp_mem_addr; 
     46        reg [11:0] cmd_ptr; 
    4547 
    4648        // ================================================================== 
     
    5052  // state definitions 
    5153        parameter [3:0] S_IDLE                                          = 4'b0000,   
    52                                                                         S_DWAIT                                         = 4'b0001, 
     54                                                                        S_DWAIT                         = 4'b0001, 
    5355                                                                        S_DMAC_FETCH                    = 4'b0010,       
    5456                                                                        S_ETYPE_FETCH                   = 4'b0011,       
    55                                                                         S_SMAC_GEN                              = 4'b0100,  
    56                                                                         S_ETYPE_GEN             = 4'b0101, 
    57                                                                         S_IP_WAIT                       = 4'b0110, 
    58                                                                         S_IP_FETCH                              = 4'b0111, 
    59                                                                         S_IP_EOF                                        = 4'b1000, 
    60                                                                         S_FF_FLG_CHK            = 4'b1001, 
    61                                                                         S_FF_FLG_CHK_WAIT = 4'b1010; 
     57                                                                        S_SMAC_GEN                      = 4'b0100,  
     58                                                                        S_ETYPE_GEN_WAIT                = 4'b0101, 
     59                                                                        S_ETYPE_GEN                     = 4'b0110, 
     60                                                                        S_IP_WAIT                       = 4'b0111, 
     61                                                                        S_IP_FETCH                      = 4'b1000, 
     62                                                                        S_IP_EOF                        = 4'b1001, 
     63                                                                        S_FF_FLG_CHK                    = 4'b1010, 
     64                                                                        S_FF_FLG_CHK_WAIT               = 4'b1011; 
    6265 
    6366 
     
    6669 
    6770 
    68         always @(posedge i_clk)  
     71always @(posedge i_clk)  
    6972    if (i_rst) 
    70                         begin 
    71                                 o_data_re <= 1'b0; 
    72                                 o_mem_addr <= 12'h000;           
    73         o_mem_we <= 1'b0; 
    74                                 o_cff_we <= 1'b0;  
    75         o_cff_data <= 32'h0000_0000; 
    76                                 o_pkt_rdy <= 1'b0; 
    77                                 reg_mem_data <= 32'h0000_0000; 
    78                                 state <= S_IDLE; 
    79                                 nxt_state <= S_IDLE; 
    80                                 dtemp <= 16'h0000; 
    81                                 dsize <= 16'h0000; 
    82  
    83                         end  
    84                 else 
    85                         begin 
     73                begin 
     74                        o_data_re <= 1'b0; 
     75                        o_mem_addr <= 12'h000;           
     76                        o_mem_we <= 1'b0; 
     77                        o_cff_we <= 1'b0;  
     78                        o_cff_data <= 32'h0000_0000; 
     79                        o_pkt_rdy <= 1'b0; 
     80                        reg_mem_data <= 32'h0000_0000; 
     81                        state <= S_IDLE; 
     82                        nxt_state <= S_IDLE; 
     83                        dtemp <= 16'h0000; 
     84                        dsize <= 16'h0000; 
     85                        temp_mem_addr <= 12'h000; 
     86                        cmd_ptr <= 12'h000; 
     87 
     88                end  
     89        else 
     90                begin 
    8691                                o_data_re <= 1'b0; 
    8792                                o_mem_we <= 1'b0; 
    8893                                o_cff_we <= 1'b0;  
    8994                                o_pkt_rdy <= 1'b0; 
    90                          
     95                                o_mem_addr <= temp_mem_addr; 
    9196                                case (state)     
    9297                                        S_IDLE : begin 
    93                                                 if (!i_ff_empty_flg) begin 
     98                                                if (!i_ff_empty_flg) 
     99                                                    begin 
    94100                                                        o_data_re <= 1'b1; 
    95101                                                        state <= S_DWAIT; 
    96102//                                                      nxt_state <= S_DMAC_FETCH; 
    97                                           end  
     103                                                    end  
    98104                                                else  
    99                                                         state <= S_IDLE;         
    100  
    101                                         end 
     105                                                    state <= S_IDLE;     
     106 
     107                                                end 
    102108         
    103109                                        // wait for data load from fifo 
    104110                                        S_DWAIT : begin 
    105             o_data_re <= 1'b1; // load next elastic buffer data word 
     111                                                o_data_re <= 1'b1; // load next elastic buffer data word 
    106112                                                state <= S_DMAC_FETCH; 
    107113 
    108                                         end 
    109  
    110                                         // fetch dest. MAC (MSB) from elastic buffer  
     114                                                end 
     115 
     116                                         // fetch dest. MAC (MSB) from elastic buffer  
    111117                                        S_DMAC_FETCH : begin 
    112118                                                if (i_sof) begin  
    113                                                   o_mem_addr <= 12'h000; 
     119                                                  //o_mem_addr <= temp_mem_addr;//12'h000; 
     120                                                  cmd_ptr <= temp_mem_addr; 
    114121                                                  o_mem_we <= 1'b1; 
    115               reg_mem_data <= i_data; // generate dMAC MSB 
    116                                                         dsize <= dsize + 4; 
     122                                                  reg_mem_data <= i_data; // generate dMAC MSB 
     123                                                  dsize <= dsize + 4; 
    117124//                                                      o_data_re <= 1'b1; // load next elastic buffer data word 
    118125                                                  state <= S_ETYPE_FETCH; 
    119                                                 end  
     126                                                  if(temp_mem_addr == 12'hFFC) 
     127                                                        temp_mem_addr <= 12'h000; 
     128                                                  else 
     129                                                        temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     130                                                  //end 
     131                                                  end  
    120132                                                else 
    121               state <= S_IDLE; 
     133                                                  state <= S_IDLE; 
    122134                                         
    123                                         end 
     135                                                end 
     136                                         
    124137 
    125138                                        // fetch dest. MAC (LSB) + etype from elastic buffer 
    126139                                        S_ETYPE_FETCH : begin 
    127                                           o_mem_addr <= o_mem_addr + 4; 
    128                                           o_mem_we <= 1'b1; 
    129             reg_mem_data[31:16] <= i_data[31:16]; // generate dMAC LSB 
    130             reg_mem_data[15:0] <= i_smac[47:32];  // generate sMAC MSB 
    131                                           dtemp <= i_data[15:0];        // etype temp storage 
    132                                                 dsize <= dsize + 4; 
    133 //                                              o_data_re <= 1'b1; // load next elastic buffer data word 
    134                                                 state <= S_SMAC_GEN; 
     140                                                //o_mem_addr <= o_mem_addr + 4; 
     141                                                o_mem_we <= 1'b1; 
     142                                                reg_mem_data[31:16] <= i_data[31:16]; // generate dMAC LSB 
     143                                                reg_mem_data[15:0] <= i_smac[47:32];  // generate sMAC MSB 
     144                                                dtemp <= i_data[15:0];  // etype temp storage 
     145                                                dsize <= dsize + 4; 
     146//                                              o_data_re <= 1'b1; // load next elastic buffer data word 
     147                                                state <= S_SMAC_GEN; 
     148                                                if(temp_mem_addr == 12'hFFC) 
     149                                                        temp_mem_addr <= 12'h000; 
     150                                                else 
     151                                                        temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     152                                                 
    135153                                         
    136                                         end 
     154                                              end 
    137155 
    138156                                        // generate SMAC LSB field  
    139157                                        S_SMAC_GEN : begin 
    140                                           o_mem_addr <= o_mem_addr + 4; 
     158                                          //o_mem_addr <= o_mem_addr + 4; 
    141159                                          o_mem_we <= 1'b1; 
    142             reg_mem_data[31:0] <= i_smac[31:0]; 
    143                                                 dsize <= dsize + 4; 
     160                                          reg_mem_data[31:0] <= i_smac[31:0]; 
     161                                          dsize <= dsize + 4; 
    144162                                          if (!i_ff_empty_flg) begin 
    145                                                         o_data_re <= 1'b1; // load next elastic buffer data word 
    146                                                         state <= S_ETYPE_GEN;    
    147                                                  
    148                                                 end 
    149                                                 else begin 
    150                                                         state <= S_FF_FLG_CHK; 
    151                                                         nxt_state <= S_ETYPE_GEN; // goto state after buffer wait time 
    152  
    153                                                 end 
     163                                                o_data_re <= 1'b1; // load next elastic buffer data word 
     164                                                state <= S_ETYPE_GEN_WAIT;       
     165                                          end 
     166                                          else begin 
     167                                                state <= S_FF_FLG_CHK; 
     168                                                nxt_state <= S_ETYPE_GEN; // goto state after buffer wait time 
     169 
     170                                          end 
     171                                          if(temp_mem_addr == 12'hFFC) 
     172                                                temp_mem_addr <= 12'h000; 
     173                                          else 
     174                                                temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     175                                           
    154176 
    155177                                        end 
     
    189211                                        end 
    190212 
     213                                        //wait for the first IP hdr word (2 bytes of this goes in the same word as etype)(Prasanthi 7/1/2014) 
     214                                        S_ETYPE_GEN_WAIT: begin 
     215                                                state <= S_ETYPE_GEN; 
     216                                                end 
     217 
    191218                                         
    192219                                        // generate etype field 
    193220                                        S_ETYPE_GEN : begin 
    194                                           o_mem_addr <= o_mem_addr + 4; 
     221                                          //o_mem_addr <= o_mem_addr + 4; 
    195222                                          o_mem_we <= 1'b1; 
    196             reg_mem_data[31:16] <= dtemp;                               // generate etype 
    197             reg_mem_data[15:0] <= i_data[31:16];  // generate IP data 
     223                                          reg_mem_data[31:16] <= dtemp;                                 // generate etype 
     224                                          reg_mem_data[15:0] <= i_data[31:16];  // generate IP data 
    198225                                                dtemp <= i_data[15:0]; 
    199226                                                dsize <= dsize + 4; 
     
    201228//                                              state <= S_IP_WAIT; 
    202229                                          if (!i_ff_empty_flg) begin 
    203                                                         o_data_re <= 1'b1; // load next elastic buffer data word 
    204                                                         state <= S_IP_WAIT;      
     230                                                o_data_re <= 1'b1; // load next elastic buffer data word 
     231                                                state <= S_IP_WAIT;      
     232                                                 
     233                                          end 
     234                                          else begin 
     235                                                state <= S_FF_FLG_CHK; 
     236                                                nxt_state <= S_IP_FETCH; // goto state after buffer wait time 
     237 
     238                                          end 
     239                                          if(temp_mem_addr == 12'hFFC) 
     240                                                temp_mem_addr <= 12'h000; 
     241                                          else 
     242                                                temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     243                                           
     244 
     245                                        end 
     246 
     247 
     248                                        // wait for fifo data load 
     249                                        S_IP_WAIT : begin 
     250                                                state <= S_IP_FETCH; 
     251 
     252                                        end 
     253 
     254                                        // fetch IP packet data 
     255                                        S_IP_FETCH : begin  
     256                                          //o_mem_addr <= o_mem_addr + 4; 
     257                                          o_mem_we <= 1'b1; 
     258                                          reg_mem_data[31:16] <= dtemp;                                 // generate IP data 
     259                                          reg_mem_data[15:0] <= i_data[31:16];  // generate IP data 
     260                                          dtemp <= i_data[15:0]; 
     261                                          if(temp_mem_addr == 12'hFFC) 
     262                                                temp_mem_addr <= 12'h000; 
     263                                          else 
     264                                                temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     265                                           
     266                                          if (i_eof) begin 
     267                                                dsize <= dsize + 6;// (Prasanthi 7/15/14 - changed from +2 to +6) 
     268                                                state <= S_IP_EOF; 
     269                                                 
     270                                          end 
     271                                          else begin  
     272                                                dsize <= dsize + 4; 
     273//                                              o_data_re <= 1'b1; // load next elastic buffer data word 
     274//                                              state <= S_IP_WAIT;      
     275                                                if (!i_ff_empty_flg) begin 
     276                                                        o_data_re <= 1'b1; // load next elastic buffer data word 
     277                                                        state <= S_IP_WAIT;      
    205278                                                 
    206279                                                end 
    207280                                                else begin 
    208                                                         state <= S_FF_FLG_CHK; 
    209                                                         nxt_state <= S_IP_FETCH; // goto state after buffer wait time 
     281                                                        state <= S_FF_FLG_CHK; 
     282                                                        nxt_state <= S_IP_FETCH; // goto state after buffer wait time 
    210283 
    211284                                                end 
    212285 
    213                                         end 
    214  
    215  
    216                                         // wait for fifo data load 
    217                                         S_IP_WAIT : begin 
    218                                                 state <= S_IP_FETCH; 
    219  
    220                                         end 
    221  
    222                                         // fetch IP packet data 
    223                                         S_IP_FETCH : begin  
    224                                           o_mem_addr <= o_mem_addr + 4; 
    225                                           o_mem_we <= 1'b1; 
    226             reg_mem_data[31:16] <= dtemp;                               // generate IP data 
    227             reg_mem_data[15:0] <= i_data[31:16];  // generate IP data 
    228                                                 dtemp <= i_data[15:0]; 
    229                                                 if (i_eof) begin 
    230                                                         dsize <= dsize + 2; 
    231                                                         state <= S_IP_EOF; 
    232                                                  
    233                                                 end 
    234                                                 else begin  
    235                                                         dsize <= dsize + 4; 
    236 //                                                      o_data_re <= 1'b1; // load next elastic buffer data word 
    237 //                                              state <= S_IP_WAIT;      
    238                                             if (!i_ff_empty_flg) begin 
    239                                                         o_data_re <= 1'b1; // load next elastic buffer data word 
    240                                                           state <= S_IP_WAIT;    
    241                                                  
    242                                                   end 
    243                                                   else begin 
    244                                                           state <= S_FF_FLG_CHK; 
    245                                                           nxt_state <= S_IP_FETCH; // goto state after buffer wait time 
    246  
    247                                                   end 
    248  
    249                                                 end 
     286                                         end 
    250287 
    251288                                        end 
     
    253290                                        // end of IP packet 
    254291                                        S_IP_EOF : begin 
    255                                           o_mem_addr <= o_mem_addr + 4; 
     292                                          //o_mem_addr <= o_mem_addr + 4; 
    256293                                          o_mem_we <= 1'b1; 
    257             reg_mem_data[31:16] <= dtemp;       // generate IP data 
    258             reg_mem_data[15:0] <= 16'h0000; // NULL 
     294                                          reg_mem_data[31:16] <= dtemp;         // generate IP data 
     295                                          reg_mem_data[15:0] <= 16'h0000; // NULL 
     296                                          if(temp_mem_addr == 12'hFFC) 
     297                                                temp_mem_addr <= 12'h000; 
     298                                          else 
     299                                                temp_mem_addr <= temp_mem_addr + 4; // next mem addr 
     300                                           
    259301                                 
    260                                                 o_cff_we <= 1'b1;                                        
    261             o_cff_data[31:16] <= dsize;                 // command, size (bytes) 
    262                                                 o_cff_data[15:0]  <= 16'h0000;  // command, pointer. (always point to addr 0 location !! e.g. support only one packet for now) 
    263                                                 o_pkt_rdy <= 1'b1; 
    264                                                 dsize <= 16'h0000; // reset byte counter 
    265                                                 state <= S_IDLE; 
     302                                          o_cff_we <= 1'b1;                                      
     303                                          o_cff_data[31:16] <= dsize;           // command, size (bytes) 
     304                                          o_cff_data[15:0]  <= cmd_ptr;//16'h0000;      // command, pointer. (always point to addr 0 location !! e.g. support only one packet for now) 
     305                                                                // (Prasanthi 7/18/14) changed this to support multiple packets. There is no feedback from the pcore yet, so if the mem_addr wraps around before the first packet is sent out, data gets corrupted/pkt gets dropped.                                       
     306                                          o_pkt_rdy <= 1'b1; 
     307                                          dsize <= 16'h0000; // reset byte counter 
     308                                          state <= S_IDLE; 
    266309 
    267310                                        end 
Note: See TracChangeset for help on using the changeset viewer.