Line 1... |
Line 1... |
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
// ============================================================================
|
// ============================================================================
|
// __
|
// __
|
// \\__/ o\ (C) 2006-2016 Robert Finch, Waterloo
|
// \\__/ o\ (C) 2006-2018 Robert Finch, Waterloo
|
// \ __ / All rights reserved.
|
// \ __ / All rights reserved.
|
// \/_// robfinch<remove>@finitron.ca
|
// \/_// robfinch<remove>@finitron.ca
|
// ||
|
// ||
|
//
|
//
|
// fpAddsub.v
|
// fpAddsub.v
|
Line 35... |
Line 35... |
localparam EMSB = WID==128 ? 14 :
|
localparam EMSB = WID==128 ? 14 :
|
WID==96 ? 14 :
|
WID==96 ? 14 :
|
WID==80 ? 14 :
|
WID==80 ? 14 :
|
WID==64 ? 10 :
|
WID==64 ? 10 :
|
WID==52 ? 10 :
|
WID==52 ? 10 :
|
WID==48 ? 10 :
|
WID==48 ? 11 :
|
WID==44 ? 10 :
|
WID==44 ? 10 :
|
WID==42 ? 10 :
|
WID==42 ? 10 :
|
WID==40 ? 9 :
|
WID==40 ? 9 :
|
WID==32 ? 7 :
|
WID==32 ? 7 :
|
WID==24 ? 6 : 4;
|
WID==24 ? 6 : 4;
|
localparam FMSB = WID==128 ? 111 :
|
localparam FMSB = WID==128 ? 111 :
|
WID==96 ? 79 :
|
WID==96 ? 79 :
|
WID==80 ? 63 :
|
WID==80 ? 63 :
|
WID==64 ? 51 :
|
WID==64 ? 51 :
|
WID==52 ? 39 :
|
WID==52 ? 39 :
|
WID==48 ? 35 :
|
WID==48 ? 34 :
|
WID==44 ? 31 :
|
WID==44 ? 31 :
|
WID==42 ? 29 :
|
WID==42 ? 29 :
|
WID==40 ? 28 :
|
WID==40 ? 28 :
|
WID==32 ? 22 :
|
WID==32 ? 22 :
|
WID==24 ? 15 : 9;
|
WID==24 ? 15 : 9;
|
Line 208... |
Line 208... |
wire [FMSB+3:0] oaa = a_gt_b1 ? oa : ob;
|
wire [FMSB+3:0] oaa = a_gt_b1 ? oa : ob;
|
wire [FMSB+3:0] obb = a_gt_b1 ? ob : oa;
|
wire [FMSB+3:0] obb = a_gt_b1 ? ob : oa;
|
wire [FMSB+4:0] mab = realOp1 ? oaa - obb : oaa + obb;
|
wire [FMSB+4:0] mab = realOp1 ? oaa - obb : oaa + obb;
|
|
|
always @*
|
always @*
|
casex({aInf1&bInf1,aNan1,bNan1})
|
casez({aInf1&bInf1,aNan1,bNan1})
|
3'b1xx: mo1 = {1'b0,op1,{FMSB-1{1'b0}},op1,{FMSB{1'b0}}}; // inf +/- inf - generate QNaN on subtract, inf on add
|
3'b1??: mo1 = {1'b0,op1,{FMSB-1{1'b0}},op1,{FMSB{1'b0}}}; // inf +/- inf - generate QNaN on subtract, inf on add
|
3'bx1x: mo1 = {1'b0,fracta1[FMSB+1:0],{FMSB{1'b0}}};
|
3'b01?: mo1 = {1'b0,fracta1[FMSB+1:0],{FMSB{1'b0}}};
|
3'bxx1: mo1 = {1'b0,fractb1[FMSB+1:0],{FMSB{1'b0}}};
|
3'b001: mo1 = {1'b0,fractb1[FMSB+1:0],{FMSB{1'b0}}};
|
default: mo1 = {mab,{FMSB-1{1'b0}}}; // mab has an extra lead bit and two trailing bits
|
default: mo1 = {mab,{FMSB-1{1'b0}}}; // mab has an extra lead bit and two trailing bits
|
endcase
|
endcase
|
|
|
delay1 #(FX+1) d3(.clk(clk), .ce(ce), .i(mo1), .o(mo) );
|
delay1 #(FX+1) d3(.clk(clk), .ce(ce), .i(mo1), .o(mo) );
|
|
|
endmodule
|
endmodule
|
|
|
|
module fpAddsubnr(clk, ce, rm, op, a, b, o);
|
|
parameter WID = 128;
|
|
localparam MSB = WID-1;
|
|
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;
|
|
|
|
localparam FX = (FMSB+2)*2-1; // the MSB of the expanded fraction
|
|
localparam EX = FX + 1 + EMSB + 1 + 1 - 1;
|
|
|
|
input clk; // system clock
|
|
input ce; // core clock enable
|
|
input [2:0] rm; // rounding mode
|
|
input op; // operation 0 = add, 1 = subtract
|
|
input [MSB:0] a; // operand a
|
|
input [MSB:0] b; // operand b
|
|
output [MSB:0] o; // output
|
|
|
|
wire [EX:0] o1;
|
|
wire [MSB+3:0] fpn0;
|
|
|
|
fpAddsub #(WID) u1 (clk, ce, rm, op, a, b, o1);
|
|
fpNormalize #(WID) u2(.clk(clk), .ce(ce), .under(1'b0), .i(o1), .o(fpn0) );
|
|
fpRoundReg #(WID) u3(.clk(clk), .ce(ce), .rm(rm), .i(fpn0), .o(o) );
|
|
|
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|