aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/control/synchronizer.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/control/synchronizer.v')
-rw-r--r--fpga/usrp3/lib/control/synchronizer.v50
1 files changed, 50 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/control/synchronizer.v b/fpga/usrp3/lib/control/synchronizer.v
new file mode 100644
index 000000000..177b1219c
--- /dev/null
+++ b/fpga/usrp3/lib/control/synchronizer.v
@@ -0,0 +1,50 @@
+//
+// Copyright 2014 Ettus Research LLC
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+//
+
+module synchronizer #(
+ parameter WIDTH = 1,
+ parameter STAGES = 2,
+ parameter INITIAL_VAL = 0,
+ parameter FALSE_PATH_TO_IN = 1
+)(
+ input clk,
+ input rst,
+ input [WIDTH-1:0] in,
+ output [WIDTH-1:0] out
+);
+
+ //Q: Why do we have a separate impl and instantiate
+ //it with a different instance name based on this
+ //arbitrary parameter FALSE_PATH_TO_IN?
+ //A: To make constraining these synchronizers easier.
+ //We would like to write a single false path constraint
+ //for all synchronizers when the input is truly async.
+ //However other cases might require constraining the input
+ //of this module.
+ //To enable this, all clients that hook up async signals to
+ //the "in" port can set FALSE_PATH_TO_IN=1 (or use the default)
+ //and all clients that want the "in" delay to be constrained can
+ //set FALSE_PATH_TO_IN=0.
+ //In the XDC we can write the following async constraint:
+ //set_false_path -to [get_pins */synchronizer_false_path/stages[0].value_reg[0]/D]
+ //and this will take care of all instances of this module with FALSE_PATH_TO_IN==1
+
+ generate if (FALSE_PATH_TO_IN == 1) begin
+ synchronizer_impl #(
+ .WIDTH(WIDTH), .STAGES(STAGES), .INITIAL_VAL(INITIAL_VAL)
+ ) synchronizer_false_path (
+ .clk(clk), .rst(rst), .in(in), .out(out)
+ );
+ end else begin
+ synchronizer_impl #(
+ .WIDTH(WIDTH), .STAGES(STAGES), .INITIAL_VAL(INITIAL_VAL)
+ ) synchronizer_constrained (
+ .clk(clk), .rst(rst), .in(in), .out(out)
+ );
+ end endgenerate
+
+endmodule //synchronizer