Skip to content

Utilization

Steven Herbst edited this page Aug 12, 2020 · 11 revisions

using part xc7z020clg400-1 (i.e., FPGA on the PYNQ_Z1 board)

  • Fixed-point:
    • ADD (input range 10, output 20)
      • WIDTH 25: 24 LUTs
      • WIDTH 24: 23 LUTs
      • WIDTH 26: 25 LUTs
    • ADD_CONST
      • LONG=25, SHORT=18
    • MUL (input range 10, output 100)
      • A, B, C @ 25 bits: 2 DSPs
      • A @ 25, B @ 18, C @ 25:
      • A @ 25, B @ 19, C @ 25:
      • A @ 25, B @ 20, C @ 25:
      • A @ 26, B @ 18, C @ 25:
      • A @ 27, B @ 18, C @ 25:
    • MUL_CONST
      • LONG=25, SHORT=18
  • HardFloat:
    • ADD
      • EXP=8, WIDTH=24: 492 LUTs
      • EXP=8, WIDTH=25: 507 LUTs
      • EXP=8, WIDTH=23: 506 LUTs
      • EXP=9, WIDTH=24: 496 LUTs
      • EXP=7, WIDTH=24: 498 LUTs
    • ADD_CONST
      • EXP=8, WIDTH=24
    • MUL
      • EXP=8, WIDTH=24: 313 LUTs, 3 DSPs
      • EXP=8, WIDTH=23: 187 LUTs, 2 DSPs
      • EXP=8, WIDTH=25: 348 LUTs, 3 DSPs
      • EXP=8, WIDTH=22: 177 LUTs, 2 DSPs
      • EXP=8, WIDTH=21: 168 LUTs, 2 DSPs
      • EXP=8, WIDTH=20: 238 LUTs, 1 DSP
      • EXP=8, WIDTH=19: 215 LUTs, 1 DSP
      • EXP=8, WIDTH=18: 169 LUTs, 1 DSP
      • EXP=7, WIDTH=24: 321 LUTs, 3 DSPs
      • EXP=9, WIDTH=24: 311 LUTs, 3 DSPs
    • MUL_CONST
      • EXP=8, WIDTH=24

Sample experiment code (modified by hand to run each case):

`timescale 1ns / 1ps
//`define HARD_FLOAT
//`define HARD_FLOAT_EXP_WIDTH 8
//`define HARD_FLOAT_SIG_WIDTH 24
`include "svreal.sv"

module top #(
    parameter integer `WIDTH_PARAM_REAL(a) = 25,
    parameter integer `WIDTH_PARAM_REAL(b) = 18,
    parameter integer `WIDTH_PARAM_REAL(c) = 25
) (
    `INPUT_REAL(a),
    `INPUT_REAL(b),
    `OUTPUT_REAL(c)
);
    localparam real `RANGE_PARAM_REAL(a) = 10;
    localparam integer `EXPONENT_PARAM_REAL(a) = 
        `CALC_EXP(`RANGE_PARAM_REAL(a), `WIDTH_PARAM_REAL(a));

    localparam real `RANGE_PARAM_REAL(b) = 10;
    localparam integer `EXPONENT_PARAM_REAL(b) = 
        `CALC_EXP(`RANGE_PARAM_REAL(b), `WIDTH_PARAM_REAL(b));

    localparam real `RANGE_PARAM_REAL(c) = 100;
    localparam integer `EXPONENT_PARAM_REAL(c) = 
        `CALC_EXP(`RANGE_PARAM_REAL(c), `WIDTH_PARAM_REAL(c));

    `MUL_INTO_REAL(a, b, c);
endmodule

Clone this wiki locally