Line 1... |
Line 1... |
// ============================================================================
|
// ============================================================================
|
// __
|
// __
|
// \\__/ o\ (C) 2013,2015 Robert Finch, Stratford
|
// \\__/ o\ (C) 2013-2016 Robert Finch, Stratford
|
// \ __ / All rights reserved.
|
// \ __ / All rights reserved.
|
// \/_// robfinch<remove>@finitron.ca
|
// \/_// robfinch<remove>@finitron.ca
|
// ||
|
// ||
|
//
|
//
|
// This source file is free software: you can redistribute it and/or modify
|
// This source file is free software: you can redistribute it and/or modify
|
Line 176... |
Line 176... |
wire faz = alu_argA[DBW-2:0]==63'd0;
|
wire faz = alu_argA[DBW-2:0]==63'd0;
|
wire fbz = alu_argB[DBW-2:0]==63'd0;
|
wire fbz = alu_argB[DBW-2:0]==63'd0;
|
wire feq = (faz & fbz) || (alu_argA==alu_argB); // special test for zero
|
wire feq = (faz & fbz) || (alu_argA==alu_argB); // special test for zero
|
wire fgt1 = alu_argA[DBW-2:0] > alu_argB[DBW-2:0];
|
wire fgt1 = alu_argA[DBW-2:0] > alu_argB[DBW-2:0];
|
wire flt1 = alu_argA[DBW-2:0] < alu_argB[DBW-2:0];
|
wire flt1 = alu_argA[DBW-2:0] < alu_argB[DBW-2:0];
|
wire flt = alu_argA[DBW] ^ alu_argB[DBW] ? alu_argA[DBW] & !(faz & fbz): alu_argA[DBW] ? fgt1 : flt1;
|
wire flt = alu_argA[DBW-1] ^ alu_argB[DBW-1] ? alu_argA[DBW-1] & !(faz & fbz): alu_argA[DBW-1] ? fgt1 : flt1;
|
wire nanA = DBW==32 ? alu_argA[30:23]==8'hFF && (alu_argA[22:0]!=23'd0) : alu_argA[62:52]==11'h7FF && (alu_argA[51:0]!=52'd0);
|
wire nanA = DBW==32 ? alu_argA[30:23]==8'hFF && (alu_argA[22:0]!=23'd0) : alu_argA[62:52]==11'h7FF && (alu_argA[51:0]!=52'd0);
|
wire nanB = DBW==32 ? alu_argB[30:23]==8'hFF && (alu_argB[22:0]!=23'd0) : alu_argB[62:52]==11'h7FF && (alu_argB[51:0]!=52'd0);
|
wire nanB = DBW==32 ? alu_argB[30:23]==8'hFF && (alu_argB[22:0]!=23'd0) : alu_argB[62:52]==11'h7FF && (alu_argB[51:0]!=52'd0);
|
|
|
wire fsaz = alu_argA[30:0]==31'd0;
|
wire fsaz = alu_argA[30:0]==31'd0;
|
wire fsbz = alu_argB[30:0]==31'd0;
|
wire fsbz = alu_argB[30:0]==31'd0;
|
Line 206... |
Line 206... |
`MIN: o <= BIG ? (alu_argA < alu_argB ? alu_argA : alu_argB) : 64'hDEADDEADDEADDEAD;
|
`MIN: o <= BIG ? (alu_argA < alu_argB ? alu_argA : alu_argB) : 64'hDEADDEADDEADDEAD;
|
`MAX: o <= BIG ? (alu_argA < alu_argB ? alu_argB : alu_argA) : 64'hDEADDEADDEADDEAD;
|
`MAX: o <= BIG ? (alu_argA < alu_argB ? alu_argB : alu_argA) : 64'hDEADDEADDEADDEAD;
|
`MUL,`MULU: o <= BIG ? alu_prod[63:0] : 64'hDEADDEADDEADDEAD;
|
`MUL,`MULU: o <= BIG ? alu_prod[63:0] : 64'hDEADDEADDEADDEAD;
|
`DIV,`DIVU: o <= BIG ? alu_divq : 64'hDEADDEADDEADDEAD;
|
`DIV,`DIVU: o <= BIG ? alu_divq : 64'hDEADDEADDEADDEAD;
|
`MOD,`MODU: o <= BIG ? alu_rem : 64'hDEADDEADDEADDEAD;
|
`MOD,`MODU: o <= BIG ? alu_rem : 64'hDEADDEADDEADDEAD;
|
|
`CHK: o <= ($signed(alu_argC) >= $signed(alu_argA)) && ($signed(alu_argC) < $signed(alu_argB));
|
default: o <= 64'hDEADDEADDEADDEAD;
|
default: o <= 64'hDEADDEADDEADDEAD;
|
endcase
|
endcase
|
`MULI,`MULUI: o <= BIG ? alu_prod[63:0] : 64'hDEADDEADDEADDEAD;
|
`MULI,`MULUI: o <= BIG ? alu_prod[63:0] : 64'hDEADDEADDEADDEAD;
|
`DIVI,`DIVUI: o <= BIG ? alu_divq : 64'hDEADDEADDEADDEAD;
|
`DIVI,`DIVUI: o <= BIG ? alu_divq : 64'hDEADDEADDEADDEAD;
|
`MODI,`MODUI: o <= BIG ? alu_rem : 64'hDEADDEADDEADDEAD;
|
`MODI,`MODUI: o <= BIG ? alu_rem : 64'hDEADDEADDEADDEAD;
|
Line 220... |
Line 221... |
`R:
|
`R:
|
case(alu_fn[3:0])
|
case(alu_fn[3:0])
|
`MOV: o <= alu_argA;
|
`MOV: o <= alu_argA;
|
`NEG: o <= -alu_argA;
|
`NEG: o <= -alu_argA;
|
`NOT: o <= |alu_argA ? 64'd0 : 64'd1;
|
`NOT: o <= |alu_argA ? 64'd0 : 64'd1;
|
`ABS: o <= BIG ? (alu_argA[DBW] ? -alu_argA : alu_argA) : 64'hDEADDEADDEADDEAD;
|
`ABS: o <= BIG ? (alu_argA[DBW-1] ? -alu_argA : alu_argA) : 64'hDEADDEADDEADDEAD;
|
`SGN: o <= BIG ? (alu_argA[DBW] ? 64'hFFFFFFFFFFFFFFFF : alu_argA==64'd0 ? 64'd0 : 64'd1) : 64'hDEADDEADDEADDEAD;
|
`SGN: o <= BIG ? (alu_argA[DBW-1] ? 64'hFFFFFFFFFFFFFFFF : alu_argA==64'd0 ? 64'd0 : 64'd1) : 64'hDEADDEADDEADDEAD;
|
`CNTLZ: o <= BIG ? cntlzo : 64'hDEADDEADDEADDEAD;
|
`CNTLZ: o <= BIG ? cntlzo : 64'hDEADDEADDEADDEAD;
|
`CNTLO: o <= BIG ? cntloo : 64'hDEADDEADDEADDEAD;
|
`CNTLO: o <= BIG ? cntloo : 64'hDEADDEADDEADDEAD;
|
`CNTPOP: o <= BIG ? cntpopo : 64'hDEADDEADDEADDEAD;
|
`CNTPOP: o <= BIG ? cntpopo : 64'hDEADDEADDEADDEAD;
|
`ZXB: o <= BIG ? {56'd0,alu_argA[7:0]} : 64'hDEADDEADDEADDEAD;
|
`ZXB: o <= BIG ? {56'd0,alu_argA[7:0]} : 64'hDEADDEADDEADDEAD;
|
`ZXC: o <= BIG ? {48'd0,alu_argA[15:0]} : 64'hDEADDEADDEADDEAD;
|
`ZXC: o <= BIG ? {48'd0,alu_argA[15:0]} : 64'hDEADDEADDEADDEAD;
|
Line 286... |
Line 287... |
end
|
end
|
else
|
else
|
o <= 64'hDEADDEADDEADDEAD;
|
o <= 64'hDEADDEADDEADDEAD;
|
*/
|
*/
|
|
|
`ADDI,`ADDUI,`ADDUIS,`LEA:
|
`ADDI,`ADDUI,`ADDUIS:
|
o <= alu_argA + alu_argI;
|
o <= alu_argA + alu_argI;
|
`SUBI,`SUBUI:
|
`SUBI,`SUBUI:
|
o <= alu_argA - alu_argI;
|
o <= alu_argA - alu_argI;
|
`ANDI: o <= alu_argA & alu_argI;
|
`ANDI: o <= alu_argA & alu_argI;
|
`ORI: o <= alu_argA | alu_argI;
|
`ORI: o <= alu_argA | alu_argI;
|
Line 435... |
Line 436... |
`SHIFT: o <= BIG ? shfto : 64'hDEADDEADDEADDEAD;
|
`SHIFT: o <= BIG ? shfto : 64'hDEADDEADDEADDEAD;
|
`ifdef BITFIELDOPS
|
`ifdef BITFIELDOPS
|
`BITFIELD: o <= BIG ? bf_out : 64'hDEADDEADDEADDEAD;
|
`BITFIELD: o <= BIG ? bf_out : 64'hDEADDEADDEADDEAD;
|
`endif
|
`endif
|
`LOOP: o <= alu_argA > 0 ? alu_argA - 64'd1 : alu_argA;
|
`LOOP: o <= alu_argA > 0 ? alu_argA - 64'd1 : alu_argA;
|
|
`CHKI: o <= ($signed(alu_argB) >= $signed(alu_argA)) && ($signed(alu_argB) < $signed(alu_argI));
|
default: o <= 64'hDEADDEADDEADDEAD;
|
default: o <= 64'hDEADDEADDEADDEAD;
|
endcase
|
endcase
|
end
|
end
|
|
|
// Generate done signal
|
// Generate done signal
|