| Line 1... | 
        Line 1... | 
      
      
        // ============================================================================
  | 
        // ============================================================================
  | 
      
      
        //        __
  | 
        //        __
  | 
      
      
        //   \\__/ o\    (C) 2019  Robert Finch, Waterloo
  | 
        //   \\__/ o\    (C) 2006-2019  Robert Finch, Waterloo
  | 
      
      
        //    \  __ /    All rights reserved.
  | 
        //    \  __ /    All rights reserved.
  | 
      
      
        //     \/_//     robfinch@finitron.ca
  | 
        //     \/_//     robfinch@finitron.ca
  | 
      
      
        //       ||
  | 
        //       ||
  | 
      
      
        //
  | 
        //
  | 
      
      
        //
  | 
        //
  | 
      
      
        | Line 19... | 
        Line 19... | 
      
      
        // You should have received a copy of the GNU General Public License
  | 
        // You should have received a copy of the GNU General Public License
  | 
      
      
        // along with this program.  If not, see .
  | 
        // along with this program.  If not, see .
  | 
      
      
        //
  | 
        //
  | 
      
      
        // ============================================================================
  | 
        // ============================================================================
  | 
      
      
        //
  | 
        //
  | 
      
      
        module fpRes(clk, a, o);
  | 
        module fpRes(clk, ce, a, o);
  | 
      
      
        parameter WID = 128;
  | 
        parameter WID = 128;
  | 
      
      
        localparam MSB = WID-1;
  | 
        `include "fpSize.sv"
  | 
      
      
        localparam EMSB = WID==128 ? 14 :
  | 
           | 
      
      
                          WID==96 ? 14 :
  | 
           | 
      
      
                          WID==80 ? 14 :
  | 
           | 
      
      
                          WID==64 ? 10 :
  | 
           | 
      
      
                                          WID==52 ? 10 :
  | 
           | 
      
      
                                          WID==48 ? 11 :
  | 
           | 
      
      
                                          WID==44 ? 10 :
  | 
           | 
      
      
                                          WID==42 ? 10 :
  | 
           | 
      
      
                                          WID==40 ?  9 :
  | 
           | 
      
      
                                          WID==32 ?  7 :
  | 
           | 
      
      
                                          WID==24 ?  6 : 4;
  | 
           | 
      
      
        localparam FMSB = WID==128 ? 111 :
  | 
           | 
      
      
                          WID==96 ? 79 :
  | 
           | 
      
      
                          WID==80 ? 63 :
  | 
           | 
      
      
                          WID==64 ? 51 :
  | 
           | 
      
      
                                          WID==52 ? 39 :
  | 
           | 
      
      
                                          WID==48 ? 34 :
  | 
           | 
      
      
                                          WID==44 ? 31 :
  | 
           | 
      
      
                                          WID==42 ? 29 :
  | 
           | 
      
      
                                          WID==40 ? 28 :
  | 
           | 
      
      
                                          WID==32 ? 22 :
  | 
           | 
      
      
                                          WID==24 ? 15 : 9;
  | 
           | 
      
      
        input clk;
  | 
        input clk;
  | 
      
      
           | 
        input ce;
  | 
      
      
        input [WID-1:0] a;
  | 
        input [WID-1:0] a;
  | 
      
      
        output [WID-1:0] o;
  | 
        output [WID-1:0] o;
  | 
      
      
         
  | 
         
  | 
      
      
        // This table encodes two endpoints k0, k1 of a piece-wise linear
  | 
        // This table encodes two endpoints k0, k1 of a piece-wise linear
  | 
      
      
        // approximation to the reciprocal in the range [1.0,2.0).
  | 
        // approximation to the reciprocal in the range [1.0,2.0).
  | 
      
      
        | Line 1093... | 
        Line 1072... | 
      
      
        wire [EMSB:0] exp3;
  | 
        wire [EMSB:0] exp3;
  | 
      
      
        wire [9:0] index = ma[FMSB:FMSB-9];
  | 
        wire [9:0] index = ma[FMSB:FMSB-9];
  | 
      
      
        reg [9:0] indexr;
  | 
        reg [9:0] indexr;
  | 
      
      
        reg [15:0] k0, k1;
  | 
        reg [15:0] k0, k1;
  | 
      
      
        always @(posedge clk)
  | 
        always @(posedge clk)
  | 
      
      
                indexr <= index;
  | 
                if(ce) indexr <= index;
  | 
      
      
        always @(posedge clk)
  | 
        always @(posedge clk)
  | 
      
      
                k0 <= k01[indexr][31:16];
  | 
                if(ce) k0 <= k01[indexr][31:16];
  | 
      
      
        always @(posedge clk)
  | 
        always @(posedge clk)
  | 
      
      
                k1 <= k01[indexr][15: 0];
  | 
                if(ce) k1 <= k01[indexr][15: 0];
  | 
      
      
        delay3 #(1) u2 (.clk(clk), .ce(1'b1), .i(sa), .o(sa3));
  | 
        delay3 #(1) u2 (.clk(clk), .ce(1'b1), .i(sa), .o(sa3));
  | 
      
      
        delay3 #(EMSB+1) u3 (.clk(clk), .ce(1'b1), .i(exp), .o(exp3));
  | 
        delay3 #(EMSB+1) u3 (.clk(clk), .ce(1'b1), .i(exp), .o(exp3));
  | 
      
      
        wire [15:0] eps = ma[FMSB-10:FMSB-10-15];
  | 
        wire [15:0] eps = ma[FMSB-10:FMSB-10-15];
  | 
      
      
        wire [31:0] p = k1 * eps;
  | 
        wire [31:0] p = k1 * eps;
  | 
      
      
        reg [15:0] r0;
  | 
        reg [15:0] r0;
  | 
      
      
        always @(posedge clk)
  | 
        always @(posedge clk)
  | 
      
      
                r0 <= k0 - (p >> 26);
  | 
                if(ce) r0 <= k0 - (p >> 26);
  | 
      
      
        assign o = {sa3,exp3,r0[14:0],{FMSB+2-16{1'b0}}};
  | 
        assign o = {sa3,exp3,r0[14:0],{FMSB+2-16{1'b0}}};
  | 
      
      
         
  | 
         
  | 
      
      
        always @*
  | 
        always @*
  | 
      
      
                if (WID < 48) begin
  | 
                if (WID < 48) begin
  | 
      
      
                        $display("Reciprocal estimate needs at least 48 bit floats.");
  | 
                        $display("Reciprocal estimate needs at least 48 bit floats.");
  |