../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: