// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// USB Full-Speed Device Interface (usbdev).
//
//


module usbdev (
  input        clk_i,
  input        rst_ni,
  input        clk_usb_48mhz_i, // use usb_ prefix for signals in this clk
  // TODO: add a reset signal for the USB-48MHz clock domain here

  // Register interface
  input        tlul_pkg::tl_h2d_t tl_d_i,
  output       tlul_pkg::tl_d2h_t tl_d_o,

  // USB Interface
  input        cio_usb_dp_i,
  output logic cio_usb_dp_o,
  output logic cio_usb_dp_en_o,

  input        cio_usb_dn_i,
  output logic cio_usb_dn_o,
  output logic cio_usb_dn_en_o,

  input        cio_usb_sense_i,

  output logic cio_usb_pullup_o,
  output logic cio_usb_pullup_en_o,

  // Interrupts
  output logic intr_pkt_received_o, // Packet received
  output logic intr_pkt_sent_o, // Packet sent
  output logic intr_disconnected_o,
  output logic intr_host_lost_o,
  output logic intr_link_reset_o,
  output logic intr_link_suspend_o,
  output logic intr_link_resume_o,
  output logic intr_av_empty_o,
  output logic intr_rx_full_o,
  output logic intr_av_overflow_o
);

  import usbdev_reg_pkg::*;

  // Could make SramDepth, MaxPktSizeByte, AVFifoDepth and RXFifoDepth
  // module parameters but may need to fix register def for the first two
  localparam int SramDw = 32; // Places packing bytes to SRAM assume this
  localparam int SramDepth = 512; // 2kB, SRAM Width is DW
  localparam int MaxPktSizeByte = 64;

  localparam int SramAw = $clog2(SramDepth);
  localparam int SizeWidth = $clog2(MaxPktSizeByte);
  localparam int NBuf = (SramDepth * SramDw) / (MaxPktSizeByte * 8);
  localparam int NBufWidth = $clog2(NBuf);

  // AV fifo just stores buffer numbers
  localparam int AVFifoWidth = NBufWidth;
  localparam int AVFifoDepth = 4;

  // RX fifo stores              buf# +  size(0-MaxPktSizeByte)  + EP# + Type
  localparam int RXFifoWidth = NBufWidth + (1+SizeWidth)         +  4  + 1;
  localparam int RXFifoDepth = 4;

  usbdev_reg2hw_t reg2hw;
  usbdev_hw2reg_t hw2reg;

  tlul_pkg::tl_h2d_t tl_sram_h2d [1];
  tlul_pkg::tl_d2h_t tl_sram_d2h [1];

  // Dual-port SRAM Interface: Refer prim_ram_2p_wrapper.sv
  logic              mem_a_req;
  logic              mem_a_write;
  logic [SramAw-1:0] mem_a_addr;
  logic [SramDw-1:0] mem_a_wdata;
  logic              mem_a_rvalid;
  logic [SramDw-1:0] mem_a_rdata;
  logic [1:0]        mem_a_rerror;

  logic              usb_mem_b_req;
  logic              usb_mem_b_write;
  logic [SramAw-1:0] usb_mem_b_addr;
  logic [SramDw-1:0] usb_mem_b_wdata;
  logic [SramDw-1:0] usb_mem_b_rdata;

  logic              usb_clr_devaddr;
  logic              event_av_empty, event_av_overflow, event_rx_full;
  logic              usb_event_link_reset, usb_event_link_suspend, usb_event_link_resume;
  logic              usb_event_host_lost, usb_event_disconnect;
  logic              event_link_reset, event_link_suspend, event_link_resume;
  logic              event_host_lost, event_disconnect;

  //=======================================================================
  // Receive interface fifos
  //

  logic              av_fifo_wready;
  logic              event_pkt_received;
  logic              usbdev_rst_n;
  logic              usb_av_rvalid, usb_av_rready;
  logic              usb_rx_wvalid, usb_rx_wready;
  logic              rx_fifo_rvalid;

  logic [AVFifoWidth - 1:0] usb_av_rdata;
  logic [RXFifoWidth - 1:0] usb_rx_wdata, rx_rdata;

  assign event_av_overflow = reg2hw.avbuffer.qe & (~av_fifo_wready);
  assign usbdev_rst_n = rst_ni;
  assign hw2reg.usbstat.av_full.d = ~av_fifo_wready;
  assign hw2reg.usbstat.rx_empty.d = ~rx_fifo_rvalid;

  prim_fifo_async #(
    .Width(AVFifoWidth),
    .Depth(AVFifoDepth)
  ) usbdev_avfifo (
    .clk_wr_i  (clk_i),
    .rst_wr_ni (usbdev_rst_n),

    .wvalid    (reg2hw.avbuffer.qe),
    .wready    (av_fifo_wready),
    .wdata     (reg2hw.avbuffer.q),
    .wdepth    (hw2reg.usbstat.av_depth.d),

    .clk_rd_i  (clk_usb_48mhz_i),
    .rst_rd_ni (usbdev_rst_n), // CDC: rely on it being there a long time
    .rvalid    (usb_av_rvalid),
    .rready    (usb_av_rready),
    .rdata     (usb_av_rdata),
    .rdepth    () // only using empty
  );

  prim_fifo_async #(
    .Width(RXFifoWidth),
    .Depth(RXFifoDepth)
  ) usbdev_rxfifo (
    .clk_wr_i  (clk_usb_48mhz_i),
    .rst_wr_ni (usbdev_rst_n),  // CDC: rely on it being there a long time

    .wvalid    (usb_rx_wvalid),
    .wready    (usb_rx_wready),
    .wdata     (usb_rx_wdata),
    .wdepth    (),

    .clk_rd_i  (clk_i),
    .rst_rd_ni (usbdev_rst_n),
    .rvalid    (rx_fifo_rvalid),
    .rready    (reg2hw.rxfifo.buffer.re),
    .rdata     (rx_rdata),
    .rdepth    (hw2reg.usbstat.rx_depth.d)
  );
  assign hw2reg.rxfifo.ep.d = rx_rdata[16:13];
  assign hw2reg.rxfifo.setup.d = rx_rdata[12];
  assign hw2reg.rxfifo.size.d = rx_rdata[11:5];
  assign hw2reg.rxfifo.buffer.d = rx_rdata[4:0];
  assign event_pkt_received = rx_fifo_rvalid;
  logic [2:0]               unused_re;
  assign unused_re = {reg2hw.rxfifo.ep.re, reg2hw.rxfifo.setup.re, reg2hw.rxfifo.size.re};
  //======================================================================
  // IN (Transmit) interface config
  //
  logic [NBufWidth - 1:0] usb_in_buf [12];
  logic [SizeWidth:0] usb_in_size [12];
  logic [3:0]         usb_in_endpoint;
  logic [11:0] ep_stall, usb_in_rdy;
  logic [11:0] clear_rdybit, set_sentbit, update_pend;
  logic        usb_out_clear_rdy, out_clear_rdy, usb_set_sent, set_sent;
  logic [11:0] enable_setup, enable_out;

  assign enable_setup =  {
      reg2hw.rxenable.setup11.q, reg2hw.rxenable.setup10.q,
      reg2hw.rxenable.setup9.q, reg2hw.rxenable.setup8.q,
      reg2hw.rxenable.setup7.q, reg2hw.rxenable.setup6.q,
      reg2hw.rxenable.setup5.q, reg2hw.rxenable.setup4.q,
      reg2hw.rxenable.setup3.q, reg2hw.rxenable.setup2.q,
      reg2hw.rxenable.setup1.q, reg2hw.rxenable.setup0.q};
  assign enable_out =  {
      reg2hw.rxenable.out11.q, reg2hw.rxenable.out10.q,
      reg2hw.rxenable.out9.q, reg2hw.rxenable.out8.q,
      reg2hw.rxenable.out7.q, reg2hw.rxenable.out6.q,
      reg2hw.rxenable.out5.q, reg2hw.rxenable.out4.q,
      reg2hw.rxenable.out3.q, reg2hw.rxenable.out2.q,
      reg2hw.rxenable.out1.q, reg2hw.rxenable.out0.q};

  // STALL for both directions
  assign ep_stall =  {
      reg2hw.stall.stall11.q, reg2hw.stall.stall10.q,
      reg2hw.stall.stall9.q, reg2hw.stall.stall8.q,
      reg2hw.stall.stall7.q, reg2hw.stall.stall6.q,
      reg2hw.stall.stall5.q, reg2hw.stall.stall4.q,
      reg2hw.stall.stall3.q, reg2hw.stall.stall2.q,
      reg2hw.stall.stall1.q, reg2hw.stall.stall0.q};

  // Clock domain crossing fifo for ready bit covers others so assigns are ok
  assign usb_in_buf[0] = reg2hw.configin0.buffer0.q;
  assign usb_in_size[0] = reg2hw.configin0.size0.q;
  assign usb_in_buf[1] = reg2hw.configin1.buffer1.q;
  assign usb_in_size[1] = reg2hw.configin1.size1.q;
  assign usb_in_buf[2] = reg2hw.configin2.buffer2.q;
  assign usb_in_size[2] = reg2hw.configin2.size2.q;
  assign usb_in_buf[3] = reg2hw.configin3.buffer3.q;
  assign usb_in_size[3] = reg2hw.configin3.size3.q;
  assign usb_in_buf[4] = reg2hw.configin4.buffer4.q;
  assign usb_in_size[4] = reg2hw.configin4.size4.q;
  assign usb_in_buf[5] = reg2hw.configin5.buffer5.q;
  assign usb_in_size[5] = reg2hw.configin5.size5.q;
  assign usb_in_buf[6] = reg2hw.configin6.buffer6.q;
  assign usb_in_size[6] = reg2hw.configin6.size6.q;
  assign usb_in_buf[7] = reg2hw.configin7.buffer7.q;
  assign usb_in_size[7] = reg2hw.configin7.size7.q;
  assign usb_in_buf[8] = reg2hw.configin8.buffer8.q;
  assign usb_in_size[8] = reg2hw.configin8.size8.q;
  assign usb_in_buf[9] = reg2hw.configin9.buffer9.q;
  assign usb_in_size[9] = reg2hw.configin9.size9.q;
  assign usb_in_buf[10] = reg2hw.configin10.buffer10.q;
  assign usb_in_size[10] = reg2hw.configin10.size10.q;
  assign usb_in_buf[11] = reg2hw.configin11.buffer11.q;
  assign usb_in_size[11] = reg2hw.configin11.size11.q;

  prim_flop_2sync #(
    .Width(12)
  ) usbdev_rdysync (
    .clk_i (clk_usb_48mhz_i),
    .rst_ni (rst_ni),
    .d( {reg2hw.configin11.rdy11.q, reg2hw.configin10.rdy10.q,
         reg2hw.configin9.rdy9.q,   reg2hw.configin8.rdy8.q,
         reg2hw.configin7.rdy7.q,   reg2hw.configin6.rdy6.q,
         reg2hw.configin5.rdy5.q,   reg2hw.configin4.rdy4.q,
         reg2hw.configin3.rdy3.q,   reg2hw.configin2.rdy2.q,
         reg2hw.configin1.rdy1.q,   reg2hw.configin0.rdy0.q }),
    .q(usb_in_rdy)
  );

  // Clear of ready and set of sent is a pulse in USB clock domain
  // but needs to ensure register bit is cleared/set in TLUL domain
  // usbdev_pulsesync takes pulse in clk_src to pulse in clk_dst
  prim_pulse_sync usbdev_setsent (
    .clk_src_i   (clk_usb_48mhz_i),
    .clk_dst_i   (clk_i),
    .rst_src_ni  (rst_ni),
    .rst_dst_ni  (rst_ni),
    .src_pulse_i (usb_set_sent),
    .dst_pulse_o (set_sent)
  );

  always_comb begin
    set_sentbit = 12'b0;
    if (set_sent) begin
      // syncronization of set_sent ensures usb_endpoint is stable
      set_sentbit[usb_in_endpoint] = 1; // lint: usb_in_endpoint range was checked
    end
  end
  assign {hw2reg.in_sent.sent11.de,  hw2reg.in_sent.sent10.de,
         hw2reg.in_sent.sent9.de,   hw2reg.in_sent.sent8.de,
         hw2reg.in_sent.sent7.de,   hw2reg.in_sent.sent6.de,
         hw2reg.in_sent.sent5.de,   hw2reg.in_sent.sent4.de,
         hw2reg.in_sent.sent3.de,   hw2reg.in_sent.sent2.de,
         hw2reg.in_sent.sent1.de,   hw2reg.in_sent.sent0.de } = set_sentbit;
  assign {hw2reg.in_sent.sent11.d,  hw2reg.in_sent.sent10.d,
          hw2reg.in_sent.sent9.d,   hw2reg.in_sent.sent8.d,
          hw2reg.in_sent.sent7.d,   hw2reg.in_sent.sent6.d,
          hw2reg.in_sent.sent5.d,   hw2reg.in_sent.sent4.d,
          hw2reg.in_sent.sent3.d,   hw2reg.in_sent.sent2.d,
          hw2reg.in_sent.sent1.d,   hw2reg.in_sent.sent0.d } = 12'hfff;

  prim_pulse_sync usbdev_outrdyclr (
    .clk_src_i   (clk_usb_48mhz_i),
    .clk_dst_i   (clk_i),
    .rst_src_ni  (rst_ni),
    .rst_dst_ni  (rst_ni),
    .src_pulse_i (usb_out_clear_rdy),
    .dst_pulse_o (out_clear_rdy)
  );

  logic event_link_reset_q;

  always_ff @(posedge clk_usb_48mhz_i or negedge rst_ni) begin
    if (!rst_ni) begin
      event_link_reset_q <= 0;
    end else begin
      event_link_reset_q <= event_link_reset;
    end
  end

  always_comb begin
    clear_rdybit = 12'b0;
    update_pend  = 12'b0;
    if (event_link_reset && !event_link_reset_q) begin
      clear_rdybit = 12'hfff;
      update_pend  = 12'hfff;
    end else begin
      clear_rdybit[usb_in_endpoint] = set_sent | out_clear_rdy;  // lint: usb_in_endpoint range was checked
      update_pend[usb_in_endpoint]  = out_clear_rdy;  // lint: usb_in_endpoint range was checked
    end
  end
  assign {hw2reg.configin11.rdy11.de, hw2reg.configin10.rdy10.de,
          hw2reg.configin9.rdy9.de,   hw2reg.configin8.rdy8.de,
          hw2reg.configin7.rdy7.de,   hw2reg.configin6.rdy6.de,
          hw2reg.configin5.rdy5.de,   hw2reg.configin4.rdy4.de,
          hw2reg.configin3.rdy3.de,   hw2reg.configin2.rdy2.de,
          hw2reg.configin1.rdy1.de,   hw2reg.configin0.rdy0.de } = clear_rdybit;

  assign {hw2reg.configin11.rdy11.d, hw2reg.configin10.rdy10.d,
          hw2reg.configin9.rdy9.d,   hw2reg.configin8.rdy8.d,
          hw2reg.configin7.rdy7.d,   hw2reg.configin6.rdy6.d,
          hw2reg.configin5.rdy5.d,   hw2reg.configin4.rdy4.d,
          hw2reg.configin3.rdy3.d,   hw2reg.configin2.rdy2.d,
          hw2reg.configin1.rdy1.d,   hw2reg.configin0.rdy0.d } = 12'b0;

  // Update the pending bit by copying the ready bit that is about to clear
  assign {hw2reg.configin11.pend11.de, hw2reg.configin10.pend10.de,
          hw2reg.configin9.pend9.de,   hw2reg.configin8.pend8.de,
          hw2reg.configin7.pend7.de,   hw2reg.configin6.pend6.de,
          hw2reg.configin5.pend5.de,   hw2reg.configin4.pend4.de,
          hw2reg.configin3.pend3.de,   hw2reg.configin2.pend2.de,
          hw2reg.configin1.pend1.de,   hw2reg.configin0.pend0.de } = update_pend;

  assign hw2reg.configin11.pend11.d = reg2hw.configin11.rdy11.q | reg2hw.configin11.pend11.q;
  assign hw2reg.configin10.pend10.d = reg2hw.configin10.rdy10.q | reg2hw.configin10.pend10.q;
  assign hw2reg.configin9.pend9.d   = reg2hw.configin9.rdy9.q   | reg2hw.configin9.pend9.q;
  assign hw2reg.configin8.pend8.d   = reg2hw.configin8.rdy8.q   | reg2hw.configin8.pend8.q;
  assign hw2reg.configin7.pend7.d   = reg2hw.configin7.rdy7.q   | reg2hw.configin7.pend7.q;
  assign hw2reg.configin6.pend6.d   = reg2hw.configin6.rdy6.q   | reg2hw.configin6.pend6.q;
  assign hw2reg.configin5.pend5.d   = reg2hw.configin5.rdy5.q   | reg2hw.configin5.pend5.q;
  assign hw2reg.configin4.pend4.d   = reg2hw.configin4.rdy4.q   | reg2hw.configin4.pend4.q;
  assign hw2reg.configin3.pend3.d   = reg2hw.configin3.rdy3.q   | reg2hw.configin3.pend3.q;
  assign hw2reg.configin2.pend2.d   = reg2hw.configin2.rdy2.q   | reg2hw.configin2.pend2.q;
  assign hw2reg.configin1.pend1.d   = reg2hw.configin1.rdy1.q   | reg2hw.configin1.pend1.q;
  assign hw2reg.configin0.pend0.d   = reg2hw.configin0.rdy0.q   | reg2hw.configin0.pend0.q;

  //======================================================================
  // USB interface -- everything is in USB clock domain

  assign hw2reg.usbstat.usb_sense.d = cio_usb_sense_i;

  usbdev_usbif #(
    .AVFifoWidth    (AVFifoWidth),
    .RXFifoWidth    (RXFifoWidth),
    .MaxPktSizeByte (MaxPktSizeByte),
    .NBuf           (NBuf),
    .SramAw         (SramAw)
  ) usbdev_impl (
    .clk_48mhz_i     (clk_usb_48mhz_i),
    .rst_ni          (usbdev_rst_n),

    // Pins
    .usb_dp_i        (cio_usb_dp_i),
    .usb_dp_o        (cio_usb_dp_o),
    .usb_dp_en_o     (cio_usb_dp_en_o),
    .usb_dn_i        (cio_usb_dn_i),
    .usb_dn_o        (cio_usb_dn_o),
    .usb_dn_en_o     (cio_usb_dn_en_o),
    .usb_sense_i     (cio_usb_sense_i),
    .usb_pullup_o    (cio_usb_pullup_o),
    .usb_pullup_en_o (cio_usb_pullup_en_o),

    // receive side
    .rx_setup_i      (enable_setup),
    .rx_out_i        (enable_out),
    .rx_stall_i      (ep_stall),
    .av_rvalid_i     (usb_av_rvalid),
    .av_rready_o     (usb_av_rready),
    .av_rdata_i      (usb_av_rdata),
    .event_av_empty_o(event_av_empty),

    .rx_wvalid_o     (usb_rx_wvalid),
    .rx_wready_i     (usb_rx_wready),
    .rx_wdata_o      (usb_rx_wdata),
    .event_rx_full_o (event_rx_full),
    .out_clear_rdy_o (usb_out_clear_rdy),
    .out_endpoint_o  (),

    // transmit side
    .in_buf_i        (usb_in_buf[usb_in_endpoint]),  // lint: usb_in_endpoint range was checked
    .in_size_i       (usb_in_size[usb_in_endpoint]),  // lint: usb_in_endpoint range was checked
    .in_stall_i      (ep_stall),
    .in_rdy_i        (usb_in_rdy),
    .set_sent_o      (usb_set_sent),
    .in_endpoint_o   (usb_in_endpoint),

    // memory
    .mem_req_o       (usb_mem_b_req),
    .mem_write_o     (usb_mem_b_write),
    .mem_addr_o      (usb_mem_b_addr),
    .mem_wdata_o     (usb_mem_b_wdata),
    .mem_rdata_i     (usb_mem_b_rdata),

    // control
    .enable_i        (reg2hw.usbctrl.enable.q),
    .devaddr_i       (reg2hw.usbctrl.device_address.q),
    .clr_devaddr_o   (usb_clr_devaddr),

    // status
    .frame_o         (hw2reg.usbstat.frame.d),
    .link_state_o    (hw2reg.usbstat.link_state.d),
    .link_disconnect_o(usb_event_disconnect),
    .link_reset_o    (usb_event_link_reset),
    .link_suspend_o  (usb_event_link_suspend),
    .link_resume_o   (usb_event_link_resume),
    .host_lost_o     (usb_event_host_lost)
  );

  // CDC for event signals (arguably they are there for a long time so would be ok)
  // Just want a pulse to ensure only one interrupt for an event
  usbdev_flop_2syncpulse #(.Width(4)) syncevent (
    .clk_i  (clk_i),
    .rst_ni (rst_ni),
    .d      ({usb_event_disconnect, usb_event_link_reset, usb_event_link_suspend,
              usb_event_host_lost}),
    .q      ({event_disconnect, event_link_reset, event_link_suspend, event_host_lost})
  );

  // Resume is a single pulse so needs pulsesync
  prim_pulse_sync usbdev_resume (
    .clk_src_i   (clk_usb_48mhz_i),
    .clk_dst_i   (clk_i),
    .rst_src_ni  (rst_ni),
    .rst_dst_ni  (rst_ni),
    .src_pulse_i (usb_event_link_resume),
    .dst_pulse_o (event_link_resume)
  );

  assign hw2reg.usbstat.host_lost.d = event_host_lost;

  // resets etc cause the device address to clear
  prim_pulse_sync usbdev_devclr (
    .clk_src_i   (clk_usb_48mhz_i),
    .clk_dst_i   (clk_i),
    .rst_src_ni  (rst_ni),
    .rst_dst_ni  (rst_ni),
    .src_pulse_i (usb_clr_devaddr),
    .dst_pulse_o (hw2reg.usbctrl.device_address.de)
  );
  assign hw2reg.usbctrl.device_address.d = '0;


  //======================================================================

  logic        unused_mem_a_rerror_d;

  tlul_adapter_sram #(
    .SramAw(SramAw)
  ) u_tlul2sram (
    .clk_i,
    .rst_ni,

    .tl_i     (tl_sram_h2d [0]),
    .tl_o     (tl_sram_d2h [0]),

    .req_o    (mem_a_req),
    .gnt_i    (mem_a_req),  //Always grant when request
    .we_o     (mem_a_write),
    .addr_o   (mem_a_addr),
    .wdata_o  (mem_a_wdata),
    .wmask_o  (),           // Not used
    .rdata_i  (mem_a_rdata),
    .rvalid_i (mem_a_rvalid),
    .rerror_i (mem_a_rerror)
  );

  assign unused_mem_a_rerror_d = mem_a_rerror[1] ; // Only uncorrectable error

  // SRAM Wrapper
  prim_ram_2p_async_adv #(
    .Depth (SramDepth),
    .Width (SramDw),    // 32 x 512 --> 2kB
    .CfgW  (8),

    .EnableECC           (1), // No Protection
    .EnableParity        (0),
    .EnableInputPipeline (0),
    .EnableOutputPipeline(0),

    .MemT ("REGISTER")
  ) u_memory_2p (
    .clk_a_i    (clk_i),
    .clk_b_i    (clk_usb_48mhz_i),
    .rst_ni     (rst_ni),
    .a_req_i    (mem_a_req),
    .a_write_i  (mem_a_write),
    .a_addr_i   (mem_a_addr),
    .a_wdata_i  (mem_a_wdata),
    .a_rvalid_o (mem_a_rvalid),
    .a_rdata_o  (mem_a_rdata),
    .a_rerror_o (mem_a_rerror),

    .b_req_i    (usb_mem_b_req),
    .b_write_i  (usb_mem_b_write),
    .b_addr_i   (usb_mem_b_addr),
    .b_wdata_i  (usb_mem_b_wdata),
    .b_rvalid_o (),
    .b_rdata_o  (usb_mem_b_rdata),
    .b_rerror_o (),

    .cfg_i      ('0)
  );

  // Register module
  usbdev_reg_top u_reg (
    .clk_i,
    .rst_ni,

    .tl_i (tl_d_i),
    .tl_o (tl_d_o),

    .tl_win_o (tl_sram_h2d),
    .tl_win_i (tl_sram_d2h),

    .reg2hw,
    .hw2reg,

    .devmode_i  (1'b1)
  );

  prim_intr_hw #(.Width(1)) intr_hw_pkt_received (
    .event_intr_i           (event_pkt_received),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.pkt_received.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.pkt_received.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.pkt_received.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.pkt_received.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.pkt_received.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.pkt_received.d),
    .intr_o                 (intr_pkt_received_o)
  );

  prim_intr_hw #(.Width(1)) intr_hw_pkt_sent (
    .event_intr_i           (set_sent),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.pkt_sent.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.pkt_sent.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.pkt_sent.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.pkt_sent.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.pkt_sent.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.pkt_sent.d),
    .intr_o                 (intr_pkt_sent_o)
  );

  prim_intr_hw #(.Width(1)) intr_disconnected (
    .event_intr_i           (event_disconnect),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.disconnected.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.disconnected.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.disconnected.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.disconnected.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.disconnected.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.disconnected.d),
    .intr_o                 (intr_disconnected_o)
  );

  prim_intr_hw #(.Width(1)) intr_host_lost (
    .event_intr_i           (event_host_lost),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.host_lost.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.host_lost.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.host_lost.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.host_lost.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.host_lost.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.host_lost.d),
    .intr_o                 (intr_host_lost_o)
  );

  prim_intr_hw #(.Width(1)) intr_link_reset (
    .event_intr_i           (event_link_reset),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.link_reset.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.link_reset.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.link_reset.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.link_reset.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.link_reset.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.link_reset.d),
    .intr_o                 (intr_link_reset_o)
  );

  prim_intr_hw #(.Width(1)) intr_link_suspend (
    .event_intr_i           (event_link_suspend),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.link_suspend.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.link_suspend.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.link_suspend.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.link_suspend.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.link_suspend.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.link_suspend.d),
    .intr_o                 (intr_link_suspend_o)
  );

  prim_intr_hw #(.Width(1)) intr_link_resume (
    .event_intr_i           (event_link_resume),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.link_resume.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.link_resume.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.link_resume.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.link_resume.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.link_resume.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.link_resume.d),
    .intr_o                 (intr_link_resume_o)
  );

  prim_intr_hw #(.Width(1)) intr_av_empty (
    .event_intr_i           (event_av_empty),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.av_empty.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.av_empty.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.av_empty.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.av_empty.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.av_empty.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.av_empty.d),
    .intr_o                 (intr_av_empty_o)
  );

  prim_intr_hw #(.Width(1)) intr_rx_full (
    .event_intr_i           (event_rx_full),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.rx_full.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.rx_full.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.rx_full.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.rx_full.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.rx_full.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.rx_full.d),
    .intr_o                 (intr_rx_full_o)
  );

  prim_intr_hw #(.Width(1)) intr_av_overflow (
    .event_intr_i           (event_av_overflow),
    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.av_overflow.q),
    .reg2hw_intr_test_q_i   (reg2hw.intr_test.av_overflow.q),
    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.av_overflow.qe),
    .reg2hw_intr_state_q_i  (reg2hw.intr_state.av_overflow.q),
    .hw2reg_intr_state_de_o (hw2reg.intr_state.av_overflow.de),
    .hw2reg_intr_state_d_o  (hw2reg.intr_state.av_overflow.d),
    .intr_o                 (intr_av_overflow_o)
  );

endmodule
