Advertisement
Guest User

Untitled

a guest
May 11th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 17.17 KB | None | 0 0
  1. //-
  2. // Copyright (C) 2010, 2011 The Board of Trustees of The Leland Stanford
  3. //                          Junior University
  4. // Copyright (C) 2010, 2011 Adam Covington
  5. // Copyright (C) 2015 Noa Zilberman
  6. // All rights reserved.
  7. //
  8. // This software was developed by
  9. // Stanford University and the University of Cambridge Computer Laboratory
  10. // under National Science Foundation under Grant No. CNS-0855268,
  11. // the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and
  12. // by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),
  13. // as part of the DARPA MRC research programme.
  14. //
  15. // @NETFPGA_LICENSE_HEADER_START@
  16. //
  17. // Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor
  18. // license agreements.  See the NOTICE file distributed with this work for
  19. // additional information regarding copyright ownership.  NetFPGA licenses this
  20. // file to you under the NetFPGA Hardware-Software License, Version 1.0 (the
  21. // "License"); you may not use this file except in compliance with the
  22. // License.  You may obtain a copy of the License at:
  23. //
  24. //   http://www.netfpga-cic.org
  25. //
  26. // Unless required by applicable law or agreed to in writing, Work distributed
  27. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  28. // CONDITIONS OF ANY KIND, either express or implied.  See the License for the
  29. // specific language governing permissions and limitations under the License.
  30. //
  31. // @NETFPGA_LICENSE_HEADER_END@
  32. //
  33. /*******************************************************************************
  34.  *  File:
  35.  *        input_arbiter.v
  36.  *
  37.  *  Library:
  38.  *        hw/std/cores/input_arbiter
  39.  *
  40.  *  Module:
  41.  *        input_arbiter
  42.  *
  43.  *  Author:
  44.  *        Adam Covington
  45.  *        Modified by Noa Zilberman
  46.  *     
  47.  *  Description:
  48.  *        Round Robin arbiter (N inputs to 1 output)
  49.  *        Inputs have a parameterizable width
  50.  *
  51.  */
  52.  
  53. `include "input_arbiter_cpu_regs_defines.v"
  54.  
  55. module input_arbiter
  56. #(
  57.     // Master AXI Stream Data Width
  58.     parameter C_M_AXIS_DATA_WIDTH=256,
  59.     parameter C_S_AXIS_DATA_WIDTH=256,
  60.     parameter C_M_AXIS_TUSER_WIDTH=128,
  61.     parameter C_S_AXIS_TUSER_WIDTH=128,
  62.     parameter NUM_QUEUES=5,
  63.    
  64.     // AXI Registers Data Width
  65.     parameter C_S_AXI_DATA_WIDTH    = 32,          
  66.     parameter C_S_AXI_ADDR_WIDTH    = 12,          
  67.     parameter C_BASEADDR            = 32'h00000000
  68.  
  69. )
  70. (
  71.     // Part 1: System side signals
  72.     // Global Ports
  73.     input axis_aclk,
  74.     input axis_resetn,
  75.  
  76.     // Master Stream Ports (interface to data path)
  77.     output [C_M_AXIS_DATA_WIDTH - 1:0] m_axis_tdata,
  78.     output [((C_M_AXIS_DATA_WIDTH / 8)) - 1:0] m_axis_tkeep,
  79.     output [C_M_AXIS_TUSER_WIDTH-1:0] m_axis_tuser,
  80.     output m_axis_tvalid,
  81.     input  m_axis_tready,
  82.     output m_axis_tlast,
  83.  
  84.     // Slave Stream Ports (interface to RX queues)
  85.     input [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_0_tdata,
  86.     input [((C_S_AXIS_DATA_WIDTH / 8)) - 1:0] s_axis_0_tkeep,
  87.     input [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_0_tuser,
  88.     input  s_axis_0_tvalid,
  89.     output s_axis_0_tready,
  90.     input  s_axis_0_tlast,
  91.  
  92.     input [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_1_tdata,
  93.     input [((C_S_AXIS_DATA_WIDTH / 8)) - 1:0] s_axis_1_tkeep,
  94.     input [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_1_tuser,
  95.     input  s_axis_1_tvalid,
  96.     output s_axis_1_tready,
  97.     input  s_axis_1_tlast,
  98.  
  99.     input [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_2_tdata,
  100.     input [((C_S_AXIS_DATA_WIDTH / 8)) - 1:0] s_axis_2_tkeep,
  101.     input [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_2_tuser,
  102.     input  s_axis_2_tvalid,
  103.     output s_axis_2_tready,
  104.     input  s_axis_2_tlast,
  105.  
  106.     input [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_3_tdata,
  107.     input [((C_S_AXIS_DATA_WIDTH / 8)) - 1:0] s_axis_3_tkeep,
  108.     input [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_3_tuser,
  109.     input  s_axis_3_tvalid,
  110.     output s_axis_3_tready,
  111.     input  s_axis_3_tlast,
  112.  
  113.     input [C_S_AXIS_DATA_WIDTH - 1:0] s_axis_4_tdata,
  114.     input [((C_S_AXIS_DATA_WIDTH / 8)) - 1:0] s_axis_4_tkeep,
  115.     input [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_4_tuser,
  116.     input  s_axis_4_tvalid,
  117.     output s_axis_4_tready,
  118.     input  s_axis_4_tlast,
  119.    
  120.     // Slave AXI Ports
  121.     input                                     S_AXI_ACLK,
  122.     input                                     S_AXI_ARESETN,
  123.     input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_AWADDR,
  124.     input                                     S_AXI_AWVALID,
  125.     input      [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_WDATA,
  126.     input      [C_S_AXI_DATA_WIDTH/8-1 : 0]   S_AXI_WSTRB,
  127.     input                                     S_AXI_WVALID,
  128.     input                                     S_AXI_BREADY,
  129.     input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_ARADDR,
  130.     input                                     S_AXI_ARVALID,
  131.     input                                     S_AXI_RREADY,
  132.     output                                    S_AXI_ARREADY,
  133.     output     [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_RDATA,
  134.     output     [1 : 0]                        S_AXI_RRESP,
  135.     output                                    S_AXI_RVALID,
  136.     output                                    S_AXI_WREADY,
  137.     output     [1 :0]                         S_AXI_BRESP,
  138.     output                                    S_AXI_BVALID,
  139.     output                                    S_AXI_AWREADY,
  140.    
  141.  
  142.    // stats
  143.     output reg pkt_fwd
  144.  
  145. );
  146.  
  147.    function integer log2;
  148.       input integer number;
  149.       begin
  150.          log2=0;
  151.          while(2**log2<number) begin
  152.             log2=log2+1;
  153.          end
  154.       end
  155.    endfunction // log2
  156.  
  157.    // ------------ Internal Params --------
  158.  
  159.    localparam  NUM_QUEUES_WIDTH = log2(NUM_QUEUES);
  160.    
  161.    // hrenic
  162.    // ----- States -----
  163.    localparam IDLE       = 0; // state to capture first part of the packet
  164.    localparam WR_PKT_VALID   = 1; // state for valid IP address, send rest of the packet
  165.    localparam WR_PKT_INVALID = 2; // state for invalid IP address, wait for packet end
  166.  
  167.    localparam MAX_PKT_SIZE = 2000; // In bytes
  168.    localparam IN_FIFO_DEPTH_BIT = log2(MAX_PKT_SIZE/(C_M_AXIS_DATA_WIDTH / 8));
  169.  
  170.    // ------------- Regs/ wires -----------
  171.  
  172.    wire [NUM_QUEUES-1:0]        nearly_full;
  173.    wire [NUM_QUEUES-1:0]        empty;
  174.    wire [C_M_AXIS_DATA_WIDTH-1:0]   in_tdata[NUM_QUEUES-1:0];
  175.    wire [((C_M_AXIS_DATA_WIDTH/8))-1:0] in_tkeep[NUM_QUEUES-1:0];
  176.    wire [C_M_AXIS_TUSER_WIDTH-1:0]  in_tuser[NUM_QUEUES-1:0];
  177.    wire [NUM_QUEUES-1:0]        in_tvalid;
  178.    wire [NUM_QUEUES-1:0]        in_tlast;
  179.    wire [C_M_AXIS_TUSER_WIDTH-1:0]  fifo_out_tuser[NUM_QUEUES-1:0];
  180.    wire [C_M_AXIS_DATA_WIDTH-1:0]   fifo_out_tdata[NUM_QUEUES-1:0];
  181.    wire [((C_M_AXIS_DATA_WIDTH/8))-1:0] fifo_out_tkeep[NUM_QUEUES-1:0];
  182.    wire [NUM_QUEUES-1:0]            fifo_out_tlast;
  183.    wire                                 fifo_tvalid;
  184.    wire                                 fifo_tlast;
  185.    reg [NUM_QUEUES-1:0]                 rd_en;
  186.  
  187.    wire [NUM_QUEUES_WIDTH-1:0]      cur_queue_plus1;
  188.    reg [NUM_QUEUES_WIDTH-1:0]       cur_queue;
  189.    reg [NUM_QUEUES_WIDTH-1:0]       cur_queue_next;
  190.  
  191.    reg [1:0]                state;
  192.    reg [1:0]                        state_next;
  193.  
  194.    wire [31:0]                  src_ip_blocked; // which src ip to block out
  195.    reg                  ip_is_valid; // whether ip is valid
  196.  
  197.    reg                      pkt_fwd_next;
  198.    
  199.  
  200.    // ----- register interface -----
  201.    reg      [`REG_ID_BITS]    id_reg;
  202.    reg      [`REG_VERSION_BITS]    version_reg;
  203.    wire     [`REG_RESET_BITS]    reset_reg;
  204.    reg      [`REG_FLIP_BITS]    ip2cpu_flip_reg;
  205.    wire     [`REG_FLIP_BITS]    cpu2ip_flip_reg;
  206.    reg      [`REG_PKTIN_BITS]    pktin_reg;
  207.    wire                             pktin_reg_clear;
  208.    reg      [`REG_PKTOUT_BITS]    pktout_reg;
  209.    wire                             pktout_reg_clear;
  210.    reg      [`REG_DEBUG_BITS]    ip2cpu_debug_reg;
  211.    wire     [`REG_DEBUG_BITS]    cpu2ip_debug_reg;
  212.  
  213.    wire clear_counters;
  214.    wire reset_registers;
  215.    
  216.    assign src_ip_blocked = 32'hC0A80202; // 192.168.2.2 in little endian
  217.  
  218.    // ------------ Modules -------------
  219.  
  220.    generate
  221.    genvar i;
  222.    for(i=0; i<NUM_QUEUES; i=i+1) begin: in_arb_queues
  223.      fallthrough_small_fifo
  224.         #( .WIDTH(C_M_AXIS_DATA_WIDTH+C_M_AXIS_TUSER_WIDTH+C_M_AXIS_DATA_WIDTH/8+1),
  225.            .MAX_DEPTH_BITS(IN_FIFO_DEPTH_BIT))
  226.       in_arb_fifo
  227.         (// Outputs
  228.          .dout                           ({fifo_out_tlast[i], fifo_out_tuser[i], fifo_out_tkeep[i], fifo_out_tdata[i]}),
  229.          .full                           (),
  230.          .nearly_full                    (nearly_full[i]),
  231.      .prog_full                      (),
  232.          .empty                          (empty[i]),
  233.          // Inputs
  234.          .din                            ({in_tlast[i], in_tuser[i], in_tkeep[i], in_tdata[i]}),
  235.          .wr_en                          (in_tvalid[i] & ~nearly_full[i]),
  236.          .rd_en                          (rd_en[i]),
  237.          .reset                          (~axis_resetn),
  238.          .clk                            (axis_aclk));
  239.    end
  240.    endgenerate
  241.  
  242.    // ------------- Logic ------------
  243.  
  244.    assign in_tdata[0]        = s_axis_0_tdata;
  245.    assign in_tkeep[0]        = s_axis_0_tkeep;
  246.    assign in_tuser[0]        = s_axis_0_tuser;
  247.    assign in_tvalid[0]       = s_axis_0_tvalid;
  248.    assign in_tlast[0]        = s_axis_0_tlast;
  249.    assign s_axis_0_tready    = !nearly_full[0];
  250.  
  251.    assign in_tdata[1]        = s_axis_1_tdata;
  252.    assign in_tkeep[1]        = s_axis_1_tkeep;
  253.    assign in_tuser[1]        = s_axis_1_tuser;
  254.    assign in_tvalid[1]       = s_axis_1_tvalid;
  255.    assign in_tlast[1]        = s_axis_1_tlast;
  256.    assign s_axis_1_tready    = !nearly_full[1];
  257.  
  258.    assign in_tdata[2]        = s_axis_2_tdata;
  259.    assign in_tkeep[2]        = s_axis_2_tkeep;
  260.    assign in_tuser[2]        = s_axis_2_tuser;
  261.    assign in_tvalid[2]       = s_axis_2_tvalid;
  262.    assign in_tlast[2]        = s_axis_2_tlast;
  263.    assign s_axis_2_tready    = !nearly_full[2];
  264.  
  265.    assign in_tdata[3]        = s_axis_3_tdata;
  266.    assign in_tkeep[3]        = s_axis_3_tkeep;
  267.    assign in_tuser[3]        = s_axis_3_tuser;
  268.    assign in_tvalid[3]       = s_axis_3_tvalid;
  269.    assign in_tlast[3]        = s_axis_3_tlast;
  270.    assign s_axis_3_tready    = !nearly_full[3];
  271.  
  272.    assign in_tdata[4]        = s_axis_4_tdata;
  273.    assign in_tkeep[4]        = s_axis_4_tkeep;
  274.    assign in_tuser[4]        = s_axis_4_tuser;
  275.    assign in_tvalid[4]       = s_axis_4_tvalid;
  276.    assign in_tlast[4]        = s_axis_4_tlast;
  277.    assign s_axis_4_tready    = !nearly_full[4];
  278.  
  279.    assign cur_queue_plus1    = (cur_queue == NUM_QUEUES-1) ? 0 : cur_queue + 1;
  280.  
  281.  
  282.    assign m_axis_tuser = fifo_out_tuser[cur_queue];
  283.    assign m_axis_tdata = fifo_out_tdata[cur_queue];
  284.    assign m_axis_tlast = fifo_out_tlast[cur_queue];
  285.    assign m_axis_tkeep = fifo_out_tkeep[cur_queue];
  286.    assign m_axis_tvalid = ip_is_valid; // ~empty[cur_queue];
  287.  
  288.  
  289.    always @(*) begin
  290.       state_next      = state;
  291.       cur_queue_next  = cur_queue;
  292.       rd_en           = 0;
  293.       pkt_fwd_next    = 0;
  294.       ip_is_valid     = !empty[cur_queue];
  295.  
  296.       case(state)
  297.  
  298.         IDLE: begin
  299.            if(!empty[cur_queue]) begin
  300.         ip_is_valid = 1;
  301.               if(m_axis_tready) begin
  302.         rd_en[cur_queue] = 1;
  303.         // m_axis_tdata is in big endian
  304.         if ((m_axis_tdata[215:208] == src_ip_block[31:24]) &&
  305.             (m_axis_tdata[223:216] == src_ip_block[23:16]) &&
  306.             (m_axis_tdata[231:224] == src_ip_block[15:8] ) &&
  307.             (m_axis_tdata[239:232] == src_ip_block[7:0] )) begin
  308.             // don't let this ip through
  309.             ip_is_valid = 0;
  310.             state_next = WR_PKT_INVALID;
  311.         end
  312.         else begin
  313.             // ip is OK
  314.             state_next = WR_PKT_VALID;
  315.             pkt_fwd_next = 1;
  316.         end        
  317.               end
  318.            end
  319.            else begin
  320.               cur_queue_next = cur_queue_plus1;
  321.            end
  322.         end
  323.  
  324.         /* wait until eop with valid set */
  325.         WR_PKT_VALID: begin
  326.            /* if this is the last word then write it and get out */
  327.            if(m_axis_tready & m_axis_tlast) begin
  328.               state_next = IDLE;
  329.           rd_en[cur_queue] = 1;
  330.               cur_queue_next = cur_queue_plus1;
  331.            end
  332.            /* otherwise read and write as usual */
  333.            else if (m_axis_tready & !empty[cur_queue]) begin;
  334.               rd_en[cur_queue] = 1;
  335.            end
  336.         end // case: WR_PKT_VALID
  337.        
  338.     /* wait until eop with valid set */
  339.         WR_PKT_INVALID: begin
  340.        ip_is_valid = 0; // as if packet wasn't valid
  341.            /* if this is the last word then write it and get out */
  342.            if(m_axis_tready & m_axis_tlast) begin
  343.               state_next = IDLE;
  344.           rd_en[cur_queue] = 1;
  345.               cur_queue_next = cur_queue_plus1;
  346.            end
  347.            /* otherwise read and write as usual */
  348.            else if (m_axis_tready & !empty[cur_queue]) begin;
  349.               rd_en[cur_queue] = 1;
  350.            end
  351.         end // case: WR_PKT_INVALID
  352.  
  353.       endcase // case(state)
  354.    end // always @ (*)
  355.  
  356.    always @(posedge axis_aclk) begin
  357.       if(~axis_resetn) begin
  358.          state <= IDLE;
  359.          cur_queue <= 0;
  360.          pkt_fwd <= 0;
  361.       end
  362.       else begin
  363.          state <= state_next;
  364.          cur_queue <= cur_queue_next;
  365.          pkt_fwd <= pkt_fwd_next;
  366.       end
  367.    end
  368.  
  369.  
  370. //Registers section
  371.  input_arbiter_cpu_regs
  372.  #(
  373.    .C_S_AXI_DATA_WIDTH (C_S_AXI_DATA_WIDTH),
  374.    .C_S_AXI_ADDR_WIDTH (C_S_AXI_ADDR_WIDTH),
  375.    .C_BASE_ADDRESS    (C_BASEADDR)
  376.  ) arbiter_cpu_regs_inst
  377.  (  
  378.    // General ports
  379.     .clk                    (axis_aclk),
  380.     .resetn                 (axis_resetn),
  381.    // AXI Lite ports
  382.     .S_AXI_ACLK             (S_AXI_ACLK),
  383.     .S_AXI_ARESETN          (S_AXI_ARESETN),
  384.     .S_AXI_AWADDR           (S_AXI_AWADDR),
  385.     .S_AXI_AWVALID          (S_AXI_AWVALID),
  386.     .S_AXI_WDATA            (S_AXI_WDATA),
  387.     .S_AXI_WSTRB            (S_AXI_WSTRB),
  388.     .S_AXI_WVALID           (S_AXI_WVALID),
  389.     .S_AXI_BREADY           (S_AXI_BREADY),
  390.     .S_AXI_ARADDR           (S_AXI_ARADDR),
  391.     .S_AXI_ARVALID          (S_AXI_ARVALID),
  392.     .S_AXI_RREADY           (S_AXI_RREADY),
  393.     .S_AXI_ARREADY          (S_AXI_ARREADY),
  394.     .S_AXI_RDATA            (S_AXI_RDATA),
  395.     .S_AXI_RRESP            (S_AXI_RRESP),
  396.     .S_AXI_RVALID           (S_AXI_RVALID),
  397.     .S_AXI_WREADY           (S_AXI_WREADY),
  398.     .S_AXI_BRESP            (S_AXI_BRESP),
  399.     .S_AXI_BVALID           (S_AXI_BVALID),
  400.     .S_AXI_AWREADY          (S_AXI_AWREADY),
  401.  
  402.    
  403.    // Register ports
  404.    .id_reg          (id_reg),
  405.    .version_reg          (version_reg),
  406.    .reset_reg          (reset_reg),
  407.    .ip2cpu_flip_reg          (ip2cpu_flip_reg),
  408.    .cpu2ip_flip_reg          (cpu2ip_flip_reg),
  409.    .pktin_reg          (pktin_reg),
  410.    .pktin_reg_clear    (pktin_reg_clear),
  411.    .pktout_reg          (pktout_reg),
  412.    .pktout_reg_clear    (pktout_reg_clear),
  413.    .ip2cpu_debug_reg          (ip2cpu_debug_reg),
  414.    .cpu2ip_debug_reg          (cpu2ip_debug_reg),
  415.    // Global Registers - user can select if to use
  416.    .cpu_resetn_soft(),//software reset, after cpu module
  417.    .resetn_soft    (),//software reset to cpu module (from central reset management)
  418.    .resetn_sync    (resetn_sync)//synchronized reset, use for better timing
  419. );
  420.  
  421. assign clear_counters = reset_reg[0];
  422. assign reset_registers = reset_reg[4];
  423.  
  424. always @(posedge axis_aclk)
  425.     if (~resetn_sync | reset_registers) begin
  426.         id_reg <= #1    `REG_ID_DEFAULT;
  427.         version_reg <= #1    `REG_VERSION_DEFAULT;
  428.         ip2cpu_flip_reg <= #1    `REG_FLIP_DEFAULT;
  429.         pktin_reg <= #1    `REG_PKTIN_DEFAULT;
  430.         pktout_reg <= #1    `REG_PKTOUT_DEFAULT;
  431.         ip2cpu_debug_reg <= #1    `REG_DEBUG_DEFAULT;
  432.     end
  433.     else begin
  434.         id_reg <= #1    `REG_ID_DEFAULT;
  435.         version_reg <= #1    `REG_VERSION_DEFAULT;
  436.         ip2cpu_flip_reg <= #1    ~cpu2ip_flip_reg;
  437.         pktin_reg[`REG_PKTIN_WIDTH -2: 0] <= #1  clear_counters | pktin_reg_clear ? 'h0  : pktin_reg[`REG_PKTIN_WIDTH-2:0] + (s_axis_0_tlast && s_axis_0_tvalid && s_axis_0_tready ) + (s_axis_1_tlast && s_axis_1_tvalid && s_axis_1_tready) + (s_axis_2_tlast && s_axis_2_tvalid && s_axis_2_tready) + (s_axis_3_tlast && s_axis_3_tvalid && s_axis_3_tready) + (s_axis_4_tlast && s_axis_4_tvalid && s_axis_4_tready)  ;
  438.         pktin_reg[`REG_PKTIN_WIDTH-1] <= #1 clear_counters | pktin_reg_clear ? 1'h0 : pktin_reg_clear ? 'h0  : pktin_reg[`REG_PKTIN_WIDTH-2:0] + pktin_reg[`REG_PKTIN_WIDTH-2:0] + (s_axis_0_tlast && s_axis_0_tvalid && s_axis_0_tready ) + (s_axis_1_tlast && s_axis_1_tvalid && s_axis_1_tready) + (s_axis_2_tlast && s_axis_2_tvalid && s_axis_2_tready) + (s_axis_3_tlast && s_axis_3_tvalid && s_axis_3_tready) + (s_axis_4_tlast && s_axis_4_tvalid && s_axis_4_tready) > {(`REG_PKTIN_WIDTH-1){1'b1}} ? 1'b1 : pktin_reg[`REG_PKTIN_WIDTH-1];
  439.                                                                
  440.         pktout_reg [`REG_PKTOUT_WIDTH-2:0]<= #1  clear_counters | pktout_reg_clear ? 'h0  : pktout_reg [`REG_PKTOUT_WIDTH-2:0] + (m_axis_tvalid && m_axis_tlast && m_axis_tready ) ;
  441.                 pktout_reg [`REG_PKTOUT_WIDTH-1]<= #1  clear_counters | pktout_reg_clear ? 'h0  : pktout_reg [`REG_PKTOUT_WIDTH-2:0] + (m_axis_tvalid && m_axis_tlast && m_axis_tready) > {(`REG_PKTOUT_WIDTH-1){1'b1}} ?
  442.                                                                 1'b1 : pktout_reg [`REG_PKTOUT_WIDTH-1];
  443.                 ip2cpu_debug_reg <= #1    `REG_DEBUG_DEFAULT+cpu2ip_debug_reg;
  444.         end
  445.  
  446.  
  447.  
  448. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement