../src/lowrisc_dv_dpi_usbdpi_0.1/usbdpi.sv Cov: 86%

   1: // Copyright lowRISC contributors.
   2: // Licensed under the Apache License, Version 2.0, see LICENSE for details.
   3: // SPDX-License-Identifier: Apache-2.0
   4: 
   5: // USBDPI -- act as a simple host for usbuart device
   6: 
   7: // Bits in LOG_LEVEL sets what is output on socket
   8: // 0x01 -- monitor_usb (packet level)
   9: // 0x08 -- bit level
  10: 
  11: module usbdpi #(
  12:   parameter string NAME = "usb0",
  13:   parameter LOG_LEVEL = 1
  14: )(
  15:   input  logic clk_i,
  16:   input  logic rst_ni,
  17:   input  logic clk_48MHz_i,
  18:   output logic dp_p2d,
  19:   input  logic dp_d2p,
  20:   input  logic dp_en_d2p,
  21:   output logic dn_p2d,
  22:   input  logic dn_d2p,
  23:   input  logic dn_en_d2p,
  24:   output logic sense_p2d,
  25:   input  logic pullup_d2p,
  26:   input  logic pullup_en_d2p
  27: );
  28:   import "DPI-C" function
  29:     chandle usbdpi_create(input string name, input int loglevel);
  30: 
  31:   import "DPI-C" function
  32:     void usbdpi_device_to_host(input chandle ctx, input bit [4:0] d2p);
  33: 
  34:   import "DPI-C" function
  35:     void usbdpi_close(input chandle ctx);
  36: 
  37:   import "DPI-C" function
  38:     byte usbdpi_host_to_device(input chandle ctx, input bit [4:0] d2p);
  39: 
  40:   chandle ctx;
  41: 
  42:   initial begin
  43:     ctx = usbdpi_create(NAME, LOG_LEVEL);
  44:   end
  45: 
  46:   final begin
  47:     usbdpi_close(ctx);
  48:   end
  49: 
  50:   logic [4:0] d2p;
  51:   logic [4:0] d2p_r;
  52:   logic       unused_dummy;
  53:   logic       unused_clk = clk_i;
  54:   logic       unused_rst = rst_ni;
  55:   logic       dp_int, dn_int;
  56: 
  57:   assign d2p = {dp_d2p, dp_en_d2p, dn_d2p, dn_en_d2p, pullup_d2p & pullup_en_d2p};
  58:   always_ff @(posedge clk_48MHz_i) begin
  59:     if (pullup_d2p && pullup_en_d2p) begin
  60:       automatic byte p2d = usbdpi_host_to_device(ctx, d2p);
  61:       dp_int <= p2d[2];
  62:       dn_int <= p2d[1];
  63:       sense_p2d <= p2d[0];
  64:       unused_dummy <= |p2d[7:3];
  65:       d2p_r <= d2p;
  66:       if (d2p_r != d2p) begin
  67:         usbdpi_device_to_host(ctx, d2p);
  68:       end
  69:     end else begin
  70:       dp_int <= 0;
  71:       dn_int <= 0;
  72:     end
  73:   end
  74: 
  75:   always_comb begin : proc_data
  76:     if (dp_en_d2p) begin
  77:       dp_p2d = dp_d2p;
  78:     end else begin
  79:       dp_p2d = dp_int;
  80:     end
  81:     if (dn_en_d2p) begin
  82:       dn_p2d = dn_d2p;
  83:     end else begin
  84:       dn_p2d = dn_int;
  85:     end
  86:   end
  87: endmodule
  88: