aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/dsp/round_sd.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/dsp/round_sd.v')
-rw-r--r--fpga/usrp3/lib/dsp/round_sd.v59
1 files changed, 45 insertions, 14 deletions
diff --git a/fpga/usrp3/lib/dsp/round_sd.v b/fpga/usrp3/lib/dsp/round_sd.v
index 37aef53f0..a265141e6 100644
--- a/fpga/usrp3/lib/dsp/round_sd.v
+++ b/fpga/usrp3/lib/dsp/round_sd.v
@@ -1,33 +1,64 @@
//
-// Copyright 2016 Ettus Research
-// Copyright 2018 Ettus Research, a National Instruments Company
+// Copyright 2021 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
module round_sd #(
- parameter WIDTH_IN=18,
- parameter WIDTH_OUT=16,
- parameter DISABLE_SD=0
-)(
- input clk, input reset,
- input [WIDTH_IN-1:0] in, input strobe_in,
- output reg [WIDTH_OUT-1:0] out, output reg strobe_out
+ parameter WIDTH_IN = 18,
+ parameter WIDTH_OUT = 16,
+ parameter DISABLE_SD = 0
+) (
+ input clk,
+ input reset,
+ input [ WIDTH_IN-1:0] in,
+ input strobe_in,
+ output reg [WIDTH_OUT-1:0] out = 0,
+ output reg strobe_out = 0
);
localparam ERR_WIDTH = WIDTH_IN - WIDTH_OUT + 1;
wire [ERR_WIDTH-1:0] err;
- wire [WIDTH_IN-1:0] err_ext, sum;
+ wire [WIDTH_IN-1:0] err_ext, err_ext_01, sum;
wire [WIDTH_OUT-1:0] out_pre;
wire strobe_pre;
- sign_extend #(.bits_in(ERR_WIDTH),.bits_out(WIDTH_IN)) ext_err (.in(err), .out(err_ext));
+ sign_extend #(
+ .bits_in (ERR_WIDTH),
+ .bits_out (WIDTH_IN)
+ ) ext_err (
+ .in (err),
+ .out (err_ext)
+ );
- add2_and_clip_reg #(.WIDTH(WIDTH_IN)) add2_and_clip_reg (
- .clk(clk), .rst(reset), .in1(in), .in2((DISABLE_SD == 0) ? err_ext : {WIDTH_IN{1'b0}}), .strobe_in(strobe_in), .sum(sum), .strobe_out(strobe_pre));
+ assign err_ext_01 =
+ //synthesis translate_off
+ // Disallow X from getting stuck on the err_ext feedback path in simulation
+ (^err_ext === 1'bX) ? 0 :
+ //synthesis translate_on
+ err_ext;
- round #(.bits_in(WIDTH_IN),.bits_out(WIDTH_OUT)) round_sum (.in(sum), .out(out_pre), .err(err));
+ add2_and_clip_reg #(
+ .WIDTH (WIDTH_IN)
+ ) add2_and_clip_reg (
+ .clk (clk),
+ .rst (reset),
+ .in1 (in),
+ .in2 ((DISABLE_SD == 0) ? err_ext_01 : {WIDTH_IN{1'b0}}),
+ .strobe_in (strobe_in),
+ .sum (sum),
+ .strobe_out (strobe_pre)
+ );
+
+ round #(
+ .bits_in (WIDTH_IN),
+ .bits_out (WIDTH_OUT)
+ ) round_sum (
+ .in (sum),
+ .out (out_pre),
+ .err (err)
+ );
always @(posedge clk) begin
if (reset) begin