blob: 5e4fab9304bf2649ed40f60df93769778ab8b32b [file] [log] [blame]
// Copyright 2019 ETH Zurich and University of Bologna.
//
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 0.51 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
// or agreed to in writing, software, hardware and materials distributed under
// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
// Author: Stefan Mach <smach@iis.ee.ethz.ch>
module fpnew_classifier #(
parameter fpnew_pkg::fp_format_e FpFormat = fpnew_pkg::fp_format_e'(0),
parameter int unsigned NumOperands = 1,
// Do not change
localparam int unsigned WIDTH = fpnew_pkg::fp_width(FpFormat)
) (
input logic [NumOperands-1:0][WIDTH-1:0] operands_i,
input logic [NumOperands-1:0] is_boxed_i,
output fpnew_pkg::fp_info_t [NumOperands-1:0] info_o
);
localparam int unsigned EXP_BITS = fpnew_pkg::exp_bits(FpFormat);
localparam int unsigned MAN_BITS = fpnew_pkg::man_bits(FpFormat);
// Type definition
typedef struct packed {
logic sign;
logic [EXP_BITS-1:0] exponent;
logic [MAN_BITS-1:0] mantissa;
} fp_t;
// Iterate through all operands
for (genvar op = 0; op < int'(NumOperands); op++) begin : gen_num_values
fp_t value;
logic is_boxed;
logic is_normal;
logic is_inf;
logic is_nan;
logic is_signalling;
logic is_quiet;
logic is_zero;
logic is_subnormal;
// ---------------
// Classify Input
// ---------------
always_comb begin : classify_input
value = operands_i[op];
is_boxed = is_boxed_i[op];
is_normal = is_boxed && (value.exponent != '0) && (value.exponent != '1);
is_zero = is_boxed && (value.exponent == '0) && (value.mantissa == '0);
is_subnormal = is_boxed && (value.exponent == '0) && !is_zero;
is_inf = is_boxed && ((value.exponent == '1) && (value.mantissa == '0));
is_nan = !is_boxed || ((value.exponent == '1) && (value.mantissa != '0));
is_signalling = is_boxed && is_nan && (value.mantissa[MAN_BITS-1] == 1'b0);
is_quiet = is_nan && !is_signalling;
// Assign output for current input
info_o[op].is_normal = is_normal;
info_o[op].is_subnormal = is_subnormal;
info_o[op].is_zero = is_zero;
info_o[op].is_inf = is_inf;
info_o[op].is_nan = is_nan;
info_o[op].is_signalling = is_signalling;
info_o[op].is_quiet = is_quiet;
info_o[op].is_boxed = is_boxed;
end
end
endmodule