Files
gps/hardware/generated/genesys2-soc-verilog/FPU.sv
T
2026-08-06 22:14:52 +03:00

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