Files
b210-k7-fpga/lib/rfnoc/blocks/rfnoc_block_moving_avg/PkgMovingAverage.sv
T
Wade Fife d2febe93a8 fpga: rfnoc: Add RFNoC Moving Average block
Original-commit: b3c74a712a08c54e48713427bf46ea498b8e899b
2020-07-16 12:15:21 -05:00

73 lines
1.9 KiB
Systemverilog

//
// Copyright 2020 Ettus Research, A National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: PkgMovingAverage
//
// Description: This package contains the MovingAverage class, which models
// the expected behavior of the moving average RFNoC block.
//
package PkgMovingAverage;
// This class implements the same moving-average computation as the DUT
class MovingAverage;
local int sum; // Current running sum
local int sum_length; // Number of samples to sum or average
local int divisor; // Divisor value to use for averaging
local int history[$]; // History of previous values
function new();
// Initialize all values
set_sum_length(0);
endfunction : new
// Set the number of vales to sum
function void set_sum_length(int value);
sum = 0;
sum_length = value;
history = {};
endfunction : set_sum_length
// Set the divisor value
function void set_divisor(int value);
divisor = value;
endfunction : set_divisor
// Add a value to the history of values used in the sum computation
function void add_value(int value);
history.push_back(value);
sum += value;
// Check if we have a full history
if (history.size() > sum_length) begin
sum -= history.pop_front();
end
endfunction : add_value
// Return the current running sum
function int get_sum();
return sum;
endfunction : get_sum
// Return the current running average
function int get_average();
int result;
// Round to nearest integer, the same way the IP does.
result = $floor(real'(get_sum())/real'(divisor) + 0.5);
// Saturate to 16-bit signed
if (result > 32767) result = 32767;
if (result < -32768) result = 32768;
return result;
endfunction : get_average
endclass : MovingAverage
endpackage