../src/lowrisc_ip_usbdev_0.1/rtl/usbdev_flop_2syncpulse.sv Cov: 100%
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: // Generic double-synchronizer flop followed by pulse generation
6:
7: module usbdev_flop_2syncpulse #(
8: parameter int unsigned Width = 16
9: ) (
10: input logic clk_i, // receive clock
11: input logic rst_ni,
12: input logic [Width-1:0] d,
13: output logic [Width-1:0] q
14: );
15:
16: // double-flop synchronizer cell
17: logic [Width-1:0] d_sync;
18: prim_flop_2sync #(.Width (Width)) prim_flop_2sync (
19: .clk_i,
20: .rst_ni,
21: .d,
22: .q (d_sync)
23: );
24:
25: // delay d_sync by 1 cycle
26: logic [Width-1:0] d_sync_q;
27: always_ff @(posedge clk_i or negedge rst_ni) begin
28: if (!rst_ni) begin
29: d_sync_q <= '0;
30: end else begin
31: d_sync_q <= d_sync;
32: end
33: end
34:
35: // rising edge detection
36: assign q = d_sync & ~d_sync_q;
37:
38: endmodule
39: