726 lines
38 KiB
Systemverilog
726 lines
38 KiB
Systemverilog
// Generated by CIRCT firtool-1.151.0
|
|
|
|
// Users can define 'PRINTF_COND' to add an extra gate to prints.
|
|
`ifndef PRINTF_COND_
|
|
`ifdef PRINTF_COND
|
|
`define PRINTF_COND_ (`PRINTF_COND)
|
|
`else // PRINTF_COND
|
|
`define PRINTF_COND_ 1
|
|
`endif // PRINTF_COND
|
|
`endif // not def PRINTF_COND_
|
|
module FPU(
|
|
input clock,
|
|
reset,
|
|
input [31:0] io_inst,
|
|
input [63:0] io_fromint_data,
|
|
input [2:0] io_fcsr_rm,
|
|
output io_fcsr_flags_valid,
|
|
output [4:0] io_fcsr_flags_bits,
|
|
output [63:0] io_store_data,
|
|
io_toint_data,
|
|
input io_ll_resp_val,
|
|
input [2:0] io_ll_resp_type,
|
|
input [4:0] io_ll_resp_tag,
|
|
input [63:0] io_ll_resp_data,
|
|
input io_valid,
|
|
output io_fcsr_rdy,
|
|
io_nack_mem,
|
|
io_illegal_rm,
|
|
input io_killx,
|
|
io_killm,
|
|
output io_dec_wen,
|
|
io_dec_ren1,
|
|
io_dec_ren2,
|
|
io_dec_ren3,
|
|
io_sboard_set,
|
|
io_sboard_clr,
|
|
output [4:0] io_sboard_clra
|
|
);
|
|
|
|
wire divSqrt_inFlight;
|
|
wire [4:0] divSqrt_flags;
|
|
wire [64:0] divSqrt_wdata;
|
|
wire divSqrt_wen;
|
|
wire divSqrt_typeTag;
|
|
wire _divSqrt_1_io_inReady;
|
|
wire _divSqrt_1_io_outValid_div;
|
|
wire _divSqrt_1_io_outValid_sqrt;
|
|
wire [64:0] _divSqrt_1_io_out;
|
|
wire [4:0] _divSqrt_1_io_exceptionFlags;
|
|
wire _divSqrt_io_inReady;
|
|
wire _divSqrt_io_outValid_div;
|
|
wire _divSqrt_io_outValid_sqrt;
|
|
wire [32:0] _divSqrt_io_out;
|
|
wire [4:0] _divSqrt_io_exceptionFlags;
|
|
wire [64:0] _dfma_io_out_bits_data;
|
|
wire [4:0] _dfma_io_out_bits_exc;
|
|
wire [64:0] _fpmu_io_out_bits_data;
|
|
wire [4:0] _fpmu_io_out_bits_exc;
|
|
wire [64:0] _ifpu_io_out_bits_data;
|
|
wire [4:0] _ifpu_io_out_bits_exc;
|
|
wire [2:0] _fpiu_io_out_bits_in_rm;
|
|
wire [64:0] _fpiu_io_out_bits_in_in1;
|
|
wire [64:0] _fpiu_io_out_bits_in_in2;
|
|
wire _fpiu_io_out_bits_lt;
|
|
wire [4:0] _fpiu_io_out_bits_exc;
|
|
wire [64:0] _sfma_io_out_bits_data;
|
|
wire [4:0] _sfma_io_out_bits_exc;
|
|
wire [64:0] _regfile_ext_R0_data;
|
|
wire [64:0] _regfile_ext_R1_data;
|
|
wire [64:0] _regfile_ext_R2_data;
|
|
wire _fp_decoder_io_sigs_ren1;
|
|
wire _fp_decoder_io_sigs_ren2;
|
|
wire _fp_decoder_io_sigs_ren3;
|
|
wire _fp_decoder_io_sigs_swap12;
|
|
wire _fp_decoder_io_sigs_swap23;
|
|
wire [1:0] _fp_decoder_io_sigs_typeTagIn;
|
|
wire [1:0] _fp_decoder_io_sigs_typeTagOut;
|
|
wire _fp_decoder_io_sigs_fromint;
|
|
wire _fp_decoder_io_sigs_toint;
|
|
wire _fp_decoder_io_sigs_fastpipe;
|
|
wire _fp_decoder_io_sigs_fma;
|
|
wire _fp_decoder_io_sigs_div;
|
|
wire _fp_decoder_io_sigs_sqrt;
|
|
wire _fp_decoder_io_sigs_wflags;
|
|
reg ex_reg_valid;
|
|
reg [31:0] ex_reg_inst;
|
|
reg ex_reg_ctrl_ren2;
|
|
reg ex_reg_ctrl_ren3;
|
|
reg ex_reg_ctrl_swap23;
|
|
reg [1:0] ex_reg_ctrl_typeTagIn;
|
|
reg [1:0] ex_reg_ctrl_typeTagOut;
|
|
reg ex_reg_ctrl_fromint;
|
|
reg ex_reg_ctrl_toint;
|
|
reg ex_reg_ctrl_fastpipe;
|
|
reg ex_reg_ctrl_fma;
|
|
reg ex_reg_ctrl_div;
|
|
reg ex_reg_ctrl_sqrt;
|
|
reg ex_reg_ctrl_wflags;
|
|
reg [4:0] ex_ra_0;
|
|
reg [4:0] ex_ra_1;
|
|
reg [4:0] ex_ra_2;
|
|
reg load_wb;
|
|
reg [1:0] load_wb_typeTag;
|
|
reg [63:0] load_wb_data;
|
|
reg [4:0] load_wb_tag;
|
|
reg mem_reg_valid;
|
|
reg [31:0] mem_reg_inst;
|
|
reg wb_reg_valid;
|
|
reg [1:0] mem_ctrl_typeTagOut;
|
|
reg mem_ctrl_fromint;
|
|
reg mem_ctrl_toint;
|
|
reg mem_ctrl_fastpipe;
|
|
reg mem_ctrl_fma;
|
|
reg mem_ctrl_div;
|
|
reg mem_ctrl_sqrt;
|
|
reg mem_ctrl_wflags;
|
|
reg wb_ctrl_toint;
|
|
wire [63:0] _wdata_T_2 =
|
|
(load_wb_typeTag[0] ? 64'h0 : 64'hFFFFFFFF00000000) | load_wb_data;
|
|
wire wdata_rawIn_isZeroExpIn = _wdata_T_2[62:52] == 11'h0;
|
|
wire _wdata_rawIn_out_isNaN_T = |(_wdata_T_2[51:0]);
|
|
wire [5:0] wdata_rawIn_normDist =
|
|
_wdata_T_2[51]
|
|
? 6'h0
|
|
: _wdata_T_2[50]
|
|
? 6'h1
|
|
: _wdata_T_2[49]
|
|
? 6'h2
|
|
: _wdata_T_2[48]
|
|
? 6'h3
|
|
: _wdata_T_2[47]
|
|
? 6'h4
|
|
: _wdata_T_2[46]
|
|
? 6'h5
|
|
: _wdata_T_2[45]
|
|
? 6'h6
|
|
: _wdata_T_2[44]
|
|
? 6'h7
|
|
: _wdata_T_2[43]
|
|
? 6'h8
|
|
: _wdata_T_2[42]
|
|
? 6'h9
|
|
: _wdata_T_2[41]
|
|
? 6'hA
|
|
: _wdata_T_2[40]
|
|
? 6'hB
|
|
: _wdata_T_2[39]
|
|
? 6'hC
|
|
: _wdata_T_2[38]
|
|
? 6'hD
|
|
: _wdata_T_2[37]
|
|
? 6'hE
|
|
: _wdata_T_2[36]
|
|
? 6'hF
|
|
: _wdata_T_2[35]
|
|
? 6'h10
|
|
: _wdata_T_2[34]
|
|
? 6'h11
|
|
: _wdata_T_2[33]
|
|
? 6'h12
|
|
: _wdata_T_2[32]
|
|
? 6'h13
|
|
: _wdata_T_2[31]
|
|
? 6'h14
|
|
: _wdata_T_2[30]
|
|
? 6'h15
|
|
: _wdata_T_2[29]
|
|
? 6'h16
|
|
: _wdata_T_2[28]
|
|
? 6'h17
|
|
: _wdata_T_2[27]
|
|
? 6'h18
|
|
: _wdata_T_2[26]
|
|
? 6'h19
|
|
: _wdata_T_2[25]
|
|
? 6'h1A
|
|
: _wdata_T_2[24]
|
|
? 6'h1B
|
|
: _wdata_T_2[23]
|
|
? 6'h1C
|
|
: _wdata_T_2[22]
|
|
? 6'h1D
|
|
: _wdata_T_2[21]
|
|
? 6'h1E
|
|
: _wdata_T_2[20]
|
|
? 6'h1F
|
|
: _wdata_T_2[19]
|
|
? 6'h20
|
|
: _wdata_T_2[18]
|
|
? 6'h21
|
|
: _wdata_T_2[17]
|
|
? 6'h22
|
|
: _wdata_T_2[16]
|
|
? 6'h23
|
|
: _wdata_T_2[15]
|
|
? 6'h24
|
|
: _wdata_T_2[14]
|
|
? 6'h25
|
|
: _wdata_T_2[13]
|
|
? 6'h26
|
|
: _wdata_T_2[12]
|
|
? 6'h27
|
|
: _wdata_T_2[11]
|
|
? 6'h28
|
|
: _wdata_T_2[10]
|
|
? 6'h29
|
|
: _wdata_T_2[9]
|
|
? 6'h2A
|
|
: _wdata_T_2[8]
|
|
? 6'h2B
|
|
: _wdata_T_2[7]
|
|
? 6'h2C
|
|
: _wdata_T_2[6]
|
|
? 6'h2D
|
|
: _wdata_T_2[5]
|
|
? 6'h2E
|
|
: _wdata_T_2[4]
|
|
? 6'h2F
|
|
: _wdata_T_2[3]
|
|
? 6'h30
|
|
: _wdata_T_2[2]
|
|
? 6'h31
|
|
: {5'h19,
|
|
~(_wdata_T_2[1])};
|
|
wire [114:0] _wdata_rawIn_subnormFract_T =
|
|
{63'h0, _wdata_T_2[51:0]} << wdata_rawIn_normDist;
|
|
wire [11:0] _wdata_rawIn_adjustedExp_T_4 =
|
|
(wdata_rawIn_isZeroExpIn ? {6'h3F, ~wdata_rawIn_normDist} : {1'h0, _wdata_T_2[62:52]})
|
|
+ {10'h100, wdata_rawIn_isZeroExpIn ? 2'h2 : 2'h1};
|
|
wire [51:0] _wdata_T_10 =
|
|
wdata_rawIn_isZeroExpIn
|
|
? {_wdata_rawIn_subnormFract_T[50:0], 1'h0}
|
|
: _wdata_T_2[51:0];
|
|
wire [2:0] _wdata_T_4 =
|
|
wdata_rawIn_isZeroExpIn & ~_wdata_rawIn_out_isNaN_T
|
|
? 3'h0
|
|
: _wdata_rawIn_adjustedExp_T_4[11:9];
|
|
wire _GEN =
|
|
_wdata_T_4[0] | (&(_wdata_rawIn_adjustedExp_T_4[11:10])) & _wdata_rawIn_out_isNaN_T;
|
|
wire wdata_rawIn_isZeroExpIn_1 = _wdata_T_2[30:23] == 8'h0;
|
|
wire _wdata_rawIn_out_isNaN_T_2 = |(_wdata_T_2[22:0]);
|
|
wire [4:0] wdata_rawIn_normDist_1 =
|
|
_wdata_T_2[22]
|
|
? 5'h0
|
|
: _wdata_T_2[21]
|
|
? 5'h1
|
|
: _wdata_T_2[20]
|
|
? 5'h2
|
|
: _wdata_T_2[19]
|
|
? 5'h3
|
|
: _wdata_T_2[18]
|
|
? 5'h4
|
|
: _wdata_T_2[17]
|
|
? 5'h5
|
|
: _wdata_T_2[16]
|
|
? 5'h6
|
|
: _wdata_T_2[15]
|
|
? 5'h7
|
|
: _wdata_T_2[14]
|
|
? 5'h8
|
|
: _wdata_T_2[13]
|
|
? 5'h9
|
|
: _wdata_T_2[12]
|
|
? 5'hA
|
|
: _wdata_T_2[11]
|
|
? 5'hB
|
|
: _wdata_T_2[10]
|
|
? 5'hC
|
|
: _wdata_T_2[9]
|
|
? 5'hD
|
|
: _wdata_T_2[8]
|
|
? 5'hE
|
|
: _wdata_T_2[7]
|
|
? 5'hF
|
|
: _wdata_T_2[6]
|
|
? 5'h10
|
|
: _wdata_T_2[5]
|
|
? 5'h11
|
|
: _wdata_T_2[4]
|
|
? 5'h12
|
|
: _wdata_T_2[3]
|
|
? 5'h13
|
|
: _wdata_T_2[2]
|
|
? 5'h14
|
|
: _wdata_T_2[1]
|
|
? 5'h15
|
|
: 5'h16;
|
|
wire [53:0] _wdata_rawIn_subnormFract_T_2 =
|
|
{31'h0, _wdata_T_2[22:0]} << wdata_rawIn_normDist_1;
|
|
wire [8:0] _wdata_rawIn_adjustedExp_T_9 =
|
|
(wdata_rawIn_isZeroExpIn_1
|
|
? {4'hF, ~wdata_rawIn_normDist_1}
|
|
: {1'h0, _wdata_T_2[30:23]}) + {7'h20, wdata_rawIn_isZeroExpIn_1 ? 2'h2 : 2'h1};
|
|
wire [2:0] _wdata_T_13 =
|
|
wdata_rawIn_isZeroExpIn_1 & ~_wdata_rawIn_out_isNaN_T_2
|
|
? 3'h0
|
|
: _wdata_rawIn_adjustedExp_T_9[8:6];
|
|
wire [60:0] _GEN_0 =
|
|
(&{_wdata_T_4[2:1], _GEN})
|
|
? {&(_wdata_T_10[51:32]),
|
|
_wdata_rawIn_adjustedExp_T_4[7:1],
|
|
_wdata_T_13[2],
|
|
_wdata_T_10[51:32],
|
|
_wdata_T_2[31],
|
|
_wdata_T_13[1],
|
|
_wdata_T_13[0] | (&(_wdata_rawIn_adjustedExp_T_9[8:7]))
|
|
& _wdata_rawIn_out_isNaN_T_2,
|
|
_wdata_rawIn_adjustedExp_T_9[5:0],
|
|
wdata_rawIn_isZeroExpIn_1
|
|
? {_wdata_rawIn_subnormFract_T_2[21:0], 1'h0}
|
|
: _wdata_T_2[22:0]}
|
|
: {_wdata_rawIn_adjustedExp_T_4[8:0], _wdata_T_10};
|
|
wire curOK =
|
|
{_wdata_T_4[2:1], _GEN} != 3'h7 | _GEN_0[60] == (&(_GEN_0[51:32]));
|
|
wire _GEN_1 = load_wb & ~reset;
|
|
wire [2:0] ex_rm = (&(ex_reg_inst[14:12])) ? io_fcsr_rm : ex_reg_inst[14:12];
|
|
wire _dfma_io_in_valid_T = ex_reg_valid & ex_reg_ctrl_fma;
|
|
wire _write_port_busy_T_16 = ex_reg_ctrl_typeTagOut == 2'h0;
|
|
wire [2:0] fpiu_io_in_bits_req_in1_prev_prev_expOut_expCode =
|
|
{_regfile_ext_R2_data[52], _regfile_ext_R2_data[30:29]};
|
|
wire [11:0] _fpiu_io_in_bits_req_in1_prev_prev_expOut_commonCase_T_2 =
|
|
{3'h0, _regfile_ext_R2_data[52], _regfile_ext_R2_data[30:23]} + 12'h700;
|
|
wire [64:0] fpmu_io_in_bits_in1 =
|
|
ex_reg_ctrl_typeTagIn[0] | (&(_regfile_ext_R2_data[64:60]))
|
|
? (ex_reg_ctrl_typeTagIn[0]
|
|
? _regfile_ext_R2_data
|
|
: {_regfile_ext_R2_data[31],
|
|
fpiu_io_in_bits_req_in1_prev_prev_expOut_expCode == 3'h0
|
|
| fpiu_io_in_bits_req_in1_prev_prev_expOut_expCode > 3'h5
|
|
? {_regfile_ext_R2_data[52],
|
|
_regfile_ext_R2_data[30:29],
|
|
_fpiu_io_in_bits_req_in1_prev_prev_expOut_commonCase_T_2[8:0]}
|
|
: _fpiu_io_in_bits_req_in1_prev_prev_expOut_commonCase_T_2,
|
|
_regfile_ext_R2_data[22:0],
|
|
29'h0})
|
|
: 65'hE008000000000000;
|
|
wire [2:0] fpiu_io_in_bits_req_in2_prev_prev_expOut_expCode =
|
|
{_regfile_ext_R1_data[52], _regfile_ext_R1_data[30:29]};
|
|
wire [11:0] _fpiu_io_in_bits_req_in2_prev_prev_expOut_commonCase_T_2 =
|
|
{3'h0, _regfile_ext_R1_data[52], _regfile_ext_R1_data[30:23]} + 12'h700;
|
|
wire [64:0] fpmu_io_in_bits_in2 =
|
|
ex_reg_ctrl_typeTagIn[0] | (&(_regfile_ext_R1_data[64:60]))
|
|
? (ex_reg_ctrl_typeTagIn[0]
|
|
? _regfile_ext_R1_data
|
|
: {_regfile_ext_R1_data[31],
|
|
fpiu_io_in_bits_req_in2_prev_prev_expOut_expCode == 3'h0
|
|
| fpiu_io_in_bits_req_in2_prev_prev_expOut_expCode > 3'h5
|
|
? {_regfile_ext_R1_data[52],
|
|
_regfile_ext_R1_data[30:29],
|
|
_fpiu_io_in_bits_req_in2_prev_prev_expOut_commonCase_T_2[8:0]}
|
|
: _fpiu_io_in_bits_req_in2_prev_prev_expOut_commonCase_T_2,
|
|
_regfile_ext_R1_data[22:0],
|
|
29'h0})
|
|
: 65'hE008000000000000;
|
|
reg [4:0] divSqrt_waddr;
|
|
wire _divSqrt_io_inValid_T = mem_ctrl_typeTagOut == 2'h0;
|
|
wire _divSqrt_io_inValid_T_2 = mem_ctrl_typeTagOut == 2'h1;
|
|
reg [2:0] wen;
|
|
reg [4:0] wbInfo_0_rd;
|
|
reg wbInfo_0_typeTag;
|
|
reg [1:0] wbInfo_0_pipeid;
|
|
reg [4:0] wbInfo_1_rd;
|
|
reg wbInfo_1_typeTag;
|
|
reg [1:0] wbInfo_1_pipeid;
|
|
reg [4:0] wbInfo_2_rd;
|
|
reg wbInfo_2_typeTag;
|
|
reg [1:0] wbInfo_2_pipeid;
|
|
reg write_port_busy;
|
|
wire [4:0] waddr = divSqrt_wen ? divSqrt_waddr : wbInfo_0_rd;
|
|
wire [3:0][64:0] _GEN_2 =
|
|
{{_dfma_io_out_bits_data},
|
|
{_sfma_io_out_bits_data},
|
|
{_ifpu_io_out_bits_data},
|
|
{_fpmu_io_out_bits_data}};
|
|
wire [64:0] _wdata_T_29 = divSqrt_wen ? divSqrt_wdata : _GEN_2[wbInfo_0_pipeid];
|
|
wire [64:0] wdata_1 =
|
|
(divSqrt_wen ? divSqrt_typeTag : wbInfo_0_typeTag)
|
|
? _wdata_T_29
|
|
: {12'hFFF, _wdata_T_29[31], 20'hFFFFF, _wdata_T_29[32], _wdata_T_29[30:0]};
|
|
wire [3:0][4:0] _GEN_3 =
|
|
{{_dfma_io_out_bits_exc},
|
|
{_sfma_io_out_bits_exc},
|
|
{_ifpu_io_out_bits_exc},
|
|
{_fpmu_io_out_bits_exc}};
|
|
wire frfWriteBundle_1_wrenf = wen[0] | divSqrt_wen;
|
|
wire curOK_1 = wdata_1[63:61] != 3'h7 | wdata_1[60] == (&(wdata_1[51:32]));
|
|
wire _GEN_4 = frfWriteBundle_1_wrenf & ~reset;
|
|
`ifndef SYNTHESIS
|
|
always @(posedge clock) begin
|
|
if ((`PRINTF_COND_) & _GEN_1 & ~curOK)
|
|
$fwrite(32'h80000002,
|
|
"Assertion failed\n at FPU.scala:823 assert(consistent(wdata))\n");
|
|
if ((`PRINTF_COND_) & _GEN_4 & ~curOK_1)
|
|
$fwrite(32'h80000002,
|
|
"Assertion failed\n at FPU.scala:970 assert(consistent(wdata))\n");
|
|
end // always @(posedge)
|
|
`endif // not def SYNTHESIS
|
|
wire wb_toint_valid = wb_reg_valid & wb_ctrl_toint;
|
|
reg [4:0] wb_toint_exc;
|
|
wire _divSqrt_inValid_T = mem_ctrl_div | mem_ctrl_sqrt;
|
|
wire io_nack_mem_0 =
|
|
write_port_busy | _divSqrt_inValid_T & (|wen) | divSqrt_inFlight;
|
|
reg io_sboard_set_REG;
|
|
wire divSqrt_inValid =
|
|
mem_reg_valid & _divSqrt_inValid_T & ~divSqrt_inFlight;
|
|
reg divSqrt_killed;
|
|
wire [8:0] _divSqrt_io_a_expOut_commonCase_T =
|
|
_fpiu_io_out_bits_in_in1[60:52] - 9'h100;
|
|
wire [8:0] _divSqrt_io_b_expOut_commonCase_T =
|
|
_fpiu_io_out_bits_in_in2[60:52] - 9'h100;
|
|
assign divSqrt_typeTag = _divSqrt_1_io_outValid_div | _divSqrt_1_io_outValid_sqrt;
|
|
assign divSqrt_wen =
|
|
divSqrt_typeTag
|
|
? ~divSqrt_killed
|
|
: (_divSqrt_io_outValid_div | _divSqrt_io_outValid_sqrt) & ~divSqrt_killed;
|
|
assign divSqrt_wdata =
|
|
divSqrt_typeTag
|
|
? ({65{_divSqrt_1_io_out[63:61] != 3'h7}} | 65'h1EFEFFFFFFFFFFFFF)
|
|
& _divSqrt_1_io_out
|
|
: {32'h0, _divSqrt_io_out};
|
|
assign divSqrt_flags =
|
|
divSqrt_typeTag ? _divSqrt_1_io_exceptionFlags : _divSqrt_io_exceptionFlags;
|
|
assign divSqrt_inFlight =
|
|
~divSqrt_killed & (~_divSqrt_1_io_inReady | ~_divSqrt_io_inReady);
|
|
always @(posedge clock) begin
|
|
automatic logic [2:0] memLatencyMask;
|
|
automatic logic mem_wen;
|
|
automatic logic [1:0] _GEN_5;
|
|
memLatencyMask =
|
|
{1'h0,
|
|
{1'h0, mem_ctrl_fastpipe | mem_ctrl_fromint}
|
|
| {mem_ctrl_fma & _divSqrt_io_inValid_T, 1'h0}}
|
|
| {mem_ctrl_fma & _divSqrt_io_inValid_T_2, 2'h0};
|
|
mem_wen = mem_reg_valid & (mem_ctrl_fma | mem_ctrl_fastpipe | mem_ctrl_fromint);
|
|
_GEN_5 = {1'h0, mem_ctrl_fromint};
|
|
if (reset) begin
|
|
ex_reg_valid <= 1'h0;
|
|
mem_reg_valid <= 1'h0;
|
|
wb_reg_valid <= 1'h0;
|
|
wen <= 3'h0;
|
|
divSqrt_killed <= 1'h1;
|
|
end
|
|
else begin
|
|
automatic logic _killm_T = io_killm | io_nack_mem_0;
|
|
ex_reg_valid <= io_valid;
|
|
mem_reg_valid <= ex_reg_valid & ~(io_killx | mem_reg_valid & _killm_T);
|
|
wb_reg_valid <= mem_reg_valid & ~_killm_T;
|
|
wen <= {3{mem_wen & ~_killm_T}} & memLatencyMask | {1'h0, wen[2:1]};
|
|
divSqrt_killed <= divSqrt_inValid & _killm_T;
|
|
end
|
|
if (io_valid) begin
|
|
ex_reg_inst <= io_inst;
|
|
ex_reg_ctrl_ren2 <= _fp_decoder_io_sigs_ren2;
|
|
ex_reg_ctrl_ren3 <= _fp_decoder_io_sigs_ren3;
|
|
ex_reg_ctrl_swap23 <= _fp_decoder_io_sigs_swap23;
|
|
ex_reg_ctrl_typeTagIn <= _fp_decoder_io_sigs_typeTagIn;
|
|
ex_reg_ctrl_typeTagOut <= _fp_decoder_io_sigs_typeTagOut;
|
|
ex_reg_ctrl_fromint <= _fp_decoder_io_sigs_fromint;
|
|
ex_reg_ctrl_toint <= _fp_decoder_io_sigs_toint;
|
|
ex_reg_ctrl_fastpipe <= _fp_decoder_io_sigs_fastpipe;
|
|
ex_reg_ctrl_fma <= _fp_decoder_io_sigs_fma;
|
|
ex_reg_ctrl_div <= _fp_decoder_io_sigs_div;
|
|
ex_reg_ctrl_sqrt <= _fp_decoder_io_sigs_sqrt;
|
|
ex_reg_ctrl_wflags <= _fp_decoder_io_sigs_wflags;
|
|
if (_fp_decoder_io_sigs_ren2 & _fp_decoder_io_sigs_swap12)
|
|
ex_ra_0 <= io_inst[24:20];
|
|
else if (_fp_decoder_io_sigs_ren1 & ~_fp_decoder_io_sigs_swap12)
|
|
ex_ra_0 <= io_inst[19:15];
|
|
if (_fp_decoder_io_sigs_ren2 & ~_fp_decoder_io_sigs_swap12
|
|
& ~_fp_decoder_io_sigs_swap23)
|
|
ex_ra_1 <= io_inst[24:20];
|
|
else if (_fp_decoder_io_sigs_ren1 & _fp_decoder_io_sigs_swap12)
|
|
ex_ra_1 <= io_inst[19:15];
|
|
if (_fp_decoder_io_sigs_ren3)
|
|
ex_ra_2 <= io_inst[31:27];
|
|
else if (_fp_decoder_io_sigs_ren2 & _fp_decoder_io_sigs_swap23)
|
|
ex_ra_2 <= io_inst[24:20];
|
|
end
|
|
load_wb <= io_ll_resp_val;
|
|
if (io_ll_resp_val) begin
|
|
load_wb_typeTag <= io_ll_resp_type[1:0] - 2'h2;
|
|
load_wb_data <= io_ll_resp_data;
|
|
load_wb_tag <= io_ll_resp_tag;
|
|
end
|
|
if (ex_reg_valid) begin
|
|
mem_reg_inst <= ex_reg_inst;
|
|
mem_ctrl_typeTagOut <= ex_reg_ctrl_typeTagOut;
|
|
mem_ctrl_fromint <= ex_reg_ctrl_fromint;
|
|
mem_ctrl_toint <= ex_reg_ctrl_toint;
|
|
mem_ctrl_fastpipe <= ex_reg_ctrl_fastpipe;
|
|
mem_ctrl_fma <= ex_reg_ctrl_fma;
|
|
mem_ctrl_div <= ex_reg_ctrl_div;
|
|
mem_ctrl_sqrt <= ex_reg_ctrl_sqrt;
|
|
mem_ctrl_wflags <= ex_reg_ctrl_wflags;
|
|
write_port_busy <=
|
|
|{mem_wen
|
|
& (|(({1'h0, {ex_reg_ctrl_fastpipe, 1'h0} | {ex_reg_ctrl_fromint, 1'h0}}
|
|
| {ex_reg_ctrl_fma & _write_port_busy_T_16, 2'h0}) & memLatencyMask)),
|
|
(ex_reg_ctrl_fastpipe | ex_reg_ctrl_fromint) & wen[2]};
|
|
end
|
|
if (mem_reg_valid)
|
|
wb_ctrl_toint <= mem_ctrl_toint;
|
|
if (divSqrt_inValid)
|
|
divSqrt_waddr <= mem_reg_inst[11:7];
|
|
if (mem_wen & ~write_port_busy & memLatencyMask[0]) begin
|
|
wbInfo_0_rd <= mem_reg_inst[11:7];
|
|
wbInfo_0_typeTag <= mem_ctrl_typeTagOut[0];
|
|
wbInfo_0_pipeid <=
|
|
_GEN_5 | {mem_ctrl_fma & _divSqrt_io_inValid_T, 1'h0}
|
|
| {2{mem_ctrl_fma & _divSqrt_io_inValid_T_2}};
|
|
end
|
|
else if (wen[1]) begin
|
|
wbInfo_0_rd <= wbInfo_1_rd;
|
|
wbInfo_0_typeTag <= wbInfo_1_typeTag;
|
|
wbInfo_0_pipeid <= wbInfo_1_pipeid;
|
|
end
|
|
if (mem_wen & ~write_port_busy & memLatencyMask[1]) begin
|
|
wbInfo_1_rd <= mem_reg_inst[11:7];
|
|
wbInfo_1_typeTag <= mem_ctrl_typeTagOut[0];
|
|
wbInfo_1_pipeid <=
|
|
_GEN_5 | {mem_ctrl_fma & _divSqrt_io_inValid_T, 1'h0}
|
|
| {2{mem_ctrl_fma & _divSqrt_io_inValid_T_2}};
|
|
end
|
|
else if (wen[2]) begin
|
|
wbInfo_1_rd <= wbInfo_2_rd;
|
|
wbInfo_1_typeTag <= wbInfo_2_typeTag;
|
|
wbInfo_1_pipeid <= wbInfo_2_pipeid;
|
|
end
|
|
if (mem_wen & ~write_port_busy & memLatencyMask[2]) begin
|
|
wbInfo_2_rd <= mem_reg_inst[11:7];
|
|
wbInfo_2_typeTag <= mem_ctrl_typeTagOut[0];
|
|
wbInfo_2_pipeid <=
|
|
_GEN_5 | {mem_ctrl_fma & _divSqrt_io_inValid_T, 1'h0}
|
|
| {2{mem_ctrl_fma & _divSqrt_io_inValid_T_2}};
|
|
end
|
|
if (mem_ctrl_toint)
|
|
wb_toint_exc <= _fpiu_io_out_bits_exc;
|
|
io_sboard_set_REG <=
|
|
mem_ctrl_fma & _divSqrt_io_inValid_T_2 | mem_ctrl_div | mem_ctrl_sqrt;
|
|
end // always @(posedge)
|
|
FPUDecoder fp_decoder (
|
|
.io_inst (io_inst),
|
|
.io_sigs_wen (io_dec_wen),
|
|
.io_sigs_ren1 (_fp_decoder_io_sigs_ren1),
|
|
.io_sigs_ren2 (_fp_decoder_io_sigs_ren2),
|
|
.io_sigs_ren3 (_fp_decoder_io_sigs_ren3),
|
|
.io_sigs_swap12 (_fp_decoder_io_sigs_swap12),
|
|
.io_sigs_swap23 (_fp_decoder_io_sigs_swap23),
|
|
.io_sigs_typeTagIn (_fp_decoder_io_sigs_typeTagIn),
|
|
.io_sigs_typeTagOut (_fp_decoder_io_sigs_typeTagOut),
|
|
.io_sigs_fromint (_fp_decoder_io_sigs_fromint),
|
|
.io_sigs_toint (_fp_decoder_io_sigs_toint),
|
|
.io_sigs_fastpipe (_fp_decoder_io_sigs_fastpipe),
|
|
.io_sigs_fma (_fp_decoder_io_sigs_fma),
|
|
.io_sigs_div (_fp_decoder_io_sigs_div),
|
|
.io_sigs_sqrt (_fp_decoder_io_sigs_sqrt),
|
|
.io_sigs_wflags (_fp_decoder_io_sigs_wflags)
|
|
);
|
|
regfile_32x65 regfile_ext (
|
|
.R0_addr (ex_ra_2),
|
|
.R0_en (1'h1),
|
|
.R0_clk (clock),
|
|
.R0_data (_regfile_ext_R0_data),
|
|
.R1_addr (ex_ra_1),
|
|
.R1_en (1'h1),
|
|
.R1_clk (clock),
|
|
.R1_data (_regfile_ext_R1_data),
|
|
.R2_addr (ex_ra_0),
|
|
.R2_en (1'h1),
|
|
.R2_clk (clock),
|
|
.R2_data (_regfile_ext_R2_data),
|
|
.W0_addr (waddr),
|
|
.W0_en (frfWriteBundle_1_wrenf),
|
|
.W0_clk (clock),
|
|
.W0_data (wdata_1),
|
|
.W1_addr (load_wb_tag),
|
|
.W1_en (load_wb),
|
|
.W1_clk (clock),
|
|
.W1_data ({_wdata_T_2[63], _wdata_T_4[2:1], _GEN, _GEN_0})
|
|
);
|
|
FPUFMAPipe_l3_f32 sfma (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_in_valid (_dfma_io_in_valid_T & _write_port_busy_T_16),
|
|
.io_in_bits_ren3 (ex_reg_ctrl_ren3),
|
|
.io_in_bits_swap23 (ex_reg_ctrl_swap23),
|
|
.io_in_bits_rm (ex_rm),
|
|
.io_in_bits_fmaCmd
|
|
({ex_reg_inst[3], ex_reg_inst[2] | ~ex_reg_ctrl_ren3 & ex_reg_inst[27]}),
|
|
.io_in_bits_in1
|
|
({32'h0,
|
|
{_regfile_ext_R2_data[31], _regfile_ext_R2_data[52], _regfile_ext_R2_data[30:0]}
|
|
| ((&(_regfile_ext_R2_data[64:60])) ? 33'h0 : 33'hE0400000)}),
|
|
.io_in_bits_in2
|
|
({32'h0,
|
|
{_regfile_ext_R1_data[31], _regfile_ext_R1_data[52], _regfile_ext_R1_data[30:0]}
|
|
| ((&(_regfile_ext_R1_data[64:60])) ? 33'h0 : 33'hE0400000)}),
|
|
.io_in_bits_in3
|
|
({32'h0,
|
|
{_regfile_ext_R0_data[31], _regfile_ext_R0_data[52], _regfile_ext_R0_data[30:0]}
|
|
| ((&(_regfile_ext_R0_data[64:60])) ? 33'h0 : 33'hE0400000)}),
|
|
.io_out_bits_data (_sfma_io_out_bits_data),
|
|
.io_out_bits_exc (_sfma_io_out_bits_exc)
|
|
);
|
|
FPToInt fpiu (
|
|
.clock (clock),
|
|
.io_in_valid
|
|
(ex_reg_valid
|
|
& (ex_reg_ctrl_toint | ex_reg_ctrl_div | ex_reg_ctrl_sqrt | ex_reg_ctrl_fastpipe
|
|
& ex_reg_ctrl_wflags)),
|
|
.io_in_bits_ren2 (ex_reg_ctrl_ren2),
|
|
.io_in_bits_typeTagOut (ex_reg_ctrl_typeTagOut),
|
|
.io_in_bits_wflags (ex_reg_ctrl_wflags),
|
|
.io_in_bits_rm (ex_rm),
|
|
.io_in_bits_typ (ex_reg_inst[21:20]),
|
|
.io_in_bits_fmt (ex_reg_inst[26:25]),
|
|
.io_in_bits_in1 (fpmu_io_in_bits_in1),
|
|
.io_in_bits_in2 (fpmu_io_in_bits_in2),
|
|
.io_out_bits_in_rm (_fpiu_io_out_bits_in_rm),
|
|
.io_out_bits_in_in1 (_fpiu_io_out_bits_in_in1),
|
|
.io_out_bits_in_in2 (_fpiu_io_out_bits_in_in2),
|
|
.io_out_bits_lt (_fpiu_io_out_bits_lt),
|
|
.io_out_bits_store (io_store_data),
|
|
.io_out_bits_toint (io_toint_data),
|
|
.io_out_bits_exc (_fpiu_io_out_bits_exc)
|
|
);
|
|
IntToFP ifpu (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_in_valid (ex_reg_valid & ex_reg_ctrl_fromint),
|
|
.io_in_bits_typeTagIn (ex_reg_ctrl_typeTagIn),
|
|
.io_in_bits_wflags (ex_reg_ctrl_wflags),
|
|
.io_in_bits_rm (ex_rm),
|
|
.io_in_bits_typ (ex_reg_inst[21:20]),
|
|
.io_in_bits_in1 (io_fromint_data),
|
|
.io_out_bits_data (_ifpu_io_out_bits_data),
|
|
.io_out_bits_exc (_ifpu_io_out_bits_exc)
|
|
);
|
|
FPToFP fpmu (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_in_valid (ex_reg_valid & ex_reg_ctrl_fastpipe),
|
|
.io_in_bits_ren2 (ex_reg_ctrl_ren2),
|
|
.io_in_bits_typeTagOut (ex_reg_ctrl_typeTagOut),
|
|
.io_in_bits_wflags (ex_reg_ctrl_wflags),
|
|
.io_in_bits_rm (ex_rm),
|
|
.io_in_bits_in1 (fpmu_io_in_bits_in1),
|
|
.io_in_bits_in2 (fpmu_io_in_bits_in2),
|
|
.io_out_bits_data (_fpmu_io_out_bits_data),
|
|
.io_out_bits_exc (_fpmu_io_out_bits_exc),
|
|
.io_lt (_fpiu_io_out_bits_lt)
|
|
);
|
|
FPUFMAPipe_l4_f64 dfma (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_in_valid (_dfma_io_in_valid_T & ex_reg_ctrl_typeTagOut == 2'h1),
|
|
.io_in_bits_ren3 (ex_reg_ctrl_ren3),
|
|
.io_in_bits_swap23 (ex_reg_ctrl_swap23),
|
|
.io_in_bits_rm (ex_rm),
|
|
.io_in_bits_fmaCmd
|
|
({ex_reg_inst[3], ex_reg_inst[2] | ~ex_reg_ctrl_ren3 & ex_reg_inst[27]}),
|
|
.io_in_bits_in1 (_regfile_ext_R2_data),
|
|
.io_in_bits_in2 (_regfile_ext_R1_data),
|
|
.io_in_bits_in3 (_regfile_ext_R0_data),
|
|
.io_out_bits_data (_dfma_io_out_bits_data),
|
|
.io_out_bits_exc (_dfma_io_out_bits_exc)
|
|
);
|
|
DivSqrtRecFN_small divSqrt (
|
|
.clock (clock),
|
|
.reset (divSqrt_killed),
|
|
.io_inReady (_divSqrt_io_inReady),
|
|
.io_inValid (divSqrt_inValid & _divSqrt_io_inValid_T),
|
|
.io_sqrtOp (mem_ctrl_sqrt),
|
|
.io_a
|
|
({_fpiu_io_out_bits_in_in1[64],
|
|
_fpiu_io_out_bits_in_in1[63:61] == 3'h0 | _fpiu_io_out_bits_in_in1[63:61] > 3'h5
|
|
? {_fpiu_io_out_bits_in_in1[63:61], _divSqrt_io_a_expOut_commonCase_T[5:0]}
|
|
: _divSqrt_io_a_expOut_commonCase_T,
|
|
_fpiu_io_out_bits_in_in1[51:29]}),
|
|
.io_b
|
|
({_fpiu_io_out_bits_in_in2[64],
|
|
_fpiu_io_out_bits_in_in2[63:61] == 3'h0 | _fpiu_io_out_bits_in_in2[63:61] > 3'h5
|
|
? {_fpiu_io_out_bits_in_in2[63:61], _divSqrt_io_b_expOut_commonCase_T[5:0]}
|
|
: _divSqrt_io_b_expOut_commonCase_T,
|
|
_fpiu_io_out_bits_in_in2[51:29]}),
|
|
.io_roundingMode (_fpiu_io_out_bits_in_rm),
|
|
.io_outValid_div (_divSqrt_io_outValid_div),
|
|
.io_outValid_sqrt (_divSqrt_io_outValid_sqrt),
|
|
.io_out (_divSqrt_io_out),
|
|
.io_exceptionFlags (_divSqrt_io_exceptionFlags)
|
|
);
|
|
DivSqrtRecFN_small_1 divSqrt_1 (
|
|
.clock (clock),
|
|
.reset (divSqrt_killed),
|
|
.io_inReady (_divSqrt_1_io_inReady),
|
|
.io_inValid (divSqrt_inValid & _divSqrt_io_inValid_T_2),
|
|
.io_sqrtOp (mem_ctrl_sqrt),
|
|
.io_a (_fpiu_io_out_bits_in_in1),
|
|
.io_b (_fpiu_io_out_bits_in_in2),
|
|
.io_roundingMode (_fpiu_io_out_bits_in_rm),
|
|
.io_outValid_div (_divSqrt_1_io_outValid_div),
|
|
.io_outValid_sqrt (_divSqrt_1_io_outValid_sqrt),
|
|
.io_out (_divSqrt_1_io_out),
|
|
.io_exceptionFlags (_divSqrt_1_io_exceptionFlags)
|
|
);
|
|
assign io_fcsr_flags_valid = wb_toint_valid | divSqrt_wen | wen[0];
|
|
assign io_fcsr_flags_bits =
|
|
(wb_toint_valid ? wb_toint_exc : 5'h0) | (divSqrt_wen ? divSqrt_flags : 5'h0)
|
|
| (wen[0] ? _GEN_3[wbInfo_0_pipeid] : 5'h0);
|
|
assign io_fcsr_rdy =
|
|
~((|{ex_reg_valid & ex_reg_ctrl_wflags | mem_reg_valid & mem_ctrl_wflags
|
|
| wb_toint_valid,
|
|
wen}) | divSqrt_inFlight);
|
|
assign io_nack_mem = io_nack_mem_0;
|
|
assign io_illegal_rm =
|
|
io_inst[14:12] == 3'h5 | io_inst[14:12] == 3'h6 | (&(io_inst[14:12]))
|
|
& io_fcsr_rm > 3'h4;
|
|
assign io_dec_ren1 = _fp_decoder_io_sigs_ren1;
|
|
assign io_dec_ren2 = _fp_decoder_io_sigs_ren2;
|
|
assign io_dec_ren3 = _fp_decoder_io_sigs_ren3;
|
|
assign io_sboard_set = wb_reg_valid & io_sboard_set_REG;
|
|
assign io_sboard_clr = divSqrt_wen | wen[0] & (&wbInfo_0_pipeid);
|
|
assign io_sboard_clra = waddr;
|
|
endmodule
|
|
|