blob: 36285e4b3bc1499b76d7e4f13f1a11c6e2ae4df4 [file] [log] [blame]
///
// Copyright 2022 Tobias Strauch, Munich, Bavaria
//
// SPDX-FileCopyrightText: 2020 Efabless Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// SPDX-License-Identifier: Apache-2.0
//
module cubev_rv32imc_p3 (pc_s2_next,
instr,
pc_set_int,
pc_set_data_int,
dbus_rd_add,
dbus_wr_add,
dbus_rdwr_width,
dbus_rd_i_req,
dbus_rd_i_data,
dbus_wr_en,
dbus_wr_data,
cubev_rf1_we,
cubev_rf1_wr_add,
cubev_rf1_din,
cubev_rf1_rd_add,
cubev_rf1_dout,
cubev_rf2_we,
cubev_rf2_wr_add,
cubev_rf2_din,
cubev_rf2_rd_add,
cubev_rf2_dout,
cubev_reg_din0,
cubev_reg_din0_valid,
cubev_reg_din1,
cubev_reg_din2,
cubev_reg_din2_valid,
cubev_reg_din3,
cubev_reg_din4,
cubev_reg_din5,
cubev_reg_dout0,
cubev_reg_dout1,
cubev_reg_dout2,
cubev_reg_dout3,
cubev_reg_dout4,
cubev_reg_dout5,
cubev_reg_dout0_late,
cubev_reg_dout1_late,
cubev_reg_dout2_late,
cubev_reg_dout3_late,
cubev_reg_dout4_late,
cubev_reg_dout5_late);
output [31:0] pc_s2_next;
input [31:0] instr;
input pc_set_int;
input [29:0] pc_set_data_int;
output [31:0] dbus_rd_add;
output [31:0] dbus_wr_add;
output [1:0] dbus_rdwr_width;
output dbus_rd_i_req;
input [31:0] dbus_rd_i_data;
output dbus_wr_en;
output [31:0] dbus_wr_data;
output cubev_rf1_we;
output [4:0] cubev_rf1_wr_add;
output [31:0] cubev_rf1_din;
output [4:0] cubev_rf1_rd_add;
input [31:0] cubev_rf1_dout;
output cubev_rf2_we;
output [4:0] cubev_rf2_wr_add;
output [31:0] cubev_rf2_din;
output [4:0] cubev_rf2_rd_add;
input [31:0] cubev_rf2_dout;
output [31:0] cubev_reg_din0;
output cubev_reg_din0_valid;
output [31:0] cubev_reg_din1;
output [31:0] cubev_reg_din2;
output cubev_reg_din2_valid;
output [31:0] cubev_reg_din3;
output [31:0] cubev_reg_din4;
output [31:0] cubev_reg_din5;
input [31:0] cubev_reg_dout0;
input [31:0] cubev_reg_dout1;
input [31:0] cubev_reg_dout2;
input [31:0] cubev_reg_dout3;
input [31:0] cubev_reg_dout4;
input [31:0] cubev_reg_dout5;
input [31:0] cubev_reg_dout0_late;
input [31:0] cubev_reg_dout1_late;
input [31:0] cubev_reg_dout2_late;
input [31:0] cubev_reg_dout3_late;
input [31:0] cubev_reg_dout4_late;
input [31:0] cubev_reg_dout5_late;
wire [31:0] pc = pc_s2;
wire [31:0] pc_s2;
wire [31:0] instr_s1;
wire [31:0] instr_s2;
wire [31:0] dp_rs1_s2, dp_rs2_s2;
wire [1:0] pvalid;
wire stalled;
wire [5:0] state_s2;
wire sign_s2;
wire instr_i_load_s2;
wire instr_c_lw_s2;
wire instr_c_lwsp_s2;
wire instr_i_store_s2;
wire instr_c_sw_s2;
wire instr_c_swsp_s2;
wire divrem_access_0_d1;
wire [1:0] mul_carry_s2;
wire [1:0] mul_carry_s2_next;
////////////////////////////////////////////////////////////
//
// Init phase, set stages invalid, stall, RF write-through
//
////////////////////////////////////////////////////////////
wire [1:0] pvalid_next_late = (pvalid_late < 2) ? pvalid_late + 1 : jump_or_branch_s2 ? 0 : pvalid_late;
wire [1:0] pvalid_next = (pvalid_c3 < 2) ? pvalid_c3 + 1 : jump_or_branch_s2 ? 0 : pvalid_c3;
wire instr_m_s1 = instr_m_mul_s1_c1_next | instr_m_mulh_s1_c1_next | instr_m_mulhsu_s1_c1_next |
instr_m_div_s1_c1_next | instr_m_rem_s1_c1_next;
wire instr_m_mulhx_s2 = instr_m_mulh_s2_c1_next | instr_m_mulhsu_s2_c1_next | instr_m_mulhu_s2_c1_next;
wire instr_m_mulx_s2 = instr_m_mul_s2_c1_next | instr_m_mulhx_s2;
wire rd_valid_s2 = (((instr_i_beq_s2_c1 | instr_i_bne_s2_c1 | instr_i_blt_s2_c1 | instr_i_bge_s2_c1 | instr_i_bltu_s2_c1 | instr_i_bgeu_s2_c1) & opcode_i_s2_eq63_c1) |
instr_i_store_s2_c1 |
instr_c_j_s2_c1 | (instr_c_jr_s2_c1 & rs2_c_s2_eq0_c1) | instr_c_beqz_s2_c1 | instr_c_bnez_s2_c1 |
instr_c_swsp_s2_c1 | instr_c_sw_s2_c1) ? 1'b0 : 1'b1;
wire rs1_valid_s1 = (instr_i_lui_s1_c1 | instr_i_auipc_s1_c1 | instr_i_jal_s1_c1 |
instr_c_j_s1_c1 | instr_c_jal_s1_c1 | instr_c_li_s1_c1 |
(instr_c_lui_s1_c1 & !instr_s1_11_7_eq_02_c1)) ? 1'b0 : 1'b1;
wire rs1_wth_s1 = ((pvalid_c2 == 2) &
(rs1_s1_c2 == rd_s2_c2) &
rs1_valid_s1_c2 &
rd_valid_s2_c2 &
!instr_m_s1_c2 &
!(instr_m_mulhx_s2_c2 & state_eq1_s2_c2)) ? 1'b1 : 1'b0;
wire [31:0] dp_rs1_s2_next_stalled = stalled_next_c3 ? cubev_reg_dout2 : 0; //dp_rs1_s2_c3 : 0;
wire [31:0] dp_rs1_s2_next_div = (!stalled_next & (instr_m_div_s2_c2 | instr_m_divu_s2_c2) & (state_eq31_s2)) ? dp_divrem_rfin_s2 :
(!stalled_next & instr_m_divrem_s2_c2 & !state_eq32_s2_c2) ? dp_div_remainder_result_s2 : 0;
wire [31:0] dp_rs1_s2_next_mul2 = dp_mul_alhblh_s2_c3;
wire dp_rs1_s2_next_mul_sel = (!stalled_next &
(instr_m_mul_s1_c2 |
instr_m_mulh_s1_c2 | instr_m_mulhsu_s1_c2 |
instr_m_div_s1_c2 | instr_m_rem_s1_c2 |
((instr_m_mulh_s2_c2 | instr_m_mulhsu_s2_c2) & state_eq1_s2_c2)));
wire [31:0] dp_rs1_s2_next_mul = dp_rs1_s2_next_mul_sel_c3 ? dp_rs1_abs_s1 : 0;
wire [31:0] dp_rs1_s2_next_rf_dp_out = (!stalled_next_c3 & rs1_wth_s1_c3 & dp_wr_s2) ? dp_out_s2 : 0;
wire [31:0] dp_rs1_s2_next_rf_dp_load = (!stalled_next_c3 & rs1_wth_s1_c3 & !dp_wr_s2 & !(stalled_next_c3 | dp_rs1_s2_next_sel1_c3)) ? dp_load_s2 : 0;
wire dp_rs1_s2_next_def_sel = (!stalled_next &(!(rs1_wth_s1 | dp_rs1_s2_next_mul_sel)));
wire [31:0] dp_rs1_s2_next_def = dp_rs1_s2_next_def_sel_c3 ? dp_rs1_s1_c3 : 0;
wire dp_rs1_s2_next_sel1 = ((instr_m_div_s2_c2 | instr_m_divu_s2_c2) & state_eq31_s2) |
(instr_m_divrem_s2_c2 & !state_eq32_s2_c2) |
(instr_m_mulx_s2_c2 & state_eq0_s2_c2) |
(instr_m_mulhx_s2_c2 & state_eq2_s2);
/*
wire [31:0] dp_rs1_s2_next = dp_rs1_s2_next_rf_dp_load |
dp_rs1_s2_next_stalled |
((dp_rs1_s2_next_sel1_c3) ? // priority
(dp_rs1_s2_next_div_c3 | dp_rs1_s2_next_mul2) :
(dp_rs1_s2_next_mul | dp_rs1_s2_next_rf_dp_out | dp_rs1_s2_next_def));
*/
wire [31:0] dp_rs1_s2_next = dp_rs1_s2_next_rf_dp_load |
//dp_rs1_s2_next_stalled |
((dp_rs1_s2_next_sel1_c3) ? // priority
(dp_rs1_s2_next_div_c3 | dp_rs1_s2_next_mul2) :
(dp_rs1_s2_next_mul | dp_rs1_s2_next_rf_dp_out | dp_rs1_s2_next_def));
wire [31:0] dp_rs1_s2_next_int = dp_rs1_s2_next_rf_dp_load |
dp_rs1_s2_next_stalled |
((dp_rs1_s2_next_sel1_c3) ? // priority
(dp_rs1_s2_next_div_c3 | dp_rs1_s2_next_mul2) :
(dp_rs1_s2_next_mul | dp_rs1_s2_next_rf_dp_out | dp_rs1_s2_next_def));
assign cubev_reg_din2_valid = !stalled_next_c3;
wire rs2_wth_s1 = ((pvalid_c2 == 2) &
(rs2_s1_c2 == rd_s2_c2) &
rs2_valid_s1_c2 &
rd_valid_s2_c2 & !instr_m_s1_c2 &
!(instr_m_mulhx_s2_c2 & state_eq1_s2_c2)) ? 1'b1 : 1'b0;
wire rs2_valid_s1 = opcode_i_s1_13_shamt_c1 |
opcode_i_s1_23_c1 |
opcode_i_s1_33_c1 |
opcode_i_s1_63_c1 |
instr_c_swsp_s1_c1 |
instr_c_sw_s1_c1 |
(instr_c_mv_s1_c1 & !rs2_c_s1_eq0_c1) |
(instr_c_add_s1_c1 & !rs2_c_s1_eq0_c1) |
funct6_c_s1_23_opcode_2_c1;
wire [31:0] dbus_rdwr_offset_load_s1 = instr_i_load_s1_c2 ? {{20{imm_11_0_s1[11]}}, imm_11_0_s1} : 0;
wire [31:0] dbus_rdwr_offset_c_lw_s1 = instr_c_lw_s1_c2 ? {24'h000000, imm_6_5_3_2_s1, 2'b00} : 0;
wire [31:0] dbus_rdwr_offset_c_lwsp_s1 = instr_c_lwsp_s1_c2 ? {25'h0000000, offset_7_6_5_4_2_s1, 2'b00} : 0;
wire [31:0] dp_rs2_s2_next_offset = dbus_rdwr_offset_load_s1 |
dbus_rdwr_offset_c_lw_s1 |
dbus_rdwr_offset_c_lwsp_s1;
wire [31:0] dp_rs2_s2_next_stalled = stalled_next ? cubev_reg_dout3 : 0; //dp_rs2_s2_c2 : 0;
wire [30:0] dp_rs2_s2_31_1 = cubev_reg_dout3 >> 1; //dp_rs2_s2_c3 >> 1;
wire dp_rs2_s2_next_div_sel = !stalled_next & instr_m_divrem_s2_c2 & !state_eq32_s2_c2;
wire [31:0] dp_rs2_s2_next_div = dp_rs2_s2_next_div_sel_c3 ? {/*dp_rs2_s2_c3*/cubev_reg_dout3[0], dp_rs2_s2_31_1} : 0;
wire dp_rs2_s2_next_mul2_sel1 = !stalled_next & instr_m_mulx_s2_c2 & state_eq0_s2_c2;
wire dp_rs2_s2_next_mul2_sel2 = !stalled_next & instr_m_mulhx_s2_c2 & state_eq2_s2;
wire [31:0] dp_rs2_s2_next_mul2 = dp_rs2_s2_next_mul2_sel1_c3 ? {dp_mul_ahbl_s2_c3[15:0], dp_mul_albh_s2_c3[15:0]} :
dp_rs2_s2_next_mul2_sel2_c3 ? {dp_mul_ahbl_s2_c3[31:16], dp_mul_albh_s2_c3[31:16]} : 0;
wire dp_rs2_s2_next_mul_sel = (!stalled_next &
(instr_m_mul_s1_c2 |
instr_m_mulh_s1_c2 |
instr_m_div_s1_c2 | instr_m_rem_s1_c2 |
(instr_m_mulh_s2_c2 & state_eq1_s2_c2)));
wire [31:0] dp_rs2_s2_next_mul = dp_rs2_s2_next_mul_sel_c3 ? dp_rs2_abs_s1 : 0;
wire dp_rs2_s2_next_sh_sel = (!stalled_next &
(instr_i_srli_s1_c2 | instr_c_srli_s1_c2 |
instr_i_srai_s1_c2 | instr_c_srai_s1_c2 |
instr_i_slli_s1_c2 | instr_c_slli_s1_c2));
wire [31:0] dp_rs2_s2_next_sh = dp_rs2_s2_next_sh_sel_c3 ? {27'hxxxxxxx, dp_shmul_a_s1_c3} : 0;
wire [31:0] dp_rs2_s2_next_rf_dp_out = (!stalled_next_c3 & rs2_wth_s1_c3 & dp_wr_s2) ? dp_out_s2 : 0;
wire dp_rs2_s2_next_rf_dp_load_sel = !stalled_next & dbus_rd_i_req_c2 & rs2_wth_s1;
wire [31:0] dp_rs2_s2_next_rf_dp_load = (dp_rs2_s2_next_rf_dp_load_sel_c3 & !dp_wr_s2) ? dp_load_s2 : 0;
wire dp_rs2_s2_next_def_sel = !(stalled_next |
rs2_wth_s1 |
instr_i_load_s1_c2 |
instr_c_lw_s1_c2 |
instr_c_lwsp_s1_c2 |
instr_m_mul_s1_c2 |
instr_m_mulh_s1_c2 |
instr_m_div_s1_c2 | instr_m_rem_s1_c2 |
(instr_m_mulh_s2_c2 & state_eq1_s2_c2));
wire [31:0] dp_rs2_s2_next_def = dp_rs2_s2_next_def_sel_c3 ? dp_rs2_s1_c3 : 0;
wire dp_rs2_s2_next_sel = (instr_m_divrem_s2_c2 & !state_eq32_s2_c2) |
(instr_m_mulx_s2_c2 & state_eq0_s2_c2) |
(instr_m_mulhx_s2_c2 & state_eq2_s2);
/*
wire [31:0] dp_rs2_s2_next = dp_rs2_s2_next_rf_dp_load |
dp_rs2_s2_next_stalled_c3 |
(dp_rs2_s2_next_sel_c3 ? // priority
(dp_rs2_s2_next_div | dp_rs2_s2_next_mul2) :
(dp_rs2_s2_next_mul | dp_rs2_s2_next_sh | dp_rs2_s2_next_rf_dp_out | dp_rs2_s2_next_def | dp_rs2_s2_next_offset_c3));
*/
wire [31:0] dp_rs2_s2_next = dp_rs2_s2_next_rf_dp_load |
//dp_rs2_s2_next_stalled_c3 |
(dp_rs2_s2_next_sel_c3 ? // priority
(dp_rs2_s2_next_div | dp_rs2_s2_next_mul2) :
(dp_rs2_s2_next_mul | dp_rs2_s2_next_sh | dp_rs2_s2_next_rf_dp_out | dp_rs2_s2_next_def | dp_rs2_s2_next_offset_c3));
wire [31:0] instr_s1_next = (jump_or_branch_s2) ? 32'h00000013 :
(stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3)) ? cubev_reg_dout0 //instr_s1_c3
: instr_c3;
//wire [31:0] instr_s1_next = (jump_or_branch_s2) ? 32'h00000013 : instr_c3;
//assign cubev_reg_din0_valid = 1'b1;
assign cubev_reg_din0_valid = pc_set_int |
jump_or_branch_s2 |
(!(stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3)));
wire [31:0] instr_s2_next = (jump_or_branch_s2) ? 32'h00000013 :
/*
(stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3)) ? cubev_reg_dout1 : //instr_s2_c3 :
*/
instr_i_sra_s1_c3 ? //{instr_s1_c3[31:25], dp_rs2_s1_c3[4:0], instr_s1_c3[19:0]} :
{cubev_reg_dout0[31:25], dp_rs2_s1_c3[4:0], cubev_reg_dout0[19:0]} :
cubev_reg_dout0; //instr_s1_c3;
wire [31:0] instr_s2_next_int = (jump_or_branch_s2) ? 32'h00000013 :
(stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3)) ? cubev_reg_dout1 : //instr_s2_c3 :
instr_i_sra_s1_c3 ? //{instr_s1_c3[31:25], dp_rs2_s1_c3[4:0], instr_s1_c3[19:0]} :
{cubev_reg_dout0[31:25], dp_rs2_s1_c3[4:0], cubev_reg_dout0[19:0]} :
cubev_reg_dout0; //instr_s1_c3;
wire stalled_next_sel1 = (stalled_c1 | (rd_s2 == 0) | !rd_valid_s2 |
(instr_m_divrem_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & !state_eq32_s2_c1) |
(instr_m_mul_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & state_eq0_s2_c1) |
(instr_m_mulhx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & (state_eq0_s2_c1 | state_eq1_s2_c1 | (state_s2_c1 == 2)))) ? 1'b1 : 0;
wire stalled_next_sel2 = (((rs1_s1 == rd_s2) & instr_m_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1) |
((rs2_s1 == rd_s2) & instr_m_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1) /* |
(instr_load_s2)*/) ? 1'b1 : 0;
wire stalled_next = stalled_next_sel1_c2 ? 0 :
stalled_next_sel2_c2 ? 1'b1 : 0;
wire pcadv1 = (instr_s1[1:0] == 2'b11) ? 1 : 0;
wire pcadv2 = (instr_s2[1:0] == 2'b11) ? 1 : 0;
wire state_eq0_s2 = state_s2 == 0;
wire state_eq1_s2 = state_s2 == 1;
wire state_eq2_s2 = state_s2_c2 == 2;
wire state_eq3_s2 = state_s2_c1 == 3;
wire state_lt3_s2 = (state_eq0_s2_c2 | state_eq1_s2_c2 | state_eq2_s2);
wire state_eq31_s2 = state_s2_c2 == 31;
wire state_eq32_s2 = state_s2 == 32;
wire state_s2_next_sel1 = (stalled_next & state_eq32_s2_c2 & instr_m_divrem_s2_c2) |
(stalled_next & state_eq1_s2_c2 & instr_m_mul_s2_c2) |
(stalled_next & state_eq3_s2_c2 & instr_m_mulhx_s2_c2);
wire state_s2_next_sel2 = (state_eq32_s2_c2 |
(instr_m_mul_s2_c2 & state_eq1_s2_c2) |
(instr_m_mulhx_s2_c2 & state_eq3_s2_c2) |
(!(pvalid_c2 == 2)));
wire [5:0] state_s2_next = state_s2_next_sel1_c3 ? cubev_reg_dout5[8:3] : //state_s2_c3 :
state_s2_next_sel2_c3 ? 0 :
(instr_m_divrem_s2_c3 | instr_m_mulx_s2_c3) ? state_s2_c3 + 1 : 0; //221006 cubev_reg_dout5[8:3]; //state_s2_c3;
////////////////////////////////////////////////////////////
//
// Stage 0
//
////////////////////////////////////////////////////////////
wire [31:0] instr_s0_clear = jump_or_branch_s2 ? 32'h00000013 :
(stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3)) ? instr_s1_c3 : instr;
//wire [2:0] funct3_i_s2 = instr_s2[14:12];
wire [2:0] funct3_i_s2_next = instr_s2_next_int[14:12];
//wire instr_m_mulh_s2_next = funct3_i_s2 == 3'b001;
wire instr_m_mulh_s1_next = funct3_i_s2_next == 3'b001;
wire instr_m_mulhsu_s1_next = funct3_i_s2_next == 3'b010;
wire instr_m_mulhu_s1_next = funct3_i_s2_next == 3'b011;
//wire funct7_i_s2_eq1 = funct7_i_s2 == 7'b0000001;
wire funct7_i_s2_eq1_next = instr_s2_next_int[31:25] == 7'b0000001;
//wire opcode_i_s2_eq33 = instr_s2[6:0] == 7'h33;
wire opcode_i_s1_eq33 = instr_s2_next_int[6:0] == 7'h33;
wire state_eq1_s1 = state_s2_next == 1;
//wire instr_m_mulhx_s2 = instr_m_mulh_s2_c1_next | instr_m_mulhsu_s2_c1_next | instr_m_mulhu_s2_c1_next;
wire instr_m_mulhx_s1 = instr_m_mulh_s1_next | instr_m_mulhsu_s1_next | instr_m_mulhu_s1_next;
wire mulh_access_0_s0 = //instr_m_mulhx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & state_eq1_s2_c1;
instr_m_mulhx_s1 & opcode_i_s1_eq33 & funct7_i_s2_eq1_next & state_eq1_s1;
//
// rs1
//
wire rs1_def_sel_s0 = instr_s0_clear[1:0] == 2'b11;
wire [4:0] rs1_i_s0 = instr_s0_clear[19:15];
wire [4:0] rs1_def_s0 = rs1_def_sel_s0 ? rs1_i_s0 : 0;
wire rs2_c_s0_eq0 = instr_s0_clear[6:2] == 0;
wire rs1_c_add_sel_s0 = instr_c_add_s0 & !rs2_c_s0_eq0;
wire [4:0] rs2_c_s0 = instr_s0_clear[6:2];
wire [4:0] rs1_c_add_s0 = rs1_c_add_sel_s0 ? rs2_c_s0 : 0;
wire [1:0] opcode_c_s0 = instr_s0_clear[1:0];
wire [2:0] funct3_c_s0 = instr_s0_clear[15:13];
wire instr_c_addi4spn_s0 = opcode_c_s0 == 2'b00 & funct3_c_s0 == 3'b000;
wire instr_c_swsp_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b110;
wire instr_c_lwsp_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b010;
wire rs1_c_sp_sel_s0 = instr_c_addi4spn_s0 | instr_c_swsp_s0 | instr_c_lwsp_s0;
wire [4:0] rs1_c_sp_s0 = rs1_c_sp_sel_s0 ? 2 : 0;
wire instr_c_addi_s0 = opcode_c_s0 == 2'b01 & funct3_c_s0 == 3'b000;
wire instr_c_addi16sp_s0 = opcode_c_s0 == 2'b01 & funct3_c_s0 == 3'b011;
wire instr_s0_11_7_eq_02 = instr_s0_clear[11:7] == 5'b00010;
wire instr_c_slli_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b000;
wire instr_c_jr_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b100 & instr_s0_clear[12] == 1'b0;
wire instr_c_jalr_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b100 & instr_s0_clear[12] == 1'b1;
wire rs1_c_def_sel_s0 = (instr_c_addi_s0 |
(instr_c_addi16sp_s0 & instr_s0_11_7_eq_02) |
instr_c_slli_s0 |
(instr_c_jr_s0 & rs2_c_s0_eq0) |
(instr_c_jalr_s0 & rs2_c_s0_eq0));
wire [2:0] rs1s_c_s0 = instr_s0_clear[9:7];
wire [4:0] rs1_c_1_s0 = !(rs1_def_sel_s0 | rs1_c_add_sel_s0 | rs1_c_sp_sel_s0 | rs1_c_def_sel_s0) ? {2'b01, rs1s_c_s0} : 0;
wire [4:0] rs1_c_s0 = instr_s0_clear[11:7];
wire [4:0] rs1_c_def_s0 = rs1_c_def_sel_s0 ? rs1_c_s0 : 0;
wire [4:0] rs1_s0 = rs1_def_s0 | rs1_c_add_s0 | rs1_c_sp_s0 | rs1_c_1_s0 | rs1_c_def_s0;
wire [4:0] rf1_addrb_s0 = /* mulh_access_0 ? instr_s2_c1[19:15] : */
mulh_access_0_s0 ? instr_s2_next_int[19:15] : rs1_s0;
//
// rs2
//
wire rs2_def_sel_s0 = (instr_s0_clear[1:0] == 2'b11) & !(instr_s0_clear[6:2] == 5'h04);
wire [4:0] rs2_i_s0 = instr_s0_clear[24:20];
wire [4:0] rs2_def_s0 = rs2_def_sel_s0 ? rs2_i_s0 : 0;
wire instr_c_add_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 4'b100 & instr_s0_clear[12] == 1'b1 & instr_s0_clear[6:2] != 0 & instr_s0_clear[11:7] != 0;
wire [4:0] rd_c_s0 = instr_s0_clear[11:7];
wire [4:0] rs2_c_add_s0 = instr_c_add_s0 & !rs2_c_s0_eq0 ? rd_c_s0 : 0;
wire instr_c_mv_s0 = opcode_c_s0 == 2'b10 & funct3_c_s0 == 3'b100 & instr_s0_clear[12] == 1'b0 & instr_s0_clear[11:7] != 0;
wire [4:0] rs2_c_mv_s0 = ((instr_c_mv_s0 & !rs2_c_s0_eq0) | instr_c_swsp_s0) ? rs2_c_s0 : 0;
wire instr_c_sw_s0 = opcode_c_s0 == 2'b00 & funct3_c_s0 == 3'b110;
wire [5:0] funct6_c_s0 = instr_s0_clear[15:10];
wire funct6_c_s0_23_opcode_2 = (opcode_c_s0 == 2'b01) & (funct6_c_s0 == 6'b100011);
wire [2:0] rs2s_c_s0 = instr_s0_clear[4:2];
wire [4:0] rs2_c_sw_s0 = (instr_c_sw_s0 | funct6_c_s0_23_opcode_2) ? {2'b01, rs2s_c_s0} : 0;
wire [4:0] rs2_s0 = rs2_c_add_s0 | rs2_c_mv_s0 | rs2_c_sw_s0 | rs2_def_s0;
wire [4:0] rf2_addrb_s0 = /* divrem_access_0_d1 ? 0 :
mulh_access_0 ? instr_s2_c1[24:20] : */
divrem_access_0_d1_next ? 0 :
mulh_access_0_s0 ? instr_s2_next_int[24:20] : rs2_s0;
////////////////////////////////////////////////////////////
//
// Stage 1
//
////////////////////////////////////////////////////////////
wire [7:0] funct7_i_s1 = instr_s1[31:25];
wire [7:0] funct7_i_s1_c1 = instr_s1_c1[31:25];
wire funct7_i_s1_eq0 = funct7_i_s1_c1 == 7'b0000000;
wire funct7_i_s1_eq20 = funct7_i_s1_c1 == 7'b0100000;
wire funct7_i_s1_eq1 = funct7_i_s1_c1 == 7'b0000001;
wire [2:0] funct3_i_s1 = instr_s1[14:12];
wire [4:0] shamt_i_s1 = instr_s1_c2[24:20];
wire [4:0] rs2_i_s1 = instr_s1_c1[24:20];
wire [4:0] rs1_i_s1 = instr_s1_c1[19:15];
wire [6:0] opcode_i_s1 = instr_s1[6:0];
wire opcode_i_s1_13_shamt = (instr_s1[6:0] == 7'h13) & ((instr_s1[14:12] == 3'h1) | (instr_s1[14:12] == 3'h5));
wire opcode_i_s1_13 = instr_s1[6:0] == 7'h13;
wire opcode_i_s1_23 = instr_s1[6:0] == 7'h23;
wire opcode_i_s1_33 = instr_s1[6:0] == 7'h33;
wire opcode_i_s1_63 = instr_s1[6:0] == 7'h63;
wire [11:0] imm_11_0_s1 = instr_s1_c2[31:20];
wire instr_i_lui_s1_c1_next = opcode_i_s1 == 7'b0110111;
wire instr_i_auipc_s1_c1_next = opcode_i_s1 == 7'b0010111;
wire instr_i_jal_s1_c1_next = opcode_i_s1 == 7'b1101111;
wire instr_i_load_s1_c1_next = opcode_i_s1 == 7'b0000011;
wire instr_i_store_s1_c1_next = opcode_i_s1 == 7'b0100011;
wire instr_i_slli_s1_c1_next = /* opcode_i_s1 == 7'b0010011 & */ funct3_i_s1 == 3'b001; // & funct7_i_s1 == 7'b0000000;
wire instr_i_srli_s1_c1_next = /* opcode_i_s1 == 7'b0010011 & */ funct3_i_s1 == 3'b101; // & funct7_i_s1 == 7'b0000000;
wire instr_i_srai_s1_c1_next = /* opcode_i_s1 == 7'b0010011 & */ funct3_i_s1 == 3'b101; // & funct7_i_s1 == 7'b0100000;
wire instr_i_sll_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b001; // & funct7_i_s1 == 7'b0000000;
wire instr_i_srl_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b101; // & funct7_i_s1 == 7'b0000000;
wire instr_i_sra_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b101; // & funct7_i_s1 == 7'b0100000;
wire instr_m_mul_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b000; // & funct7_i_s1 == 7'b0000001;
wire instr_m_mulh_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b001; // & funct7_i_s1 == 7'b0000001;
wire instr_m_mulhsu_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b010; // & funct7_i_s1 == 7'b0000001;
wire instr_m_div_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b100; // & funct7_i_s1 == 7'b0000001;
wire instr_m_rem_s1_c1_next = /* opcode_i_s1 == 7'b0110011 & */ funct3_i_s1 == 3'b110; // & funct7_i_s1 == 7'b0000001;
wire [1:0] opcode_c_s1 = instr_s1[1:0];
wire [1:0] funct_c_s1 = instr_s1[6:5];
wire [1:0] funct2_c_s1 = instr_s1[11:10];
wire [2:0] funct3_c_s1 = instr_s1[15:13];
wire [5:0] funct6_c_s1 = instr_s1[15:10];
wire [4:0] imm_6_5_3_2_s1 = {instr_s1_c2[5], instr_s1_c2[12:10], instr_s1_c2[6]};
wire [5:0] offset_7_6_5_4_2_s1 = {instr_s1_c2[3:2], instr_s1_c2[12], instr_s1_c2[6:4]};
wire [5:0] shamt_5_4_0_s1 = {instr_s1_c2[12], instr_s1_c2[6:2]};
wire [4:0] rs1_c_s1 = instr_s1_c1[11:7];
wire [2:0] rs1s_c_s1 = instr_s1_c1[9:7];
wire [4:0] rs2_c_s1 = instr_s1_c1[6:2];
wire rs2_c_s1_eq0 = instr_s1[6:2] == 0;
wire [2:0] rs2s_c_s1 = instr_s1_c1[4:2];
wire [4:0] rd_c_s1 = instr_s1_c1[11:7];
wire instr_s1_11_7_eq_02 = instr_s1[11:7] == 5'b00010;
wire instr_c_lwsp_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b010;
wire instr_c_swsp_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b110;
wire instr_c_lw_s1_c1_next = opcode_c_s1 == 2'b00 & funct3_c_s1 == 3'b010;
wire instr_c_sw_s1_c1_next = opcode_c_s1 == 2'b00 & funct3_c_s1 == 3'b110;
wire instr_c_j_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b101;
wire instr_c_jal_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b001;
wire instr_c_jr_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b100 & instr_s1[12] == 1'b0; // & instr_s1[6:2] == 0; //{instr_s1[12], instr_s1[6:2]} == 6'b000000;
wire instr_c_jalr_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b100 & instr_s1[12] == 1'b1; // & instr_s1[6:2] == 0; //{instr_s1[12], instr_s1[6:2]} == 6'b100000;
wire instr_c_li_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b010;
wire instr_c_lui_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b011; // & instr_s1[11:7] != 5'b00010;
wire instr_c_beqz_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b110;
wire instr_c_bnez_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b111;
wire instr_c_addi_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b000;
wire instr_c_addi16sp_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b011; // & instr_s1[11:7] == 5'b00010;
wire instr_c_addi4spn_s1_c1_next = opcode_c_s1 == 2'b00 & funct3_c_s1 == 3'b000;
wire instr_c_slli_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b000;
wire instr_c_srli_s1_c1_next = opcode_c_s1 == 2'b01 & funct2_c_s1 == 2'b00 & funct3_c_s1 == 3'b100;
wire instr_c_srai_s1_c1_next = opcode_c_s1 == 2'b01 & funct2_c_s1 == 2'b01 & funct3_c_s1 == 3'b100;
wire instr_c_andi_s1_c1_next = opcode_c_s1 == 2'b01 & funct3_c_s1 == 3'b100 & funct2_c_s1 == 2'b10;
wire instr_c_mv_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 3'b100 & instr_s1[12] == 1'b0 /* & instr_s1[6:2] != 0 */ & instr_s1[11:7] != 0; // & imm_5_4_0[4:0] != 5'b00000;
wire instr_c_add_s1_c1_next = opcode_c_s1 == 2'b10 & funct3_c_s1 == 4'b100 & instr_s1[12] == 1'b1 & instr_s1[6:2] != 0 & instr_s1[11:7] != 0; // & imm_5_4_0[4:0] != 5'b00000;
// SLLI
wire [4:0] dp_shamt_i_slli_s1 = instr_i_slli_s1_c2 ? shamt_i_s1 : 0;
// SLLI16
wire [4:0] dp_shamt_i_slli16_s1 = instr_c_slli_s1_c2 ? shamt_5_4_0_s1 : 0;
// SRLI
wire [4:0] dp_shamt_i_srli_s1 = instr_i_srli_s1_c2 ? shamt_i_s1 : 0;
// SRLI16
wire [4:0] dp_shamt_i_srli16_s1 = instr_c_srli_s1_c2 ? shamt_5_4_0_s1 : 0;
// SRAI
wire [4:0] dp_shamt_i_srai_s1 = instr_i_srai_s1_c2 ? shamt_i_s1 : 0;
// SRAI16
wire [4:0] dp_shamt_i_srai16_s1 = instr_c_srai_s1_c2 ? shamt_5_4_0_s1 : 0;
// SRL
wire [4:0] dp_shamt_i_srl_s1 = instr_i_srl_s1_c2 ? dp_rs2_s1[4:0] : 0;
// SRA
wire [4:0] dp_shamt_i_sra_s1 = instr_i_sra_s1_c2 ? dp_rs2_s1[4:0] : 0;
// SLL
wire [4:0] dp_shamt_sll_s1 = instr_i_sll_s1_c2 ? dp_rs2_s1[4:0] : 0;
wire [4:0] dp_shmul_a_s1 = dp_shamt_i_slli_s1 | dp_shamt_sll_s1 | dp_shamt_i_slli16_s1 |
dp_shamt_i_srli_s1 | dp_shamt_i_srai_s1 | dp_shamt_i_srl_s1 |
dp_shamt_i_sra_s1 | dp_shamt_i_srli16_s1 | dp_shamt_i_srai16_s1;
////////////////////////////////////////////////////////////
//
// Stage 2
//
////////////////////////////////////////////////////////////
wire [7:0] funct7_i_s2 = instr_s2[31:25];
wire funct7_i_s2_eq0 = funct7_i_s2 == 7'b0000000;
wire funct7_i_s2_eq20 = funct7_i_s2 == 7'b0100000;
wire funct7_i_s2_eq1 = funct7_i_s2 == 7'b0000001;
wire [2:0] funct3_i_s2 = instr_s2[14:12];
wire [4:0] shamt_i_s2_c1 = instr_s2_c1[24:20];
wire [4:0] rd_i_s2_c1 = instr_s2_c1[11:7];
wire [6:0] opcode_i_s2 = instr_s2[6:0];
wire opcode_i_s2_eq13 = instr_s2[6:0] == 7'h13;
wire opcode_i_s2_eq33 = instr_s2[6:0] == 7'h33;
wire opcode_i_s2_eq63 = instr_s2[6:0] == 7'h63;
wire [11:0] imm_11_0_s2 = instr_s2[31:20];
wire [11:0] imm_11_0_s2_c1 = instr_s2_c1[31:20];
wire [11:0] imm_11_0_s2_c2 = instr_s2_c2[31:20];
wire [11:0] imm_11_5_4_0_s2_c0 = {instr_s2[31:25], instr_s2[11:7]};
wire [11:0] imm_12_1_s2_c1 = {instr_s2_c1[31], instr_s2_c1[7], instr_s2_c1[30:25], instr_s2_c1[11:8]};
wire [19:0] imm_31_12_s2_c1 = instr_s2_c1[31:12];
wire [19:0] imm_20_1_s2_c1 = {instr_s2_c1[31], instr_s2_c1[19:12], instr_s2_c1[20], instr_s2_c1[30:21]};
wire instr_i_lui_s2_c1_next = opcode_i_s2 == 7'b0110111;
wire instr_i_auipc_s2_c1_next = opcode_i_s2 == 7'b0010111;
wire instr_i_jal_s2_c1_next = opcode_i_s2 == 7'b1101111;
wire instr_i_jalr_s2_c1_next = opcode_i_s2 == 7'b1100111;
wire instr_i_beq_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b000;
wire instr_i_bne_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b001;
wire instr_i_blt_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b100;
wire instr_i_bge_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b101;
wire instr_i_bltu_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b110;
wire instr_i_bgeu_s2_c1_next = /* opcode_i_s2 == 7'b1100011 & */ funct3_i_s2 == 3'b111;
wire instr_i_addi_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b000;
wire instr_i_slti_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b010;
wire instr_i_sltiu_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b011;
wire instr_i_xori_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b100;
wire instr_i_ori_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b110;
wire instr_i_andi_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b111;
wire instr_i_slli_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b001; // & funct7_i_s2 == 7'b0000000;
wire instr_i_srli_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b101; // & funct7_i_s2 == 7'b0000000;
wire instr_i_srai_s2_c1_next = /* opcode_i_s2 == 7'b0010011 & */ funct3_i_s2 == 3'b101; // & funct7_i_s2 == 7'b0100000;
wire instr_i_add_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b000; // & funct7_i_s2 == 7'b0000000;
wire instr_i_sub_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b000; // & funct7_i_s2 == 7'b0100000;
wire instr_i_sll_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b001; // & funct7_i_s2 == 7'b0000000;
wire instr_i_slt_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b010; // & funct7_i_s2 == 7'b0000000;
wire instr_i_sltu_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b011; // & funct7_i_s2 == 7'b0000000;
wire instr_i_xor_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b100; // & funct7_i_s2 == 7'b0000000;
wire instr_i_srl_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b101; // & funct7_i_s2 == 7'b0000000;
wire instr_i_sra_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b101; // & funct7_i_s2 == 7'b0100000;
wire instr_i_or_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b110; // & funct7_i_s2 == 7'b0000000;
wire instr_i_and_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b111; // & funct7_i_s2 == 7'b0000000;
wire instr_m_mul_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b000; // & funct7_i_s2 == 7'b0000001;
wire instr_m_mulh_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b001; // & funct7_i_s2 == 7'b0000001;
wire instr_m_mulhsu_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b010; // & funct7_i_s2 == 7'b0000001;
wire instr_m_mulhu_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b011; // & funct7_i_s2 == 7'b0000001;
wire instr_m_div_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b100; // & funct7_i_s2 == 7'b0000001;
wire instr_m_divu_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b101; // & funct7_i_s2 == 7'b0000001;
wire instr_m_rem_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b110; // & funct7_i_s2 == 7'b0000001;
wire instr_m_remu_s2_c1_next = /* opcode_i_s2 == 7'b0110011 & */ funct3_i_s2 == 3'b111; // & funct7_i_s2 == 7'b0000001;
wire [1:0] opcode_c_s2 = instr_s2[1:0];
wire [1:0] funct_c_s2 = instr_s2[6:5];
wire [1:0] funct2_c_s2 = instr_s2[11:10];
wire [2:0] funct3_c_s2 = instr_s2[15:13];
wire [5:0] funct6_c_s2 = instr_s2[15:10];
wire [5:0] imm_5_4_0_s2_c1 = {instr_s2_c1[12], instr_s2_c1[6:2]};
wire [4:0] imm_6_5_3_2_s2_c0 = {instr_s2[5], instr_s2[12:10], instr_s2[6]};
wire [7:0] imm_8_7_6_5_4_3_2_1_s2_c1 = {instr_s2_c1[12], instr_s2_c1[6:5], instr_s2_c1[2], instr_s2_c1[11:10], instr_s2_c1[4:3]};
wire [7:0] imm_9_6_5_4_3_2_s2_c1 = {instr_s2_c1[10:7], instr_s2_c1[12:11], instr_s2_c1[5], instr_s2_c1[6]};
wire [10:0] imm_11_10_9_8_7_6_5_4_3_1_s2_c1 = {instr_s2_c1[12], instr_s2_c1[8], instr_s2_c1[10:9], instr_s2_c1[6], instr_s2_c1[7], instr_s2_c1[2], instr_s2_c1[11], instr_s2_c1[5:3]};
wire [9:0] nzimm_9_8_7_6_5_4_s2_c1 = {instr_s2_c1[12], instr_s2_c1[4:3], instr_s2_c1[5], instr_s2_c1[2], instr_s2_c1[6], 4'h0};
wire [5:0] offset_7_6_5_2_s2_c0 = {instr_s2[8:7], instr_s2[12:9]};
wire [5:0] offset_7_6_5_4_2_s2_c0 = {instr_s2[3:2], instr_s2[12], instr_s2[6:4]};
wire [5:0] shamt_5_4_0_s2_c1 = {instr_s2_c1[12], instr_s2_c1[6:2]};
wire rs2_c_s2_eq0 = instr_s2[6:2] == 0;
wire [4:0] rd_c_s2_c1 = instr_s2_c1[11:7];
wire [2:0] rds97_c_s2_c1 = instr_s2_c1[9:7];
wire [2:0] rds42_c_s2_c1 = instr_s2_c1[4:2];
wire instr_s2_11_7_eq_02 = instr_s2[11:7] == 5'b00010;
wire instr_c_j_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b101;
wire instr_c_jal_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b001;
wire instr_c_jr_s2_c1_next = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b100 & instr_s2[12] == 1'b0; // & instr_s2[6:2] == 0; //{instr_s2[12], instr_s2[6:2]} == 6'b000000;
wire instr_c_jalr_s2_c1_next = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b100 & instr_s2[12] == 1'b1; // & instr_s2[6:2] == 0; //{instr_s2[12], instr_s2[6:2]} == 6'b100000;
wire instr_c_li_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b010;
wire instr_c_lui_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b011; // & instr_s2[11:7] != 5'b00010;
wire instr_c_beqz_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b110;
wire instr_c_bnez_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b111;
wire instr_c_addi_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b000;
wire instr_c_addi16sp_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b011; // & instr_s2[11:7] == 5'b00010;
wire instr_c_addi4spn_s2_c1_next = opcode_c_s2 == 2'b00 & funct3_c_s2 == 3'b000;
wire instr_c_slli_s2_c1_next = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b000;
wire instr_c_srli_s2_c1_next = opcode_c_s2 == 2'b01 & funct2_c_s2 == 2'b00 & funct3_c_s2 == 3'b100;
wire instr_c_srai_s2_c1_next = opcode_c_s2 == 2'b01 & funct2_c_s2 == 2'b01 & funct3_c_s2 == 3'b100;
wire instr_c_andi_s2_c1_next = opcode_c_s2 == 2'b01 & funct3_c_s2 == 3'b100 & funct2_c_s2 == 2'b10;
wire instr_c_mv_s2_c1_next = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b100 & instr_s2[12] == 1'b0 /* & instr_s2[6:2] != 0 */ & instr_s2[11:7] != 0; // & imm_5_4_0[4:0] != 5'b00000;
wire instr_c_add_s2_c1_next = opcode_c_s2 == 2'b10 & funct3_c_s2 == 4'b100 & instr_s2[12] == 1'b1 /* & instr_s2[6:2] != 0 */ & instr_s2[11:7] != 0; // & imm_5_4_0[4:0] != 5'b00000;
wire instr_c_and_s2_c1_next = /* opcode_c_s2 == 2'b01 & funct6_c_s2 == 6'b100011 & */ funct_c_s2 == 2'b11;
wire instr_c_or_s2_c1_next = /* opcode_c_s2 == 2'b01 & funct6_c_s2 == 6'b100011 & */ funct_c_s2 == 2'b10;
wire instr_c_xor_s2_c1_next = /* opcode_c_s2 == 2'b01 & funct6_c_s2 == 6'b100011 & */ funct_c_s2 == 2'b01;
wire instr_c_sub_s2_c1_next = /* opcode_c_s2 == 2'b01 & funct6_c_s2 == 6'b100011 & */ funct_c_s2 == 2'b00;
wire instr_load_s2 = 0; //instr_i_load_s2_c3 | instr_c_lw_s2_c3 | instr_c_lwsp_s2_c3;
////////////////////////////////////////////////////////////
//
// Datapath
//
////////////////////////////////////////////////////////////
// LUI32
wire [31:0] dp_lui_s2 = instr_i_lui_s2_c1 ? {imm_31_12_s2_c1, 12'h000} : 0;
// AUIPC32
wire [31:0] dp_pc_auipc_s2 = instr_i_auipc_s2_c1 ? pc_cleared_s2 : 0;
wire [31:0] dp_imm_auipc_s2 = instr_i_auipc_s2_c1 ? {imm_31_12_s2_c1, 12'h000} : 0;
// LI16
wire [31:0] dp_li16_s2 = instr_c_li_s2_c1 ? {{26{imm_5_4_0_s2_c1[5]}}, imm_5_4_0_s2_c1} : 0;
// LUI16
wire [31:0] dp_lui16_s2 = instr_c_lui_s2_c1 & !instr_s2_11_7_eq_02_c1 ? {{14{imm_5_4_0_s2_c1[5]}}, imm_5_4_0_s2_c1, 12'h000} : 0;
// JAL32
wire [31:0] dp_pc_jal32_s2 = instr_i_jal_s2_c1 ? pc_cleared_s2 : 0;
wire [31:0] dp_p4_jal32_s2 = instr_i_jal_s2_c1 ? 4 : 0;
// JAL16
wire [31:0] dp_pc_jal16_s2 = instr_c_jal_s2_c1 ? pc_cleared_s2 : 0;
wire [31:0] dp_p2_jal16_s2 = instr_c_jal_s2_c1 ? 2 : 0;
// JALR32
wire [31:0] dp_pc_jalr32_s2 = instr_i_jalr_s2_c1 ? pc_cleared_s2 : 0;
wire [31:0] dp_p4_jalr32_s2 = instr_i_jalr_s2_c1 ? 4 : 0;
wire [31:0] dp_rs1_jalr32_s2 = instr_i_jalr_s2_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_jalr32_s2 = instr_i_jalr_s2_c2 ? {{20{imm_11_0_s2_c2[11]}}, imm_11_0_s2_c2} : 0;
// JALR16
wire [31:0] dp_pc_jalr16_s2 = instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1 ? pc_cleared_s2 : 0;
wire [31:0] dp_p2_jalr16_s2 = instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1 ? 2 : 0;
// ADDI32
wire [31:0] dp_rs1_addi32_s2 = instr_i_addi_s2_c1 & opcode_i_s2_eq13_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_addi32_s2 = instr_i_addi_s2_c1 & opcode_i_s2_eq13_c1 ? {{20{imm_11_0_s2_c1[11]}}, imm_11_0_s2_c1} : 0;
// ADDI16
wire [31:0] dp_rs1_addi16_s2 = instr_c_addi_s2_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_addi16_s2 = instr_c_addi_s2_c1 ? {{26{imm_5_4_0_s2_c1[5]}}, imm_5_4_0_s2_c1} : 0;
// ADDI16SP
wire [31:0] dp_rs1_addi16sp_s2 = instr_c_addi16sp_s2_c1 & instr_s2_11_7_eq_02_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_addi16sp_s2 = instr_c_addi16sp_s2_c1 & instr_s2_11_7_eq_02_c1 ? {{22{nzimm_9_8_7_6_5_4_s2_c1[9]}}, nzimm_9_8_7_6_5_4_s2_c1} : 0; //{{26{imm_5_4_0[5]}}, imm_5_4_0} : 0;
// ADDI4SPN
wire [31:0] dp_rs1_addi4spn_s2 = instr_c_addi4spn_s2_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_addi4spn_s2 = instr_c_addi4spn_s2_c1 ? {{22{1'b0}}, imm_9_6_5_4_3_2_s2_c1, 2'b00} : 0;
// MV16
wire [31:0] dp_mv16_s2 = instr_c_mv_s2_c1 & !rs2_c_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
// ADD16
wire [31:0] dp_rs1_add16_s2 = instr_c_add_s2_c1 & !rs2_c_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rd_add16_s2 = instr_c_add_s2_c1 & !rs2_c_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
// XORI
wire [31:0] dp_rs1_xori_s2 = instr_i_xori_s2_c1 & opcode_i_s2_eq13_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_xori_s2 = instr_i_xori_s2_c1 & opcode_i_s2_eq13_c1 ? {{20{imm_11_0_s2_c1[11]}}, imm_11_0_s2_c1} : 0;
wire [31:0] dp_xori_s2 = dp_rs1_xori_s2 ^ dp_imm_xori_s2;
// ORI
wire [31:0] dp_rs1_ori_s2 = instr_i_ori_s2_c1 & opcode_i_s2_eq13_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_ori_s2 = instr_i_ori_s2_c1 & opcode_i_s2_eq13_c1 ? {{20{imm_11_0_s2_c1[11]}}, imm_11_0_s2_c1} : 0;
wire [31:0] dp_ori_s2 = dp_rs1_ori_s2 | dp_imm_ori_s2;
// ANDI
wire [31:0] dp_rs1_andi_s2 = instr_i_andi_s2_c1 & opcode_i_s2_eq13_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_andi_s2 = instr_i_andi_s2_c1 & opcode_i_s2_eq13_c1 ? {{20{imm_11_0_s2_c1[11]}}, imm_11_0_s2_c1} : 0;
wire [31:0] dp_andi_s2 = dp_rs1_andi_s2 & dp_imm_andi_s2;
// ANDI16
wire [31:0] dp_rs1_andi16_s2 = instr_c_andi_s2_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_imm_andi16_s2 = instr_c_andi_s2_c1 ? {{26{imm_5_4_0_s2_c1[5]}}, imm_5_4_0_s2_c1} : 0;
wire [31:0] dp_andi16_s2 = dp_rs1_andi16_s2 & dp_imm_andi16_s2;
// AND16
wire [31:0] dp_rs1_and16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_and_s2_c1) ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_and16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_and_s2_c1) ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_and16_s2 = dp_rs1_and16_s2 & dp_rs2_and16_s2;
// SRLI
wire [4:0] dp_shamt_i_srli_s2 = instr_i_srli_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq0_c1 ? shamt_i_s2_c1 : 0;
// SRLI16
wire [4:0] dp_shamt_i_srli16_s2 = instr_c_srli_s2_c1 ? shamt_5_4_0_s2_c1 : 0;
// SRAI
wire [4:0] dp_shamt_i_srai_s2 = instr_i_srai_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq20_c1 ? shamt_i_s2_c1 : 0;
// SRAI16
wire [4:0] dp_shamt_i_srai16_s2 = instr_c_srai_s2_c1 ? shamt_5_4_0_s2_c1 : 0;
// ADD
wire [31:0] dp_rs1_add_s2 = instr_i_add_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_add_s2 = instr_i_add_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
// XOR
wire [31:0] dp_rs1_xor_s2 = instr_i_xor_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_xor_s2 = instr_i_xor_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_xor_s2 = dp_rs1_xor_s2 ^ dp_rs2_xor_s2;
// XOR16
wire [31:0] dp_rs1_xor16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_xor_s2_c1) ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_xor16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_xor_s2_c1) ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_xor16_s2 = dp_rs1_xor16_s2 ^ dp_rs2_xor16_s2;
// SRL
wire [4:0] dp_shamt_i_srl_s2 = instr_i_srl_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs2_s2_c1[4:0] : 0;
// SRA
wire [4:0] dp_shamt_i_sra_s2 = instr_i_sra_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq20_c1 ? dp_rs2_s2_c1[4:0] : 0;
// OR
wire [31:0] dp_rs1_or_s2 = instr_i_or_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_or_s2 = instr_i_or_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_or_s2 = dp_rs1_or_s2 | dp_rs2_or_s2;
// OR16
wire [31:0] dp_rs1_or16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_or_s2_c1) ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_or16_s2 = (funct6_c_s2_23_opcode_2_c1 & instr_c_or_s2_c1) ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_or16_s2 = dp_rs1_or16_s2 | dp_rs2_or16_s2;
// AND
wire [31:0] dp_rs1_and_s2 = instr_i_and_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] dp_rs2_and_s2 = instr_i_and_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 ? dp_rs2_s2_c1 : 0;
wire [31:0] dp_and_s2 = dp_rs1_and_s2 & dp_rs2_and_s2;
//
// DIV and REM: divident / divisor
//
// divident: state 0: rf1[rs1_i]
// state > 0: rf1[0] (formally remainder)
//
// divisor: always rf2[rs2_i]
//
// remainder = divident - divisor (shifted)
//
// state: 0 => load registers
//
wire instr_m_divrem_s2 = instr_m_div_s2_c1_next | instr_m_divu_s2_c1_next | instr_m_rem_s2_c1_next | instr_m_remu_s2_c1_next;
wire sign_s2_next = (stalled_next_c3 & state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3) |
((instr_m_div_s2_c3 | instr_m_rem_s2_c3) & !state_eq32_s2_c3) ? sign_s2_late :
((instr_m_div_s1_c3 & (dp_rs1_s1_c3[31] != dp_rs2_s1_c3[31])) |
(instr_m_rem_s1_c3 & dp_rs1_s1_c3[31]) |
(instr_m_mul_s1_c3 & (dp_rs1_s1_c3[31] != dp_rs2_s1_c3[31])) |
(instr_m_mulh_s1_c3 & (dp_rs1_s1_c3[31] != dp_rs2_s1_c3[31])) |
(instr_m_mulhsu_s1_c3 & dp_rs1_s1_c3[31])) ? 1'b1 : 0;
// get divisor at the right place
wire [63:0] dp_div_divisor_s2 = {1'b0, dp_rs2_s2, dp_rs2_s2[31:1]} &
(64'h7fffffff80000000 >> state_s2);
// compare
wire dp_div_greater_s2 = (instr_m_divrem_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1) ? {32'h00000000, dp_rs1_s2_c1} >= dp_div_divisor_s2_c1 : 0;
// substract
wire [31:0] dp_div_remainder_s2 = dp_rs1_s2_c1[31:0] - dp_div_divisor_s2_c1[31:0];
wire [31:0] dp_div_remainder_result_s2 = dp_div_greater_s2_c2 & !state_eq32_s2_c2 ? dp_div_remainder_s2_c2 : dp_rs1_s2_c2;
// div and rem rfin
wire [31:0] dp_divrem_rfin_s2 = (instr_m_div_s2_c2 | instr_m_divu_s2_c2) ? {dp_divrem_rfout_s2, dp_div_greater_s2_c2} : dp_divrem_rfout_s2;
// div rfout control
wire [31:0] dp_divrem_rfout_s2 = rf2_doutb_s1;
// div and rem or-ed
wire [31:0] dp_divrem_s2 = (instr_m_divrem_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1) ? (sign_s2_c1 ? dp_neg_s2[31:0] : dp_rs1_s2_c1) : 0;
// not checked: reuse of adder might be beneficial
wire [32:0] dp_add_a_s2 = (dp_pc_auipc_s2 | dp_pc_jal32_s2 | dp_pc_jal16_s2 | dp_pc_jalr32_s2 | dp_pc_jalr16_s2 |
dp_rs1_addi32_s2 | dp_rs1_addi16_s2 | dp_rs1_addi16sp_s2 | dp_rs1_addi4spn_s2 | dp_rs1_add_s2 | dp_rs1_add16_s2);
wire [32:0] dp_add_b_s2 = (dp_imm_auipc_s2 | dp_p4_jal32_s2 | dp_p2_jal16_s2 | dp_p4_jalr32_s2 | dp_p2_jalr16_s2 |
dp_imm_addi32_s2 | dp_imm_addi16_s2 | dp_imm_addi16sp_s2 | dp_imm_addi4spn_s2 | dp_rs2_add_s2 | dp_rd_add16_s2);
wire [33:0] dp_add_s2 = (dp_add_a_s2_c2 | dp_mul_add_s2_ab_used_c2 | dp_mul_add_s2_ab_neg_used_c2) +
(dp_add_b_s2_c2 | dp_mul_add_s2_cd_used_c2 | dp_mul_add_s2_cd_sub_used_c2 | dp_mul_add_s2_cd_neg_used_c2);
wire [31:0] dp_slt_s2_a = dp_rs1_s2_c1;
wire [31:0] dp_slt_s2_b = (instr_s2_c1[5] == 1'b0) ? {{20{imm_11_0_s2_c1[11]}}, imm_11_0_s2_c1} : dp_rs2_s2_c1;
wire dp_slt_s2_lt_0 = dp_slt_s2_a[ 3: 0] < dp_slt_s2_b[ 3: 0];
wire dp_slt_s2_lt_1 = dp_slt_s2_a[ 7: 4] < dp_slt_s2_b[ 7: 4];
wire dp_slt_s2_lt_2 = dp_slt_s2_a[11: 8] < dp_slt_s2_b[11: 8];
wire dp_slt_s2_lt_3 = dp_slt_s2_a[15:12] < dp_slt_s2_b[15:12];
wire dp_slt_s2_lt_4 = dp_slt_s2_a[19:16] < dp_slt_s2_b[19:16];
wire dp_slt_s2_lt_5 = dp_slt_s2_a[23:20] < dp_slt_s2_b[23:20];
wire dp_slt_s2_lt_6 = dp_slt_s2_a[27:24] < dp_slt_s2_b[27:24];
wire dp_slt_s2_lt_7 = dp_slt_s2_a[31:28] < dp_slt_s2_b[31:28];
wire dp_slt_s2_eq_0 = dp_slt_s2_a[ 3: 0] == dp_slt_s2_b[ 3: 0];
wire dp_slt_s2_eq_1 = dp_slt_s2_a[ 7: 4] == dp_slt_s2_b[ 7: 4];
wire dp_slt_s2_eq_2 = dp_slt_s2_a[11: 8] == dp_slt_s2_b[11: 8];
wire dp_slt_s2_eq_3 = dp_slt_s2_a[15:12] == dp_slt_s2_b[15:12];
wire dp_slt_s2_eq_4 = dp_slt_s2_a[19:16] == dp_slt_s2_b[19:16];
wire dp_slt_s2_eq_5 = dp_slt_s2_a[23:20] == dp_slt_s2_b[23:20];
wire dp_slt_s2_eq_6 = dp_slt_s2_a[27:24] == dp_slt_s2_b[27:24];
wire dp_slt_s2_eq_7 = dp_slt_s2_a[31:28] == dp_slt_s2_b[31:28];
wire dp_slt_sel_s2 = ((instr_i_slti_s2_c1 & opcode_i_s2_eq13_c1) |
(instr_i_slt_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1) |
(instr_i_sltu_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1) |
(instr_i_sltiu_s2_c1 & opcode_i_s2_eq13_c1));
wire dp_slt_inv_s2 = ((instr_i_slti_s2_c1 & opcode_i_s2_eq13_c1 & !(dp_rs1_s2_c1[31] == imm_11_0_s2_c1[11])) |
(instr_i_slt_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1 & !(dp_rs1_s2_c1[31] == dp_rs2_s2_c1[11])));
wire dp_slt_s2_tmp = (dp_slt_s2_lt_7_c2 |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_lt_6_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_lt_5_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_eq_5_c2 & dp_slt_s2_lt_4_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_eq_5_c2 & dp_slt_s2_eq_4_c2 & dp_slt_s2_lt_3_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_eq_5_c2 & dp_slt_s2_eq_4_c2 & dp_slt_s2_eq_3_c2 & dp_slt_s2_lt_2_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_eq_5_c2 & dp_slt_s2_eq_4_c2 & dp_slt_s2_eq_3_c2 & dp_slt_s2_eq_2_c2 & dp_slt_s2_lt_1_c2) |
(dp_slt_s2_eq_7_c2 & dp_slt_s2_eq_6_c2 & dp_slt_s2_eq_5_c2 & dp_slt_s2_eq_4_c2 & dp_slt_s2_eq_3_c2 & dp_slt_s2_eq_2_c2 & dp_slt_s2_eq_1_c2 & dp_slt_s2_lt_0_c2));
wire dp_slt_s2 = dp_slt_sel_s2_c2 ? (dp_slt_inv_s2_c2 ? ~dp_slt_s2_tmp : dp_slt_s2_tmp) : 0;
wire [ 4:0] dp_shmul_a_in_s2 = dp_shamt_i_srli_s2 | dp_shamt_i_srai_s2 | dp_shamt_i_srl_s2 |
dp_shamt_i_sra_s2 |
dp_shamt_i_srli16_s2 | dp_shamt_i_srai16_s2;
wire [ 4:0] dp_shmul_32a_in_s2 = 32 - dp_shmul_a_in_s2;
wire [31:0] dp_shmul_arith_s2 = 32'hffffffff << dp_shmul_32a_in_s2_c2;
wire [4:0] dp_shmul_a_s2 = ((instr_i_slli_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq0_c1) |
(instr_i_sll_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1) |
instr_c_slli_s2_c1) ?
dp_rs2_s2_c1[4:0] :
(32 - dp_rs2_s2_c1[4:0]);
wire [31:0] dp_shmul_b_s2 = dp_rs1_s2_c2;
wire [63:0] dp_shmul_out_s2 = dp_shmul_b_s2 << dp_shmul_a_s2_c2[4:0];
wire noshift_s2 = ((instr_i_srli_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq0_c1) |
(instr_i_srai_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq20_c1) |
(instr_i_srl_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1) |
(instr_i_sra_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq20_c1) | instr_c_srli_s2_c1 | instr_c_srai_s2_c1) &
(dp_shmul_a_s2 == 0);
wire [31:0] dp_shmul_s2_srl = instr_i_srli_s2_c2 | instr_i_srl_s2_c2 | instr_c_srli_s2_c2 ? dp_shmul_out_s2[63:32] : 0;
wire [31:0] dp_shmul_s2_i_srai = instr_i_srai_s2_c2 ? (dp_shmul_b_s2[31] ? (dp_shmul_out_s2[63:32] | dp_shmul_arith_s2) : dp_shmul_out_s2[63:32]) : 0;
wire [31:0] dp_shmul_s2_sra = instr_i_sra_s2_c2 ? (dp_shmul_b_s2[31] ? (dp_shmul_out_s2[63:32] | dp_shmul_arith_s2) : dp_shmul_out_s2[63:32]) : 0;
wire [31:0] dp_shmul_s2_c_srai = instr_c_srai_s2_c2 ? (dp_shmul_b_s2[31] ? (dp_shmul_out_s2[63:32] | dp_shmul_arith_s2) : dp_shmul_out_s2[63:32]) : 0;
wire [31:0] dp_shmul_s2_sll = instr_i_slli_s2_c2 | instr_i_sll_s2_c2 | instr_c_slli_s2_c2 ? dp_shmul_out_s2[31: 0] : 0;
wire [31:0] dp_shmul_s2 = noshift_s2_c2 ? dp_shmul_out_s2[31: 0] :
(dp_shmul_s2_srl | dp_shmul_s2_i_srai | dp_shmul_s2_sra | dp_shmul_s2_c_srai | dp_shmul_s2_sll);
wire [31:0] dp_mul_a_s2_c1;
wire [31:0] dp_mul_b_s2_c1;
//always @ (posedge clk_c1) begin
assign dp_mul_a_s2_c1 = dp_rs1_s2;
assign dp_mul_b_s2_c1 = dp_rs2_s2;
//end
wire [31:0] dp_mul_ahbh_s2_c2;
wire [31:0] dp_mul_ahbl_s2_c2;
wire [31:0] dp_mul_albh_s2_c2;
wire [31:0] dp_mul_albl_s2_c2;
//always @ (posedge clk_c2) begin
assign dp_mul_ahbh_s2_c2 = dp_mul_a_s2_c1[31:16] * dp_mul_b_s2_c1[31:16];
assign dp_mul_ahbl_s2_c2 = dp_mul_a_s2_c1[31:16] * dp_mul_b_s2_c1[15: 0];
assign dp_mul_albh_s2_c2 = dp_mul_a_s2_c1[15: 0] * dp_mul_b_s2_c1[31:16];
assign dp_mul_albl_s2_c2 = dp_mul_a_s2_c1[15: 0] * dp_mul_b_s2_c1[15: 0];
//end
wire [31:0] dp_mul_alhblh_s2_c3;
wire [31:0] dp_mul_ahbh_s2_c3;
wire [31:0] dp_mul_ahbl_s2_c3;
wire [31:0] dp_mul_albh_s2_c3;
wire [31:0] dp_mul_albl_s2_c3;
//always @ (posedge clk_c3) begin
assign dp_mul_alhblh_s2_c3 = (!stalled_next & instr_m_mulx_s2_c2 & state_eq0_s2_c2) ? dp_mul_albl_s2_c2 :
(!stalled_next & instr_m_mulhx_s2_c2 & state_eq2_s2) ? dp_mul_ahbh_s2_c2 : 0;
assign dp_mul_ahbh_s2_c3 = dp_mul_ahbh_s2_c2;
assign dp_mul_ahbl_s2_c3 = dp_mul_ahbl_s2_c2;
assign dp_mul_albh_s2_c3 = dp_mul_albh_s2_c2;
assign dp_mul_albl_s2_c3 = dp_mul_albl_s2_c2;
//end
wire [16:0] dp_mul_add_s2_ab_def_p1 = dp_rs1_s2[15:0] + 1;
wire [16:0] dp_mul_add_s2_ab_def_p2 = dp_rs1_s2[15:0] + 2;
wire [16:0] dp_mul_add_s2_ab_def_hw_p1 = dp_rs1_s2[31:16] + 1;
wire [32:0] dp_mul_add_s2_ab = ((instr_m_mul_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1) | (mul_carry_s2_c1 == 0)) ? dp_rs1_s2_c1 :
((mul_carry_s2_c1 == 1) ?
(dp_mul_add_s2_ab_def_p1_c1[16] ?
{dp_mul_add_s2_ab_def_hw_p1_c1, dp_mul_add_s2_ab_def_p1_c1[15:0]} :
{1'b0, dp_rs1_s2_c1[31:16], dp_mul_add_s2_ab_def_p1_c1[15:0]}) :
(dp_mul_add_s2_ab_def_p2_c1[16] ?
{dp_mul_add_s2_ab_def_hw_p1_c1, dp_mul_add_s2_ab_def_p2_c1[15:0]} :
{1'b0, dp_rs1_s2_c1[31:16], dp_mul_add_s2_ab_def_p2_c1[15:0]}));
wire [16:0] dp_mul_add_s2_ab_neg_low = ~dp_mul_add_s2_ab[15:0] + 1;
wire [16:0] dp_mul_add_s2_ab_neg_high = ~dp_mul_add_s2_ab[32:16] + 1;
wire [32:0] dp_mul_add_s2_ab_neg = (dp_mul_add_s2_ab[15:0] == 16'h0000) ?
{dp_mul_add_s2_ab_neg_high, dp_mul_add_s2_ab_neg_low[15:0]} :
{~dp_mul_add_s2_ab[32:16], dp_mul_add_s2_ab_neg_low[15:0]};
wire [32:0] dp_mul_add_s2_ab_used = ((instr_m_mulx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & !sign_s2_c1) |
(instr_i_sub_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq20_c1) |
(funct6_c_s2_23_opcode_2_c1 & instr_c_sub_s2_c1)) ? dp_mul_add_s2_ab : 0;
wire [32:0] dp_mul_add_s2_ab_neg_used = (instr_m_mulx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & sign_s2_c1) ? dp_mul_add_s2_ab_neg : 0;
wire [16:0] dp_mul_add_s2_cd_def = dp_rs2_s2[15: 0] + dp_rs2_s2[31:16];
wire [32:0] dp_mul_add_s2_cd = state_eq1_s2_c1 ? {dp_mul_add_s2_cd_def_c1, 16'h00000000} :
{16'h00000000, dp_mul_add_s2_cd_def_c1};
wire [16:0] dp_mul_add_s2_cd_def_neg = ~dp_mul_add_s2_cd_def_c1 + 1;
wire [32:0] dp_mul_add_s2_cd_neg = state_eq1_s2_c1 ? {dp_mul_add_s2_cd_def_neg, 16'h00000000} :
{{15{dp_mul_add_s2_cd_def_neg[16]}}, dp_mul_add_s2_cd_def_neg};
wire [32:0] dp_mul_add_s2_cd_used = (instr_m_mulx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & !sign_s2_c1) ? dp_mul_add_s2_cd : 0;
wire [32:0] dp_mul_add_s2_cd_sub_used = ((instr_i_sub_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq20_c1) |
(funct6_c_s2_23_opcode_2_c1 & instr_c_sub_s2_c1)) ?
dp_rs2_2c_s2 : 0;
wire [32:0] dp_mul_add_s2_cd_neg_used = ((instr_m_mul_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & sign_s2_c1) |
(instr_m_mulh_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & sign_s2_c1) |
(instr_m_mulhsu_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & sign_s2_c1)) ?
dp_mul_add_s2_cd_neg : 0;
assign mul_carry_s2_next = (instr_m_mulhx_s2_c3 & state_eq1_s2_c3) ?
((dp_add_s2_c3[33:32] < 3) ? dp_add_s2_c3[33:32] : {1'b0, dp_add_s2_c3[32]}) :
mul_carry_s2_c3;
wire [3:0] dp_rs1_2c_0_s2 = ~dp_rs1_s2_c1[ 3: 0] + 1;
wire [3:0] dp_rs1_2c_1_s2 = ~dp_rs1_s2_c1[ 7: 4] + 1;
wire [3:0] dp_rs1_2c_2_s2 = ~dp_rs1_s2_c1[11: 8] + 1;
wire [3:0] dp_rs1_2c_3_s2 = ~dp_rs1_s2_c1[15:12] + 1;
wire [3:0] dp_rs1_2c_4_s2 = ~dp_rs1_s2_c1[19:16] + 1;
wire [3:0] dp_rs1_2c_5_s2 = ~dp_rs1_s2_c1[23:20] + 1;
wire [3:0] dp_rs1_2c_6_s2 = ~dp_rs1_s2_c1[27:24] + 1;
wire [3:0] dp_rs1_2c_7_s2 = ~dp_rs1_s2_c1[31:28] + 1;
wire [3:0] dp_rs2_2c_0_s2 = ~dp_rs2_s2_c1[ 3: 0] + 1;
wire [3:0] dp_rs2_2c_1_s2 = ~dp_rs2_s2_c1[ 7: 4] + 1;
wire [3:0] dp_rs2_2c_2_s2 = ~dp_rs2_s2_c1[11: 8] + 1;
wire [3:0] dp_rs2_2c_3_s2 = ~dp_rs2_s2_c1[15:12] + 1;
wire [3:0] dp_rs2_2c_4_s2 = ~dp_rs2_s2_c1[19:16] + 1;
wire [3:0] dp_rs2_2c_5_s2 = ~dp_rs2_s2_c1[23:20] + 1;
wire [3:0] dp_rs2_2c_6_s2 = ~dp_rs2_s2_c1[27:24] + 1;
wire [4:0] dp_rs2_2c_7_s2 = ~dp_rs2_s2_c1[31:28] + 1;
wire dp_rs1_0_0_s2;
wire dp_rs1_1_0_s2;
wire dp_rs1_2_0_s2;
wire dp_rs1_3_0_s2;
wire dp_rs1_4_0_s2;
wire dp_rs1_5_0_s2;
wire dp_rs1_6_0_s2;
wire dp_rs2_0_0_s2;
wire dp_rs2_1_0_s2;
wire dp_rs2_2_0_s2;
wire dp_rs2_3_0_s2;
wire dp_rs2_4_0_s2;
wire dp_rs2_5_0_s2;
wire dp_rs2_6_0_s2;
//always @ (posedge clk_c1) begin
assign dp_rs1_0_0_s2 = dp_rs1_s2[ 3: 0] == 0;
assign dp_rs1_1_0_s2 = dp_rs1_s2[ 7: 4] == 0;
assign dp_rs1_2_0_s2 = dp_rs1_s2[11: 8] == 0;
assign dp_rs1_3_0_s2 = dp_rs1_s2[15:12] == 0;
assign dp_rs1_4_0_s2 = dp_rs1_s2[19:16] == 0;
assign dp_rs1_5_0_s2 = dp_rs1_s2[23:20] == 0;
assign dp_rs1_6_0_s2 = dp_rs1_s2[27:24] == 0;
assign dp_rs2_0_0_s2 = dp_rs2_s2[ 3: 0] == 0;
assign dp_rs2_1_0_s2 = dp_rs2_s2[ 7: 4] == 0;
assign dp_rs2_2_0_s2 = dp_rs2_s2[11: 8] == 0;
assign dp_rs2_3_0_s2 = dp_rs2_s2[15:12] == 0;
assign dp_rs2_4_0_s2 = dp_rs2_s2[19:16] == 0;
assign dp_rs2_5_0_s2 = dp_rs2_s2[23:20] == 0;
assign dp_rs2_6_0_s2 = dp_rs2_s2[27:24] == 0;
//end
wire [31:0] dp_rs1_2c_s2;
wire [31:0] dp_rs12_2c_s2;
wire [32:0] dp_rs2_2c_s2;
assign dp_rs1_2c_s2[ 3: 0] = dp_rs1_2c_0_s2;
assign dp_rs1_2c_s2[ 7: 4] = dp_rs1_0_0_s2 ? dp_rs1_2c_1_s2 : ~dp_rs1_s2_c1[ 7: 4];
assign dp_rs1_2c_s2[11: 8] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 ? dp_rs1_2c_2_s2 : ~dp_rs1_s2_c1[11: 8];
assign dp_rs1_2c_s2[15:12] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 & dp_rs1_2_0_s2 ? dp_rs1_2c_3_s2 : ~dp_rs1_s2_c1[15:12];
assign dp_rs1_2c_s2[19:16] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 & dp_rs1_2_0_s2 & dp_rs1_3_0_s2 ? dp_rs1_2c_4_s2 : ~dp_rs1_s2_c1[19:16];
assign dp_rs1_2c_s2[23:20] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 & dp_rs1_2_0_s2 & dp_rs1_3_0_s2 & dp_rs1_4_0_s2 ? dp_rs1_2c_5_s2 : ~dp_rs1_s2_c1[23:20];
assign dp_rs1_2c_s2[27:24] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 & dp_rs1_2_0_s2 & dp_rs1_3_0_s2 & dp_rs1_4_0_s2 & dp_rs1_5_0_s2 ? dp_rs1_2c_6_s2 : ~dp_rs1_s2_c1[27:24];
assign dp_rs1_2c_s2[31:28] = dp_rs1_0_0_s2 & dp_rs1_1_0_s2 & dp_rs1_2_0_s2 & dp_rs1_3_0_s2 & dp_rs1_4_0_s2 & dp_rs1_5_0_s2 & dp_rs1_6_0_s2 ? dp_rs1_2c_7_s2 : ~dp_rs1_s2_c1[31:28];
assign dp_rs2_2c_s2[ 3: 0] = dp_rs2_2c_0_s2;
assign dp_rs2_2c_s2[ 7: 4] = dp_rs2_0_0_s2 ? dp_rs2_2c_1_s2 : ~dp_rs2_s2_c1[ 7: 4];
assign dp_rs2_2c_s2[11: 8] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 ? dp_rs2_2c_2_s2 : ~dp_rs2_s2_c1[11: 8];
assign dp_rs2_2c_s2[15:12] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 & dp_rs2_2_0_s2 ? dp_rs2_2c_3_s2 : ~dp_rs2_s2_c1[15:12];
assign dp_rs2_2c_s2[19:16] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 & dp_rs2_2_0_s2 & dp_rs2_3_0_s2 ? dp_rs2_2c_4_s2 : ~dp_rs2_s2_c1[19:16];
assign dp_rs2_2c_s2[23:20] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 & dp_rs2_2_0_s2 & dp_rs2_3_0_s2 & dp_rs2_4_0_s2 ? dp_rs2_2c_5_s2 : ~dp_rs2_s2_c1[23:20];
assign dp_rs2_2c_s2[27:24] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 & dp_rs2_2_0_s2 & dp_rs2_3_0_s2 & dp_rs2_4_0_s2 & dp_rs2_5_0_s2 ? dp_rs2_2c_6_s2 : ~dp_rs2_s2_c1[27:24];
assign dp_rs2_2c_s2[32:28] = dp_rs2_0_0_s2 & dp_rs2_1_0_s2 & dp_rs2_2_0_s2 & dp_rs2_3_0_s2 & dp_rs2_4_0_s2 & dp_rs2_5_0_s2 & dp_rs2_6_0_s2 ? dp_rs2_2c_7_s2 : {1'b1, ~dp_rs2_s2_c1[31:28]};
wire [31:0] dp_neg_s2 = dp_rs1_2c_s2;
wire [31:0] dp_comb_s2 = dp_li16_s2 | dp_lui16_s2 | dp_mv16_s2 | dp_and16_s2 | dp_or16_s2 | dp_xor16_s2 | dp_andi16_s2 |
dp_lui_s2 | dp_xori_s2 | dp_ori_s2 | dp_andi_s2 | dp_xor_s2 |
dp_or_s2 | dp_and_s2;
wire [31:0] dp_out_s2_early = dp_comb_s2_c2 | {31'h00000000, dp_slt_s2} | dp_divrem_s2_c2;
wire [31:0] dp_out_s2 = dp_out_s2_early_c3 | dp_add_s2_c3[31:0] | dp_shmul_s2_c3;
wire dp_wr_s2_a = instr_i_lui_s2_c1 | instr_i_auipc_s2_c1 | instr_i_jal_s2_c1 | instr_i_jalr_s2_c1 |
opcode_i_s2_eq13_c1 |
(opcode_i_s2_eq33_c1 & (funct7_i_s2_eq0_c1 | funct7_i_s2_eq20_c1)) |
instr_c_jal_s2_c1 | (instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1) | instr_c_li_s2_c1 |
(instr_c_lui_s2_c1 & !instr_s2_11_7_eq_02_c1) |
instr_c_addi_s2_c1 |
(instr_c_addi16sp_s2_c1 & instr_s2_11_7_eq_02_c1) | instr_c_addi4spn_s2_c1 | (instr_c_mv_s2_c1 & !rs2_c_s2_eq0_c1) |
(instr_c_add_s2_c1 & !rs2_c_s2_eq0_c1) | instr_c_andi_s2_c1 |
(funct6_c_s2_23_opcode_2_c1 /* & (instr_c_and_s2_c1 | instr_c_or_s2_c1 | instr_c_xor_s2_c1 | instr_c_sub_s2_c1) */) |
instr_c_slli_s2_c1 | instr_c_srli_s2_c1 | instr_c_srai_s2_c1;
wire dp_wr_s2_b = dp_wr_s2_a_c2 |
instr_m_mul_s2_c2 |
(instr_m_mulhx_s2_c2 & state_eq3_s2_c2) |
(instr_m_divrem_s2_c2 & state_eq32_s2_c2);
wire dp_wr_s2 = dp_wr_s2_b_c3;
////////////////////////////////////////////////////////////
//
// RegFile
//
////////////////////////////////////////////////////////////
//
// rs1
//
wire rs1_def_sel_s1 = instr_s1_c1[1:0] == 2'b11;
wire [4:0] rs1_def_s1 = rs1_def_sel_s1 ? rs1_i_s1 : 0;
wire rs1_c_add_sel_s1 = instr_c_add_s1_c1 & !rs2_c_s1_eq0_c1;
wire [4:0] rs1_c_add_s1 = rs1_c_add_sel_s1 ? rs2_c_s1 : 0;
wire rs1_c_sp_sel_s1 = instr_c_addi4spn_s1_c1 | instr_c_swsp_s1_c1 | instr_c_lwsp_s1_c1;
wire [4:0] rs1_c_sp_s1 = rs1_c_sp_sel_s1 ? 2 : 0;
wire [4:0] rs1_c_1_s1 = !(rs1_def_sel_s1 | rs1_c_add_sel_s1 | rs1_c_sp_sel_s1 | rs1_c_def_sel_s1) ? {2'b01, rs1s_c_s1} : 0;
wire rs1_c_def_sel_s1 = (instr_c_addi_s1_c1 |
(instr_c_addi16sp_s1_c1 & instr_s1_11_7_eq_02_c1) |
instr_c_slli_s1_c1 |
(instr_c_jr_s1_c1 & rs2_c_s1_eq0_c1) |
(instr_c_jalr_s1_c1 & rs2_c_s1_eq0_c1));
wire [4:0] rs1_c_def_s1 = rs1_c_def_sel_s1 ? rs1_c_s1 : 0;
wire [4:0] rs1_s1 = rs1_def_s1 | rs1_c_add_s1 | rs1_c_sp_s1 | rs1_c_1_s1 | rs1_c_def_s1;
//
// rs2
//
wire rs2_def_sel_s1 = (instr_s1[1:0] == 2'b11) & !(instr_s1[6:2] == 5'h04);
wire [4:0] rs2_def_s1 = rs2_def_sel_s1_c1 ? rs2_i_s1 : 0;
wire [4:0] rs2_c_add_s1 = instr_c_add_s1_c1 & !rs2_c_s1_eq0_c1 ? rd_c_s1 : 0;
wire [4:0] rs2_c_mv_s1 = ((instr_c_mv_s1_c1 & !rs2_c_s1_eq0_c1) | instr_c_swsp_s1_c1) ? rs2_c_s1 : 0;
wire [4:0] rs2_c_sw_s1 = (instr_c_sw_s1_c1 | funct6_c_s1_23_opcode_2_c1) ? {2'b01, rs2s_c_s1} : 0;
wire [4:0] rs2_s1 = rs2_c_add_s1 | rs2_c_mv_s1 | rs2_c_sw_s1 | rs2_def_s1;
wire [4:0] rd_s2_i = instr_s2_c1[1:0] == 2'b11 ? rd_i_s2_c1 : 0;
wire [4:0] rd_s2_j = instr_c_jal_s2_c1 | (instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1) ? 1 : 0;
wire [4:0] rd_s2_c_1 = instr_c_lw_s2_c1 | instr_c_addi4spn_s2_c1 ? {2'b01, rds42_c_s2_c1} : 0;
wire [4:0] rd_s2_c_2 = instr_c_srli_s2_c1 | instr_c_srai_s2_c1 | instr_c_andi_s2_c1 |
funct6_c_s2_23_opcode_2_c1 ? {2'b01, rds97_c_s2_c1} : 0;
wire [4:0] rd_s2 = !((instr_s2_c1[1:0] == 2'b11) |
(instr_c_jal_s2_c1 | (instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1)) |
(instr_c_lw_s2_c1 | instr_c_addi4spn_s2_c1) |
(instr_c_srli_s2_c1 | instr_c_srai_s2_c1 | instr_c_andi_s2_c1 |
funct6_c_s2_23_opcode_2_c1)) ? rd_c_s2_c1 :
(rd_s2_i | rd_s2_j | rd_s2_c_1 | rd_s2_c_2);
wire rs2_c_s2_eq0_c3 = (cubev_reg_dout1[6:2] == 0);
wire funct6_c_s2_23_opcode_2_c3 = //(opcode_c_s2 == 2'b01) & (funct6_c_s2 == 6'b100011);
(cubev_reg_dout1[1:0] == 2'b01) & (cubev_reg_dout1[15:10] == 6'b100011);
wire [4:0] rd_c_s2_c3 = cubev_reg_dout1[11:7];
wire [4:0] rd_i_s2_c3 = cubev_reg_dout1[11:7];
wire [4:0] rd_s2_i_c3 = cubev_reg_dout1[1:0] == 2'b11 ? rd_i_s2_c3 : 0;
wire [4:0] rd_s2_j_c3 = instr_c_jal_s2_c1 | (instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c3) ? 1 : 0;
wire [2:0] rds42_c_s2_c3 = cubev_reg_dout1[4:2];
wire [4:0] rd_s2_c_1_c3 = instr_c_lw_s2_c1 | instr_c_addi4spn_s2_c1 ? {2'b01, rds42_c_s2_c3} : 0;
wire [2:0] rds97_c_s2_c3 = cubev_reg_dout1[9:7];
wire [4:0] rd_s2_c_2_c3 = instr_c_srli_s2_c1 | instr_c_srai_s2_c1 | instr_c_andi_s2_c1 |
funct6_c_s2_23_opcode_2_c3 ? {2'b01, rds97_c_s2_c3} : 0;
wire [4:0] rd_s2_c3 = !((/*instr_s2_c1*/ cubev_reg_dout1[1:0] == 2'b11) |
(instr_c_jal_s2_c1 | (instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c3)) |
(instr_c_lw_s2_c1 | instr_c_addi4spn_s2_c1) |
(instr_c_srli_s2_c1 | instr_c_srai_s2_c1 | instr_c_andi_s2_c1 |
funct6_c_s2_23_opcode_2_c3)) ? rd_c_s2_c3 :
(rd_s2_i_c3 | rd_s2_j_c3 | rd_s2_c_1_c3 | rd_s2_c_2_c3);
wire rf1_wea_s2 = (pc_set_int/*[0] & data_set[0]*/) |
((pvalid_c3 == 2) & //thread_pipe_valid/*[0]*/ &
(dp_wr_s2 |
instr_i_load_s2_c3 |
instr_c_lw_s2_c3 |
instr_c_lwsp_s2_c3));
//(instr_load_s2 & !stalled_next_c3)));
wire [4:0] rf1_addra_s2 = (pc_set_int/*[0] & data_set[0]*/) ? 5'h0a : rd_s2_c3;
wire [31:0] rf1_dina_s2 = pc_set_int ? {16'h0000, pc_set_data_int[29:14]} : //dbus_rd_i_data :
(dp_wr_s2) ? dp_out_s2 : dp_load_s2;
wire [4:0] rf1_addrb_s1 = mulh_access_0 ? instr_s2_c1[19:15] : rs1_s1;
wire [31:0] rf1_doutb_s1;
wire rf2_wea_s2 = (pc_set_int/*[0] & data_set[0]*/) |
((pvalid_c3 == 2) & //thread_pipe_valid/*[0]*/ &
(instr_m_divrem_s2_c3 |
dp_wr_s2 |
instr_i_load_s2_c3 |
instr_c_lw_s2_c3 |
instr_c_lwsp_s2_c3));
//(instr_load_s2 & !stalled_next_c3)));
wire mulh_access_0 = instr_m_mulhx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1 & (cubev_reg_dout5[8:3] == 1); //state_eq1_s2_c1;
wire divrem_access_0 = instr_m_divrem_s2_c3 & !(cubev_reg_dout5[8:3] == 32); //state_eq32_s2_c3;
wire divrem_access_0_d1_next = divrem_access_0 & !(cubev_reg_dout5[8:3] == 31); //state_eq31_s2_c3);
wire [4:0] rf2_addra_s2 = (pc_set_int/*[0] & data_set[0]*/) ? 5'h0a : divrem_access_0 ? 0 : rd_s2_c3;
wire [31:0] rf2_dina_s2 = pc_set_int ? {16'h0000, pc_set_data_int[29:14]} : //dbus_rd_i_data :
(divrem_access_0) ? dp_divrem_rfin_s2_c3 :
(dp_wr_s2) ? dp_out_s2 : dp_load_s2;
wire [4:0] rf2_addrb_s1 = divrem_access_0_d1 ? 0 :
mulh_access_0 ? instr_s2_c1[24:20] : rs2_s1;
wire [31:0] rf2_doutb_s1;
/*
wire [31:0] rf1_doutb_s1_dummy;
wire [31:0] rf2_doutb_s1_dummy;
RF_D16 RF1it (.clka(clk),
.rstn(rstn),
.wea(rf1_wea_s2 & !stalled_by_ext),
.addra({tidwr, rf1_addra_s2}),
.dina(rf1_dina_s2),
.douta(),
.clkb(~clk_c2),
.addrb({tidrd2, rf1_addrb_s1}),
.doutb(rf1_doutb_s1_dummy));
RF_D16 RF2it (.clka(clk),
.rstn(rstn),
.wea(rf2_wea_s2 & !stalled_by_ext),
.addra({tidwr, rf2_addra_s2}),
.dina(rf2_dina_s2),
.douta(),
.clkb(~clk_c2),
.addrb({tidrd2, rf2_addrb_s1}),
.doutb(rf2_doutb_s1_dummy));
*/
assign cubev_rf1_we = ~rf1_wea_s2;
assign cubev_rf1_wr_add = rf1_addra_s2;
assign cubev_rf1_din = rf1_dina_s2;
assign cubev_rf1_rd_add = rf1_addrb_s0; //rf1_addrb_s1;
assign rf1_doutb_s1 = cubev_rf1_dout;
assign cubev_rf2_we = ~rf2_wea_s2;
assign cubev_rf2_wr_add = rf2_addra_s2;
assign cubev_rf2_din = rf2_dina_s2;
assign cubev_rf2_rd_add = rf2_addrb_s0; //rf2_addrb_s1;
assign rf2_doutb_s1 = cubev_rf2_dout;
wire rf1_addrb_s1_zero = /* cubev_reg_dout5[20]*/ (rf1_addrb_s1 == 0) & (state_s2_c1 == 0);
wire [31:0] dp_rs1_s1 = rf1_addrb_s1_zero_c2 ? 0 : rf1_doutb_s1;
wire rf2_addrb_s1_zero = /* cubev_reg_dout5[21]; */ rf2_addrb_s1 == 0;
wire [31:0] dp_rs2_s1 = rf2_addrb_s1_zero_c2 ? 0 : rf2_doutb_s1;
wire [7:0] dp_rs1_2c_0_s1_c3;
wire [7:0] dp_rs1_2c_1_s1_c3;
wire [7:0] dp_rs1_2c_2_s1_c3;
wire [7:0] dp_rs1_2c_3_s1_c3;
wire [7:0] dp_rs2_2c_0_s1_c3;
wire [7:0] dp_rs2_2c_1_s1_c3;
wire [7:0] dp_rs2_2c_2_s1_c3;
wire [7:0] dp_rs2_2c_3_s1_c3;
//always @ (posedge clk_c3) begin
assign dp_rs1_2c_0_s1_c3 = ~dp_rs1_s1[ 7: 0] + 1;
assign dp_rs1_2c_1_s1_c3 = ~dp_rs1_s1[15: 8] + 1;
assign dp_rs1_2c_2_s1_c3 = ~dp_rs1_s1[23:16] + 1;
assign dp_rs1_2c_3_s1_c3 = ~dp_rs1_s1[31:24] + 1;
assign dp_rs2_2c_0_s1_c3 = ~dp_rs2_s1[ 7: 0] + 1;
assign dp_rs2_2c_1_s1_c3 = ~dp_rs2_s1[15: 8] + 1;
assign dp_rs2_2c_2_s1_c3 = ~dp_rs2_s1[23:16] + 1;
assign dp_rs2_2c_3_s1_c3 = ~dp_rs2_s1[31:24] + 1;
//end
wire [31:0] dp_rs1_2c_s1;
wire [31:0] dp_rs2_2c_s1;
wire dp_rs1_0_0_c3;
wire dp_rs1_1_0_c3;
wire dp_rs1_2_0_c3;
wire dp_rs2_0_0_c3;
wire dp_rs2_1_0_c3;
wire dp_rs2_2_0_c3;
//always @ (posedge clk_c3) begin
assign dp_rs1_0_0_c3 = dp_rs1_s1[ 7: 0] == 0;
assign dp_rs1_1_0_c3 = dp_rs1_s1[15: 8] == 0;
assign dp_rs1_2_0_c3 = dp_rs1_s1[23:16] == 0;
assign dp_rs2_0_0_c3 = dp_rs2_s1[ 7: 0] == 0;
assign dp_rs2_1_0_c3 = dp_rs2_s1[15: 8] == 0;
assign dp_rs2_2_0_c3 = dp_rs2_s1[23:16] == 0;
//end
assign dp_rs1_2c_s1[ 7: 0] = dp_rs1_2c_0_s1_c3;
assign dp_rs1_2c_s1[15: 8] = dp_rs1_0_0_c3 ? dp_rs1_2c_1_s1_c3 : ~dp_rs1_s1_c3[15: 8];
assign dp_rs1_2c_s1[23:16] = dp_rs1_0_0_c3 & dp_rs1_1_0_c3 ? dp_rs1_2c_2_s1_c3 : ~dp_rs1_s1_c3[23:16];
assign dp_rs1_2c_s1[31:24] = dp_rs1_0_0_c3 & dp_rs1_1_0_c3 & dp_rs1_2_0_c3 ? dp_rs1_2c_3_s1_c3 : ~dp_rs1_s1_c3[31:24];
assign dp_rs2_2c_s1[ 7: 0] = dp_rs2_2c_0_s1_c3;
assign dp_rs2_2c_s1[15: 8] = dp_rs2_0_0_c3 ? dp_rs2_2c_1_s1_c3 : ~dp_rs2_s1_c3[15: 8];
assign dp_rs2_2c_s1[23:16] = dp_rs2_0_0_c3 & dp_rs2_1_0_c3 ? dp_rs2_2c_2_s1_c3 : ~dp_rs2_s1_c3[23:16];
assign dp_rs2_2c_s1[31:24] = dp_rs2_0_0_c3 & dp_rs2_1_0_c3 & dp_rs2_2_0_c3 ? dp_rs2_2c_3_s1_c3 : ~dp_rs2_s1_c3[31:24];
wire [31:0] dp_rs1_abs_s1 = dp_rs1_s1_c3[31] ? dp_rs1_2c_s1 : dp_rs1_s1_c3;
wire [31:0] dp_rs2_abs_s1 = dp_rs2_s1_c3[31] ? dp_rs2_2c_s1 : dp_rs2_s1_c3;
////////////////////////////////////////////////////////////
//
// PC
//
////////////////////////////////////////////////////////////
wire [31:0] pc_jal_s2 = instr_i_jal_s2_c1 ? {{11{imm_20_1_s2_c1[19]}}, imm_20_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_c_j_s2 = instr_c_j_s2_c1 ? {{19{imm_11_10_9_8_7_6_5_4_3_1_s2_c1[10]}}, imm_11_10_9_8_7_6_5_4_3_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_c_jal_s2 = instr_c_jal_s2_c1 ? {{19{imm_11_10_9_8_7_6_5_4_3_1_s2_c1[10]}}, imm_11_10_9_8_7_6_5_4_3_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_c_jr_s2 = instr_c_jr_s2_c1 & rs2_c_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire [31:0] pc_c_jalr_s2 = instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1 ? dp_rs1_s2_c1 : 0;
wire dp_eq_0_s2 = dp_rs1_s2[ 3: 0] == dp_rs2_s2[ 3: 0];
wire dp_eq_1_s2 = dp_rs1_s2[ 7: 4] == dp_rs2_s2[ 7: 4];
wire dp_eq_2_s2 = dp_rs1_s2[11: 8] == dp_rs2_s2[11: 8];
wire dp_eq_3_s2 = dp_rs1_s2[15:12] == dp_rs2_s2[15:12];
wire dp_eq_4_s2 = dp_rs1_s2[19:16] == dp_rs2_s2[19:16];
wire dp_eq_5_s2 = dp_rs1_s2[23:20] == dp_rs2_s2[23:20];
wire dp_eq_6_s2 = dp_rs1_s2[27:24] == dp_rs2_s2[27:24];
wire dp_eq_7_s2 = dp_rs1_s2[31:28] == dp_rs2_s2[31:28];
wire beq_s2 = dp_eq_0_s2_c1 & dp_eq_1_s2_c1 & dp_eq_2_s2_c1 & dp_eq_3_s2_c1 &
dp_eq_4_s2_c1 & dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1;
wire blt_s2 = (~dp_rs1_s2_c1[31] & dp_rs2_s2_c1[31]) ? 1'b0 : // + !< -
( dp_rs1_s2_c1[31] & ~dp_rs2_s2_c1[31]) ? 1'b1 : // - < +
bltu_s2;
wire dp_lt_0_s2 = dp_rs1_s2[ 3: 0] < dp_rs2_s2[ 3: 0];
wire dp_lt_1_s2 = dp_rs1_s2[ 7: 4] < dp_rs2_s2[ 7: 4];
wire dp_lt_2_s2 = dp_rs1_s2[11: 8] < dp_rs2_s2[11: 8];
wire dp_lt_3_s2 = dp_rs1_s2[15:12] < dp_rs2_s2[15:12];
wire dp_lt_4_s2 = dp_rs1_s2[19:16] < dp_rs2_s2[19:16];
wire dp_lt_5_s2 = dp_rs1_s2[23:20] < dp_rs2_s2[23:20];
wire dp_lt_6_s2 = dp_rs1_s2[27:24] < dp_rs2_s2[27:24];
wire dp_lt_7_s2 = dp_rs1_s2[31:28] < dp_rs2_s2[31:28];
wire bltu_s2 = dp_lt_7_s2_c1 |
(dp_eq_7_s2_c1 & dp_lt_6_s2_c1) |
(dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_5_s2_c1) |
(dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_4_s2_c1) |
(dp_eq_4_s2_c1 & dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_3_s2_c1) |
(dp_eq_3_s2_c1 & dp_eq_4_s2_c1 & dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_2_s2_c1) |
(dp_eq_2_s2_c1 & dp_eq_3_s2_c1 & dp_eq_4_s2_c1 & dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_1_s2_c1) |
(dp_eq_1_s2_c1 & dp_eq_2_s2_c1 & dp_eq_3_s2_c1 & dp_eq_4_s2_c1 & dp_eq_5_s2_c1 & dp_eq_6_s2_c1 & dp_eq_7_s2_c1 & dp_lt_0_s2_c1);
wire [31:0] pc_beq_s2 = instr_i_beq_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_beqz_s2 = instr_c_beqz_s2_c1 ? {{23{imm_8_7_6_5_4_3_2_1_s2_c1[7]}}, imm_8_7_6_5_4_3_2_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_bne_s2 = instr_i_bne_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_bnez_s2 = instr_c_bnez_s2_c1 ? {{23{imm_8_7_6_5_4_3_2_1_s2_c1[7]}}, imm_8_7_6_5_4_3_2_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_blt_s2 = instr_i_blt_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_bge_s2 = instr_i_bge_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_bltu_s2 = instr_i_bltu_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire [31:0] pc_bgeu_s2 = instr_i_bgeu_s2_c1 & opcode_i_s2_eq63_c1 ? {{19{imm_12_1_s2_c1[11]}}, imm_12_1_s2_c1, 1'b0} : 0;
wire branch_s2 = (instr_i_beq_s2_c1 & opcode_i_s2_eq63_c1 & beq_s2) |
(instr_c_beqz_s2_c1 & beq_s2) |
(instr_i_bne_s2_c1 & opcode_i_s2_eq63_c1 & !beq_s2) |
(instr_c_bnez_s2_c1 & !beq_s2) |
(instr_i_blt_s2_c1 & opcode_i_s2_eq63_c1 & blt_s2) |
(instr_i_bge_s2_c1 & opcode_i_s2_eq63_c1 & (beq_s2 | !blt_s2)) |
(instr_i_bltu_s2_c1 & opcode_i_s2_eq63_c1 & bltu_s2) |
(instr_i_bgeu_s2_c1 & opcode_i_s2_eq63_c1 & (!bltu_s2 | beq_s2));
wire jump_s2 = instr_i_jal_s2_c1 | instr_i_jalr_s2_c1 | instr_c_j_s2_c1 | instr_c_jal_s2_c1 |
(instr_c_jr_s2_c1 & rs2_c_s2_eq0_c1) |
(instr_c_jalr_s2_c1 & rs2_c_s2_eq0_c1);
wire jump_or_branch_s2 = branch_s2_c3 | jump_s2_c3;
wire [23:0] pc_s2_c2_late = {1'b0, cubev_reg_dout4_late[31:19]};
wire [23:0] pc_step_high_p1_s2 = pc_s2_c2_late[23:8] + 1;
wire [8:0] pc_step_low_p2_s2 = pc_s2_c2_late[7:0] + 2;
wire [8:0] pc_step_low_p4_s2 = pc_s2_c2_late[7:0] + 4;
wire [31:0] pc_step_p4_s2 = pc_step_low_p4_s2[8] ? {pc_step_high_p1_s2, pc_step_low_p4_s2[7:0]} : {pc_s2_c2_late[24:8], pc_step_low_p4_s2[7:0]};
wire [31:0] pc_step_p2_s2 = pc_step_low_p2_s2[8] ? {pc_step_high_p1_s2, pc_step_low_p2_s2[7:0]} : {pc_s2_c2_late[24:8], pc_step_low_p2_s2[7:0]};
wire [31:0] pc_step_s2 = instr[1:0] == 2'b11 ?
pc_step_p4_s2 :
pc_step_p2_s2;
wire [31:0] pc_jump_or_branch_dp_s2 = dp_rs1_jalr32_s2 | pc_beq_s2 | pc_bne_s2 | pc_bnez_s2 | pc_blt_s2 | pc_bge_s2 | pc_bltu_s2 | pc_bgeu_s2 | pc_beqz_s2 |
pc_jal_s2 |
pc_c_j_s2 | pc_c_jr_s2 | pc_c_jal_s2 | pc_c_jalr_s2;
wire [31:0] pc_dp_a_s2 = ((branch_s2_c2 | jump_s2_c2) ? pc_jump_or_branch_dp_s2_c2 : 0);
wire [31:0] pc_dp_b_s2 = (!instr_i_jalr_s2_c2 &
((!(branch_s2_c2 | jump_s2_c2)) |
instr_i_beq_s2_c2 | instr_i_bne_s2_c2 | instr_c_bnez_s2_c2 |
instr_i_blt_s2_c2 | instr_i_bge_s2_c2 | instr_i_bltu_s2_c2 | instr_i_bgeu_s2_c2 | instr_c_beqz_s2_c2 |
instr_i_jal_s2_c2 |
instr_c_j_s2_c2 | instr_c_jal_s2_c2)) ? pc_s2_c2 : dp_imm_jalr32_s2;
wire [31:0] pc_clear_s2 = (pcadv1 & pcadv2) ? 8 :
(!pcadv1 & !pcadv2) ? 4 : 6;
wire [31:0] pc_dp_c_s2 = !(branch_s2_c2 | instr_i_jal_s2_c2 | instr_c_j_s2_c2 | instr_c_jal_s2_c2) ? 0 : pc_clear_s2_c2;
wire [31:0] pc_dp_d_s2 = (pc_dp_a_s2 + pc_dp_b_s2 - pc_dp_c_s2);
wire [31:0] pc_dp_s2 = (!instr_i_jalr_s2_c3 & !jump_or_branch_s2) ? (pc_step_s2_c3) :
pc_dp_d_s2_c3;
wire pc_stalled_s2 = stalled_next_c3 |
(instr_m_divrem_s2_c3 & !state_eq32_s2_c3) |
(instr_m_mul_s2_c3 & state_eq0_s2_c3) |
(instr_m_mulhx_s2_c3 & state_lt3_s2_c3);
wire [31:0] pc_s2_next_stalled_s2 = pc_stalled_s2 ? cubev_reg_dout4_late[31:19] : 0; //pc_s2_c3 : 0;
wire [31:0] pc_s2_next_continue_s2 = !pc_stalled_s2 ? pc_dp_s2 : 0;
assign pc_s2_next = pc_s2_next_stalled_s2 |
pc_s2_next_continue_s2;
wire [31:0] pc_cleared_s2 = pc_s2_c1 - pc_clear_s2_c1;
////////////////////////////////////////////////////////////
//
// Datapath Memory Handling (S1)
//
////////////////////////////////////////////////////////////
wire [4:0] imm_6_5_3_2_s1_c0 = {instr_s1[5], instr_s1[12:10], instr_s1[6]};
wire [5:0] offset_7_6_5_4_2_s1_c0 = {instr_s1[3:2], instr_s1[12], instr_s1[6:4]};
wire [11:0] imm_11_5_4_0_s1_c0 = {instr_s1[31:25], instr_s1[11:7]};
wire [5:0] offset_7_6_5_2_s1_c0 = {instr_s1[8:7], instr_s1[12:9]};
/*
wire [31:0] dbus_rdwr_offset_load_s1 = instr_i_load_s1_c1_next ? {{20{imm_11_0_s1[11]}}, imm_11_0_s1} : 0;
wire [31:0] dbus_rdwr_offset_c_lw_s1 = instr_c_lw_s1_c1_next ? {24'h000000, imm_6_5_3_2_s1_c0, 2'b00} : 0;
wire [31:0] dbus_rdwr_offset_c_lwsp_s1 = instr_c_lwsp_s1_c1_next ? {25'h0000000, offset_7_6_5_4_2_s1_c0, 2'b00} : 0;
*/
wire [31:0] dbus_rdwr_offset_store_s1 = instr_i_store_s1_c1_next ? {{20{imm_11_5_4_0_s1_c0[11]}}, imm_11_5_4_0_s1_c0} : 0;
wire [31:0] dbus_rdwr_offset_c_sw_s1 = instr_c_sw_s1_c1_next ? {24'h000000, imm_6_5_3_2_s1_c0, 2'b00} : 0;
wire [31:0] dbus_rdwr_offset_c_swsp_s1 = instr_c_swsp_s1_c1_next ? {25'h0000000, offset_7_6_5_2_s1_c0, 2'b00} : 0;
wire [31:0] dbus_rdwr_add_a_s1 = (dbus_rdwr_offset_load_s1 |
dbus_rdwr_offset_c_lw_s1 |
dbus_rdwr_offset_c_lwsp_s1 |
dbus_rdwr_offset_store_s1 |
dbus_rdwr_offset_c_sw_s1 |
dbus_rdwr_offset_c_swsp_s1);
wire [31:0] dbus_rdwr_add_s1 = dbus_rdwr_add_a_s1 + dp_rs1_s2_next_int;
////////////////////////////////////////////////////////////
//
// Datapath Memory Handling
//
////////////////////////////////////////////////////////////
assign dbus_rdwr_width = (instr_i_load_s2_c1 | instr_i_store_s2_c1) ? instr_s2_c1[13:12] : 2;
wire [31:0] dbus_rdwr_offset_load_s2 = instr_i_load_s2 ? {{20{imm_11_0_s2[11]}}, imm_11_0_s2} : 0;
wire [31:0] dbus_rdwr_offset_c_lw_s2 = instr_c_lw_s2 ? {24'h000000, imm_6_5_3_2_s2_c0, 2'b00} : 0;
wire [31:0] dbus_rdwr_offset_c_lwsp_s2 = instr_c_lwsp_s2 ? {25'h0000000, offset_7_6_5_4_2_s2_c0, 2'b00} : 0;
assign dbus_rd_i_req = (!stalled_c1) &
instr_load_valid_c1;
wire dp_lw_s2_sel = (//pc_set_int | //(/*pc_set_int[1] & data_set[1]*/) |
(instr_s2_c2[14:12] == 3'b010) | instr_c_lw_s2_c2 | instr_c_lwsp_s2_c2) ? 1'b1 : 0;
wire [31:0] dp_lw_s2 = dp_lw_s2_sel_c3 ? dbus_rd_i_data : 0;
wire [31:0] dp_lb_s2 = instr_s2_c3[14:12] == 3'b000 ? {{24{dbus_rd_i_data[7]}}, dbus_rd_i_data[7:0]} : 0;
wire [31:0] dp_lh_s2 = instr_s2_c3[14:12] == 3'b001 ? {{16{dbus_rd_i_data[15]}}, dbus_rd_i_data[15:0]} : 0;
wire [31:0] dp_lbu_s2 = instr_s2_c3[14:12] == 3'b100 ? {24'h000000, dbus_rd_i_data[7:0]} : 0;
wire [31:0] dp_lhu_s2 = instr_s2_c3[14:12] == 3'b101 ? {16'h000000, dbus_rd_i_data[15:0]} : 0;
wire [31:0] dp_load_s2 = dp_lb_s2 |
dp_lh_s2 |
dp_lw_s2 |
dp_lbu_s2 |
dp_lhu_s2;
wire [31:0] dbus_rdwr_offset_store_s2 = instr_i_store_s2 ? {{20{imm_11_5_4_0_s2_c0[11]}}, imm_11_5_4_0_s2_c0} : 0;
wire [31:0] dbus_rdwr_offset_c_sw_s2 = (instr_c_sw_s2) ? {24'h000000, imm_6_5_3_2_s2_c0, 2'b00} : 0;
wire [31:0] dbus_rdwr_offset_c_swsp_s2 = (instr_c_swsp_s2) ? {25'h0000000, offset_7_6_5_2_s2_c0, 2'b00} : 0;
assign dbus_wr_en = glue_out[11]; //(!stalled_next) & instr_store_valid_c2;
//wire [31:0] dbus_rdwr_add_a = (dbus_rdwr_offset_load_s2 |
// dbus_rdwr_offset_c_lw_s2 |
// dbus_rdwr_offset_c_lwsp_s2 |
// dbus_rdwr_offset_store_s2 |
// dbus_rdwr_offset_c_sw_s2 |
// dbus_rdwr_offset_c_swsp_s2);
//assign dbus_rdwr_add = dbus_rdwr_add_a_c1 + dp_rs1_s2_c1;
//assign dbus_rd_add_fast = dp_rs2_s2 + dp_rs1_s2;
assign dbus_rd_add = (dbus_rdwr_offset_load_s2 |
dbus_rdwr_offset_c_lw_s2 |
dbus_rdwr_offset_c_lwsp_s2) + dp_rs1_s2_c1;
assign dbus_wr_add = (dbus_rdwr_offset_store_s2 |
dbus_rdwr_offset_c_sw_s2 |
dbus_rdwr_offset_c_swsp_s2) + dp_rs1_s2_c1;
assign dbus_wr_data = dp_rs2_s2_c1;
////////////////////////////////////////////////////////////
//
// SHP-Memories
//
////////////////////////////////////////////////////////////
wire [1:0] glue_in_tmp = (instr_m_mulhx_s2_c3 & state_lt3_s2_c3) ? mul_carry_s2_next : pvalid_next;
wire [31:0] glue_in;
parameter TC_START = 18'h00000;
parameter TC_KILL = 18'h00004;
parameter TC_SAK = 18'h00008;
parameter CLK_SEL = 18'h00010;
parameter CLK_VAL = 18'h00018;
//parameter CLK_DBG = 18'h00018;
parameter EXT_PATH = 18'h00020;
parameter CA_PER = 14'h0100;
wire dbus_rdwr_add_per_int = dbus_rdwr_add_s1[31:18] == 14'h2000;
wire kill_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == TC_KILL);
wire start_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == TC_START);
wire sak_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == TC_SAK);
wire wr_clk_sel_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == CLK_SEL);
wire wr_clk_val_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == CLK_VAL);
//wire wr_clk_dbg_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == CLK_DBG);
wire ext_path_int = dbus_wr_en_s1 & dbus_rdwr_add_per_int & (dbus_rdwr_add_s1[17:0] == EXT_PATH);
wire ca_per = (dbus_rdwr_add_s1[17:4] == CA_PER);
assign glue_in[31] = pc_set_int ? 0 : kill_int;
assign glue_in[30] = pc_set_int ? 0 : start_int;
assign glue_in[29] = pc_set_int ? 0 : sak_int;
assign glue_in[28] = pc_set_int ? 0 : wr_clk_sel_int;
assign glue_in[27] = pc_set_int ? 0 : wr_clk_val_int;
assign glue_in[26] = pc_set_int ? 0 : ca_per;
assign glue_in[25] = pc_set_int ? 0 : ext_path_int;
assign glue_in[24] = pc_set_int ? 0 : instr_m_mulhx_s2_c3;
// assign glue_in[23] = pc[13];
assign glue_in[22:18] = rf2_addrb_s0;
assign glue_in[17:13] = rf1_addrb_s0;
wire instr_load_valid_s1 = (pvalid_next_late == 2) &
(instr_i_load_s1_c3 | instr_c_lw_s1_c3 | instr_c_lwsp_s1_c3);
assign dbus_rd_req_s1 = instr_load_valid_s1;
wire instr_store_valid_s1 = (pvalid_next_late == 2) &
(instr_i_store_s1_c3 | instr_c_sw_s1_c3 | instr_c_swsp_s1_c3);
wire dbus_wr_en_s1 = instr_store_valid_s1;
assign glue_in[12: 0] = pc_set_int ? 0 :
{dbus_rd_req_s1,
dbus_wr_en_s1,
divrem_access_0_d1_next,
sign_s2_next,
state_s2_next,
stalled_next_c3,
glue_in_tmp};
wire [31:0] instr_s1_out;
wire [31:0] instr_s2_out;
wire [31:0] glue_out;
/*
Reg_D16 Reg_instr_s1 (.clka(clk),
.wea(thread_pipe_valid[0] & !stalled_by_ext), // & !(instr_load_s2 & stalled_next_c3)),
.addra(tidwr),
.dina(instr_s1_next),
.douta(),
.clkb(clk),
.addrb(tidrd0),
.doutb(instr_s1_out));
Reg_D16 Reg_instr_s2 (.clka(clk),
.wea(thread_pipe_valid[0] & !stalled_by_ext), // & !(instr_load_s2 & stalled_next_c3)),
.addra(tidwr),
.dina(instr_s2_next),
.douta(),
.clkb(clk),
.addrb(tidrd0),
.doutb(instr_s2_out));
Reg_D16 Reg_dp_rs1_s2 (.clka(clk),
.wea(thread_pipe_valid[0] & !stalled_by_ext), // & !(instr_load_s2 & stalled_next_c3)),
.addra(tidwr),
.dina(dp_rs1_s2_next),
.douta(),
.clkb(clk),
.addrb(tidrd0),
.doutb(dp_rs1_s2));
Reg_D16 Reg_dp_rs2_s2 (.clka(clk),
.wea(thread_pipe_valid[0] & !stalled_by_ext), // & !(instr_load_s2 & stalled_next_c3)),
.addra(tidwr),
.dina(dp_rs2_s2_next),
.douta(),
.clkb(clk),
.addrb(tidrd0),
.doutb(dp_rs2_s2));
Reg_D16 Reg_glue (.clka(clk),
.wea(thread_pipe_valid[0] & !stalled_by_ext),
.addra(tidwr),
.dina(glue_in),
.douta(),
.clkb(clk),
.addrb(tidrd0),
.doutb(glue_out));
*/
assign cubev_reg_din0 = pc_set_int ? 32'h00000013 : instr_s1_next;
assign cubev_reg_din1 = pc_set_int ? 32'h00000013 : instr_s2_next;
assign cubev_reg_din2 = dp_rs1_s2_next;
assign cubev_reg_din3 = dp_rs2_s2_next;
assign cubev_reg_din4[17:0] = dbus_rdwr_add_s1;
assign cubev_reg_din4[18] = dbus_rdwr_add_s1[31:18] == 14'h2000;
assign cubev_reg_din4[31:19] = pc_set_int ? {pc_set_data_int[11:0], 1'b0} : pc_s2_next[12:0];
assign cubev_reg_din5 = glue_in[31:0];
assign instr_s1_out = cubev_reg_dout0;
assign instr_s2_out = cubev_reg_dout1;
assign dp_rs1_s2 = cubev_reg_dout2;
assign dp_rs2_s2 = cubev_reg_dout3;
assign glue_out[31:0] = cubev_reg_dout5;
assign instr_s1 = instr_s1_out;
assign instr_s2 = instr_s2_out;
wire [1:0] pvalid_late = state_eq0_s2 ? cubev_reg_dout5_late[1:0] : 2;
assign pvalid = state_eq0_s2 ? cubev_reg_dout5[1:0] : 2;
assign mul_carry_s2 = ((state_s2 == 2) | (state_s2 == 3)) ? glue_out[1:0] : 0;
assign stalled = glue_out[2];
assign state_s2 = glue_out[8:3];
assign sign_s2 = cubev_reg_dout5[9];
wire sign_s2_c1 = cubev_reg_dout5[9];
assign sign_s2_late = cubev_reg_dout5_late[9];
assign divrem_access_0_d1 = glue_out_c1[10];
assign pc_s2[12:0] = cubev_reg_dout4[31:19];
assign pc_s2[31:13] = 0;
assign instr_i_load_s2 = opcode_i_s2 == 7'b0000011;
assign instr_c_lw_s2 = opcode_c_s2 == 2'b00 & funct3_c_s2 == 3'b010;
assign instr_c_lwsp_s2 = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b010;
assign instr_i_store_s2 = opcode_i_s2 == 7'b0100011;
assign instr_c_sw_s2 = opcode_c_s2 == 2'b00 & funct3_c_s2 == 3'b110;
assign instr_c_swsp_s2 = opcode_c_s2 == 2'b10 & funct3_c_s2 == 3'b110;
////////////////////////////////////////////////////////////
//
// Previous C-Slow Retiming Register
//
////////////////////////////////////////////////////////////
wire [31:0] instr_s1_c1;
wire instr_i_lui_s1_c1;
wire instr_i_auipc_s1_c1;
wire instr_i_jal_s1_c1;
wire instr_i_load_s1_c1;
wire instr_i_store_s1_c1;
wire instr_i_slli_s1_c1;
wire instr_i_srli_s1_c1;
wire instr_i_srai_s1_c1;
wire instr_i_sll_s1_c1;
wire instr_i_srl_s1_c1;
wire instr_i_sra_s1_c1;
wire instr_m_mul_s1_c1;
wire instr_m_mulh_s1_c1;
wire instr_m_mulhsu_s1_c1;
wire instr_m_div_s1_c1;
wire instr_m_rem_s1_c1;
wire instr_c_lwsp_s1_c1;
wire instr_c_swsp_s1_c1;
wire instr_c_lw_s1_c1;
wire instr_c_sw_s1_c1;
wire instr_c_j_s1_c1;
wire instr_c_jal_s1_c1;
wire instr_c_jr_s1_c1;
wire instr_c_jalr_s1_c1;
wire instr_c_li_s1_c1;
wire instr_c_lui_s1_c1;
wire instr_c_beqz_s1_c1;
wire instr_c_bnez_s1_c1;
wire instr_c_addi_s1_c1;
wire instr_c_addi16sp_s1_c1;
wire instr_c_addi4spn_s1_c1;
wire instr_c_slli_s1_c1;
wire instr_c_srli_s1_c1;
wire instr_c_srai_s1_c1;
wire instr_c_andi_s1_c1;
wire instr_c_mv_s1_c1;
wire instr_c_add_s1_c1;
wire [31:0] instr_s2_c1;
wire instr_i_lui_s2_c1;
wire instr_i_auipc_s2_c1;
wire instr_i_jal_s2_c1;
wire instr_i_jalr_s2_c1;
wire instr_i_beq_s2_c1;
wire instr_i_bne_s2_c1;
wire instr_i_blt_s2_c1;
wire instr_i_bge_s2_c1;
wire instr_i_bltu_s2_c1;
wire instr_i_bgeu_s2_c1;
wire instr_i_addi_s2_c1;
wire instr_i_slti_s2_c1;
wire instr_i_sltiu_s2_c1;
wire instr_i_xori_s2_c1;
wire instr_i_ori_s2_c1;
wire instr_i_andi_s2_c1;
wire instr_i_slli_s2_c1;
wire instr_i_srli_s2_c1;
wire instr_i_srai_s2_c1;
wire instr_i_add_s2_c1;
wire instr_i_sub_s2_c1;
wire instr_i_sll_s2_c1;
wire instr_i_slt_s2_c1;
wire instr_i_sltu_s2_c1;
wire instr_i_xor_s2_c1;
wire instr_i_srl_s2_c1;
wire instr_i_sra_s2_c1;
wire instr_i_or_s2_c1;
wire instr_i_and_s2_c1;
wire instr_m_mul_s2_c1;
wire instr_m_mulh_s2_c1;
wire instr_m_mulhsu_s2_c1;
wire instr_m_mulhu_s2_c1;
wire instr_m_div_s2_c1;
wire instr_m_divu_s2_c1;
wire instr_m_rem_s2_c1;
wire instr_c_j_s2_c1;
wire instr_c_jal_s2_c1;
wire instr_c_jr_s2_c1;
wire instr_c_jalr_s2_c1;
wire instr_c_li_s2_c1;
wire instr_c_lui_s2_c1;
wire instr_c_beqz_s2_c1;
wire instr_c_bnez_s2_c1;
wire instr_c_addi_s2_c1;
wire instr_c_addi16sp_s2_c1;
wire instr_c_addi4spn_s2_c1;
wire instr_c_slli_s2_c1;
wire instr_c_srli_s2_c1;
wire instr_c_srai_s2_c1;
wire instr_c_andi_s2_c1;
wire instr_c_mv_s2_c1;
wire instr_c_add_s2_c1;
wire instr_c_and_s2_c1;
wire instr_c_or_s2_c1;
wire instr_c_xor_s2_c1;
wire instr_c_sub_s2_c1;
wire [31:0] glue_out_c1;
wire [31:0] dp_rs1_s2_c1;
wire [31:0] dp_rs2_s2_c1;
wire [31:0] pc_s2_c1;
wire instr_i_load_s2_c1;
wire instr_c_lw_s2_c1;
wire instr_c_lwsp_s2_c1;
wire instr_load_valid_c1;
wire instr_i_store_s2_c1;
wire instr_c_sw_s2_c1;
wire instr_c_swsp_s2_c1;
wire [1:0] pvalid_c1;
wire stalled_c1;
wire instr_m_s1_c1;
wire [5:0] state_s2_c1;
wire state_eq0_s2_c1;
wire state_eq1_s2_c1;
wire state_eq32_s2_c1;
wire instr_m_divrem_s2_c1;
wire instr_m_mulx_s2_c1;
wire [31:0] pc_clear_s2_c1;
wire [63:0] dp_div_divisor_s2_c1;
//wire [31:0] dbus_rdwr_add_a_c1;
wire instr_m_mulhx_s2_c1;
wire [1:0] mul_carry_s2_c1;
wire funct7_i_s2_eq0_c1;
wire funct7_i_s2_eq20_c1;
wire funct7_i_s2_eq1_c1;
wire [32:0] dp_mul_add_s2_cd_def_c1;
wire [16:0] dp_mul_add_s2_ab_def_p1_c1;
wire [16:0] dp_mul_add_s2_ab_def_p2_c1;
wire [16:0] dp_mul_add_s2_ab_def_hw_p1_c1;
wire dp_eq_0_s2_c1;
wire dp_eq_1_s2_c1;
wire dp_eq_2_s2_c1;
wire dp_eq_3_s2_c1;
wire dp_eq_4_s2_c1;
wire dp_eq_5_s2_c1;
wire dp_eq_6_s2_c1;
wire dp_eq_7_s2_c1;
wire dp_lt_0_s2_c1;
wire dp_lt_1_s2_c1;
wire dp_lt_2_s2_c1;
wire dp_lt_3_s2_c1;
wire dp_lt_4_s2_c1;
wire dp_lt_5_s2_c1;
wire dp_lt_6_s2_c1;
wire dp_lt_7_s2_c1;
wire opcode_i_s1_13_shamt_c1;
wire opcode_i_s1_13_c1;
wire opcode_i_s1_23_c1;
wire opcode_i_s1_33_c1;
wire opcode_i_s1_63_c1;
wire funct6_c_s1_23_opcode_2_c1;
wire funct6_c_s2_23_opcode_2_c1;
wire opcode_i_s2_eq13_c1;
wire opcode_i_s2_eq33_c1;
wire opcode_i_s2_eq63_c1;
wire rs2_c_s2_eq0_c1;
wire rs2_c_s1_eq0_c1;
wire instr_s1_11_7_eq_02_c1;
wire instr_s2_11_7_eq_02_c1;
wire rs2_def_sel_s1_c1;
assign instr_s1_c1 = instr_s1;
assign instr_i_lui_s1_c1 = instr_i_lui_s1_c1_next;
assign instr_i_auipc_s1_c1 = instr_i_auipc_s1_c1_next;
assign instr_i_jal_s1_c1 = instr_i_jal_s1_c1_next;
assign instr_i_load_s1_c1 = instr_i_load_s1_c1_next;
assign instr_i_store_s1_c1 = instr_i_store_s1_c1_next;
assign instr_i_slli_s1_c1 = instr_i_slli_s1_c1_next;
assign instr_i_srli_s1_c1 = instr_i_srli_s1_c1_next;
assign instr_i_srai_s1_c1 = instr_i_srai_s1_c1_next;
assign instr_i_sll_s1_c1 = instr_i_sll_s1_c1_next;
assign instr_i_srl_s1_c1 = instr_i_srl_s1_c1_next;
assign instr_i_sra_s1_c1 = instr_i_sra_s1_c1_next;
assign instr_m_mul_s1_c1 = instr_m_mul_s1_c1_next;
assign instr_m_mulh_s1_c1 = instr_m_mulh_s1_c1_next;
assign instr_m_mulhsu_s1_c1 = instr_m_mulhsu_s1_c1_next;
assign instr_m_div_s1_c1 = instr_m_div_s1_c1_next;
assign instr_m_rem_s1_c1 = instr_m_rem_s1_c1_next;
assign instr_c_lwsp_s1_c1 = instr_c_lwsp_s1_c1_next;
assign instr_c_swsp_s1_c1 = instr_c_swsp_s1_c1_next;
assign instr_c_lw_s1_c1 = instr_c_lw_s1_c1_next;
assign instr_c_sw_s1_c1 = instr_c_sw_s1_c1_next;
assign instr_c_j_s1_c1 = instr_c_j_s1_c1_next;
assign instr_c_jal_s1_c1 = instr_c_jal_s1_c1_next;
assign instr_c_jr_s1_c1 = instr_c_jr_s1_c1_next;
assign instr_c_jalr_s1_c1 = instr_c_jalr_s1_c1_next;
assign instr_c_li_s1_c1 = instr_c_li_s1_c1_next;
assign instr_c_lui_s1_c1 = instr_c_lui_s1_c1_next;
assign instr_c_beqz_s1_c1 = instr_c_beqz_s1_c1_next;
assign instr_c_bnez_s1_c1 = instr_c_bnez_s1_c1_next;
assign instr_c_addi_s1_c1 = instr_c_addi_s1_c1_next;
assign instr_c_addi16sp_s1_c1 = instr_c_addi16sp_s1_c1_next;
assign instr_c_addi4spn_s1_c1 = instr_c_addi4spn_s1_c1_next;
assign instr_c_slli_s1_c1 = instr_c_slli_s1_c1_next;
assign instr_c_srli_s1_c1 = instr_c_srli_s1_c1_next;
assign instr_c_srai_s1_c1 = instr_c_srai_s1_c1_next;
assign instr_c_andi_s1_c1 = instr_c_andi_s1_c1_next;
assign instr_c_mv_s1_c1 = instr_c_mv_s1_c1_next;
assign instr_c_add_s1_c1 = instr_c_add_s1_c1_next;
assign glue_out_c1 = glue_out;
assign dp_rs1_s2_c1 = dp_rs1_s2;
assign dp_rs2_s2_c1 = dp_rs2_s2;
assign pc_s2_c1 = pc_s2;
assign instr_i_load_s2_c1 = instr_i_load_s2;
assign instr_c_lw_s2_c1 = instr_c_lw_s2;
assign instr_c_lwsp_s2_c1 = instr_c_lwsp_s2;
assign instr_load_valid_c1 = (pvalid == 2) &
(instr_i_load_s2 | instr_c_lw_s2 | instr_c_lwsp_s2); // &
//thread_pipe_valid/*[3]*/;
assign instr_i_store_s2_c1 = instr_i_store_s2;
assign instr_c_sw_s2_c1 = instr_c_sw_s2;
assign instr_c_swsp_s2_c1 = instr_c_swsp_s2;
assign pvalid_c1 = pvalid;
assign stalled_c1 = stalled;
assign instr_m_s1_c1 = instr_m_s1;
assign state_s2_c1 = state_s2;
assign state_eq0_s2_c1 = state_eq0_s2;
assign state_eq1_s2_c1 = state_eq1_s2;
assign state_eq32_s2_c1 = state_eq32_s2;
assign instr_m_divrem_s2_c1 = instr_m_divrem_s2;
assign instr_m_mulx_s2_c1 = instr_m_mulx_s2;
assign pc_clear_s2_c1 = pc_clear_s2;
assign dp_div_divisor_s2_c1 = dp_div_divisor_s2;
//assign dbus_rdwr_add_a_c1 = dbus_rdwr_add_a;
assign instr_m_mulhx_s2_c1 = instr_m_mulhx_s2;
assign mul_carry_s2_c1 = mul_carry_s2;
assign funct7_i_s2_eq0_c1 = funct7_i_s2_eq0;
assign funct7_i_s2_eq20_c1 = funct7_i_s2_eq20;
assign funct7_i_s2_eq1_c1 = funct7_i_s2_eq1;
assign dp_mul_add_s2_cd_def_c1 = dp_mul_add_s2_cd_def;
assign dp_mul_add_s2_ab_def_p1_c1 = dp_mul_add_s2_ab_def_p1;
assign dp_mul_add_s2_ab_def_p2_c1 = dp_mul_add_s2_ab_def_p2;
assign dp_mul_add_s2_ab_def_hw_p1_c1 = dp_mul_add_s2_ab_def_hw_p1;
assign dp_eq_0_s2_c1 = dp_eq_0_s2;
assign dp_eq_1_s2_c1 = dp_eq_1_s2;
assign dp_eq_2_s2_c1 = dp_eq_2_s2;
assign dp_eq_3_s2_c1 = dp_eq_3_s2;
assign dp_eq_4_s2_c1 = dp_eq_4_s2;
assign dp_eq_5_s2_c1 = dp_eq_5_s2;
assign dp_eq_6_s2_c1 = dp_eq_6_s2;
assign dp_eq_7_s2_c1 = dp_eq_7_s2;
assign dp_lt_0_s2_c1 = dp_lt_0_s2;
assign dp_lt_1_s2_c1 = dp_lt_1_s2;
assign dp_lt_2_s2_c1 = dp_lt_2_s2;
assign dp_lt_3_s2_c1 = dp_lt_3_s2;
assign dp_lt_4_s2_c1 = dp_lt_4_s2;
assign dp_lt_5_s2_c1 = dp_lt_5_s2;
assign dp_lt_6_s2_c1 = dp_lt_6_s2;
assign dp_lt_7_s2_c1 = dp_lt_7_s2;
assign opcode_i_s1_13_shamt_c1 = opcode_i_s1_13_shamt;
assign opcode_i_s1_13_c1 = opcode_i_s1_13;
assign opcode_i_s1_23_c1 = opcode_i_s1_23;
assign opcode_i_s1_33_c1 = opcode_i_s1_33;
assign opcode_i_s1_63_c1 = opcode_i_s1_63;
assign funct6_c_s1_23_opcode_2_c1 = (opcode_c_s1 == 2'b01) & (funct6_c_s1 == 6'b100011);
assign funct6_c_s2_23_opcode_2_c1 = (opcode_c_s2 == 2'b01) & (funct6_c_s2 == 6'b100011);
assign opcode_i_s2_eq13_c1 = opcode_i_s2_eq13;
assign opcode_i_s2_eq33_c1 = opcode_i_s2_eq33;
assign opcode_i_s2_eq63_c1 = opcode_i_s2_eq63;
assign instr_s2_c1 = instr_s2;
assign instr_i_lui_s2_c1 = instr_i_lui_s2_c1_next;
assign instr_i_auipc_s2_c1 = instr_i_auipc_s2_c1_next;
assign instr_i_jal_s2_c1 = instr_i_jal_s2_c1_next;
assign instr_i_jalr_s2_c1 = instr_i_jalr_s2_c1_next;
assign instr_i_beq_s2_c1 = instr_i_beq_s2_c1_next;
assign instr_i_bne_s2_c1 = instr_i_bne_s2_c1_next;
assign instr_i_blt_s2_c1 = instr_i_blt_s2_c1_next;
assign instr_i_bge_s2_c1 = instr_i_bge_s2_c1_next;
assign instr_i_bltu_s2_c1 = instr_i_bltu_s2_c1_next;
assign instr_i_bgeu_s2_c1 = instr_i_bgeu_s2_c1_next;
assign instr_i_addi_s2_c1 = instr_i_addi_s2_c1_next;
assign instr_i_slti_s2_c1 = instr_i_slti_s2_c1_next;
assign instr_i_sltiu_s2_c1 = instr_i_sltiu_s2_c1_next;
assign instr_i_xori_s2_c1 = instr_i_xori_s2_c1_next;
assign instr_i_ori_s2_c1 = instr_i_ori_s2_c1_next;
assign instr_i_andi_s2_c1 = instr_i_andi_s2_c1_next;
assign instr_i_slli_s2_c1 = instr_i_slli_s2_c1_next;
assign instr_i_srli_s2_c1 = instr_i_srli_s2_c1_next;
assign instr_i_srai_s2_c1 = instr_i_srai_s2_c1_next;
assign instr_i_add_s2_c1 = instr_i_add_s2_c1_next;
assign instr_i_sub_s2_c1 = instr_i_sub_s2_c1_next;
assign instr_i_sll_s2_c1 = instr_i_sll_s2_c1_next;
assign instr_i_slt_s2_c1 = instr_i_slt_s2_c1_next;
assign instr_i_sltu_s2_c1 = instr_i_sltu_s2_c1_next;
assign instr_i_xor_s2_c1 = instr_i_xor_s2_c1_next;
assign instr_i_srl_s2_c1 = instr_i_srl_s2_c1_next;
assign instr_i_sra_s2_c1 = instr_i_sra_s2_c1_next;
assign instr_i_or_s2_c1 = instr_i_or_s2_c1_next;
assign instr_i_and_s2_c1 = instr_i_and_s2_c1_next;
assign instr_m_mul_s2_c1 = instr_m_mul_s2_c1_next;
assign instr_m_mulh_s2_c1 = instr_m_mulh_s2_c1_next;
assign instr_m_mulhsu_s2_c1 = instr_m_mulhsu_s2_c1_next;
assign instr_m_mulhu_s2_c1 = instr_m_mulhu_s2_c1_next;
assign instr_m_div_s2_c1 = instr_m_div_s2_c1_next;
assign instr_m_divu_s2_c1 = instr_m_divu_s2_c1_next;
assign instr_m_rem_s2_c1 = instr_m_rem_s2_c1_next;
assign instr_c_j_s2_c1 = instr_c_j_s2_c1_next;
assign instr_c_jal_s2_c1 = instr_c_jal_s2_c1_next;
assign instr_c_jr_s2_c1 = instr_c_jr_s2_c1_next;
assign instr_c_jalr_s2_c1 = instr_c_jalr_s2_c1_next;
assign instr_c_li_s2_c1 = instr_c_li_s2_c1_next;
assign instr_c_lui_s2_c1 = instr_c_lui_s2_c1_next;
assign instr_c_beqz_s2_c1 = instr_c_beqz_s2_c1_next;
assign instr_c_bnez_s2_c1 = instr_c_bnez_s2_c1_next;
assign instr_c_addi_s2_c1 = instr_c_addi_s2_c1_next;
assign instr_c_addi16sp_s2_c1 = instr_c_addi16sp_s2_c1_next;
assign instr_c_addi4spn_s2_c1 = instr_c_addi4spn_s2_c1_next;
assign instr_c_slli_s2_c1 = instr_c_slli_s2_c1_next;
assign instr_c_srli_s2_c1 = instr_c_srli_s2_c1_next;
assign instr_c_srai_s2_c1 = instr_c_srai_s2_c1_next;
assign instr_c_andi_s2_c1 = instr_c_andi_s2_c1_next;
assign instr_c_mv_s2_c1 = instr_c_mv_s2_c1_next;
assign instr_c_add_s2_c1 = instr_c_add_s2_c1_next;
assign instr_c_and_s2_c1 = instr_c_and_s2_c1_next;
assign instr_c_or_s2_c1 = instr_c_or_s2_c1_next;
assign instr_c_xor_s2_c1 = instr_c_xor_s2_c1_next;
assign instr_c_sub_s2_c1 = instr_c_sub_s2_c1_next;
assign rs2_c_s2_eq0_c1 = rs2_c_s2_eq0;
assign rs2_c_s1_eq0_c1 = rs2_c_s1_eq0;
assign instr_s1_11_7_eq_02_c1 = instr_s1_11_7_eq_02;
assign instr_s2_11_7_eq_02_c1 = instr_s2_11_7_eq_02;
assign rs2_def_sel_s1_c1 = rs2_def_sel_s1;
wire [31:0] instr_s1_c2;
wire instr_i_load_s1_c2;
wire instr_i_store_s1_c2;
wire instr_i_slli_s1_c2;
wire instr_i_srli_s1_c2;
wire instr_i_srai_s1_c2;
wire instr_i_sll_s1_c2;
wire instr_i_srl_s1_c2;
wire instr_i_sra_s1_c2;
wire instr_m_mul_s1_c2;
wire instr_m_mulh_s1_c2;
wire instr_m_mulhsu_s1_c2;
wire instr_m_div_s1_c2;
wire instr_m_rem_s1_c2;
wire instr_c_lwsp_s1_c2;
wire instr_c_swsp_s1_c2;
wire instr_c_lw_s1_c2;
wire instr_c_sw_s1_c2;
wire instr_c_slli_s1_c2;
wire instr_c_srli_s1_c2;
wire instr_c_srai_s1_c2;
wire [31:0] instr_s2_c2;
wire instr_i_jal_s2_c2;
wire instr_i_jalr_s2_c2;
wire instr_i_beq_s2_c2;
wire instr_i_bne_s2_c2;
wire instr_i_blt_s2_c2;
wire instr_i_bge_s2_c2;
wire instr_i_bltu_s2_c2;
wire instr_i_bgeu_s2_c2;
wire instr_i_slli_s2_c2;
wire instr_i_srli_s2_c2;
wire instr_i_srai_s2_c2;
wire instr_i_sll_s2_c2;
wire instr_i_srl_s2_c2;
wire instr_i_sra_s2_c2;
wire instr_m_mul_s2_c2;
wire instr_m_mulh_s2_c2;
wire instr_m_mulhsu_s2_c2;
wire instr_m_div_s2_c2;
wire instr_m_divu_s2_c2;
wire instr_m_rem_s2_c2;
wire instr_c_j_s2_c2;
wire instr_c_jal_s2_c2;
wire instr_c_beqz_s2_c2;
wire instr_c_bnez_s2_c2;
wire instr_c_slli_s2_c2;
wire instr_c_srli_s2_c2;
wire instr_c_srai_s2_c2;
wire [4:0] rs1_s1_c2;
wire [4:0] rs2_s1_c2;
wire [31:0] glue_out_c2;
wire rs1_valid_s1_c2;
wire rs2_valid_s1_c2;
wire [31:0] dp_rs1_s2_c2;
wire [31:0] dp_rs2_s2_c2;
wire [31:0] pc_s2_c2;
wire instr_i_load_s2_c2;
wire instr_c_lw_s2_c2;
wire instr_c_lwsp_s2_c2;
wire instr_store_valid_c2;
wire [1:0] pvalid_c2;
wire instr_m_s1_c2;
wire [5:0] state_s2_c2;
wire state_eq0_s2_c2;
wire state_eq1_s2_c2;
wire state_eq32_s2_c2;
wire instr_m_divrem_s2_c2;
wire instr_m_mulx_s2_c2;
wire rd_valid_s2_c2;
wire [4:0] rd_s2_c2;
wire rf1_addrb_s1_zero_c2;
wire rf2_addrb_s1_zero_c2;
wire [31:0] dp_comb_s2_c2;
wire dp_wr_s2_a_c2;
wire [31:0] pc_clear_s2_c2;
wire [32:0] dp_add_a_s2_c2;
wire [32:0] dp_add_b_s2_c2;
wire [4:0] dp_shmul_32a_in_s2_c2;
wire [4:0] dp_shmul_a_s2_c2;
wire noshift_s2_c2;
wire [31:0] dp_divrem_s2_c2;
wire dp_div_greater_s2_c2;
wire [31:0] dp_div_remainder_s2_c2;
wire branch_s2_c2;
wire jump_s2_c2;
wire [31:0] pc_jump_or_branch_dp_s2_c2;
wire dbus_rd_i_req_c2;
wire instr_m_mulhx_s2_c2;
wire state_eq3_s2_c2;
wire [1:0] mul_carry_s2_c2;
wire stalled_next_sel1_c2;
wire stalled_next_sel2_c2;
wire dp_slt_s2_lt_0_c2;
wire dp_slt_s2_lt_1_c2;
wire dp_slt_s2_lt_2_c2;
wire dp_slt_s2_lt_3_c2;
wire dp_slt_s2_lt_4_c2;
wire dp_slt_s2_lt_5_c2;
wire dp_slt_s2_lt_6_c2;
wire dp_slt_s2_lt_7_c2;
wire dp_slt_s2_eq_0_c2;
wire dp_slt_s2_eq_1_c2;
wire dp_slt_s2_eq_2_c2;
wire dp_slt_s2_eq_3_c2;
wire dp_slt_s2_eq_4_c2;
wire dp_slt_s2_eq_5_c2;
wire dp_slt_s2_eq_6_c2;
wire dp_slt_s2_eq_7_c2;
wire [32:0] dp_mul_add_s2_ab_used_c2;
wire [32:0] dp_mul_add_s2_cd_used_c2;
wire [32:0] dp_mul_add_s2_ab_neg_used_c2;
wire [32:0] dp_mul_add_s2_cd_sub_used_c2;
wire [32:0] dp_mul_add_s2_cd_neg_used_c2;
wire dp_slt_sel_s2_c2;
wire dp_slt_inv_s2_c2;
assign instr_s1_c2 = instr_s1_c1;
assign instr_i_load_s1_c2 = instr_i_load_s1_c1;
assign instr_i_store_s1_c2 = instr_i_store_s1_c1;
assign instr_i_slli_s1_c2 = instr_i_slli_s1_c1 & opcode_i_s1_13_c1 & funct7_i_s1_eq0;
assign instr_i_srli_s1_c2 = instr_i_srli_s1_c1 & opcode_i_s1_13_c1 & funct7_i_s1_eq0;
assign instr_i_srai_s1_c2 = instr_i_srai_s1_c1 & opcode_i_s1_13_c1 & funct7_i_s1_eq20;
assign instr_i_sll_s1_c2 = instr_i_sll_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq0;
assign instr_i_srl_s1_c2 = instr_i_srl_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq0;
assign instr_i_sra_s1_c2 = instr_i_sra_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq20;
assign instr_m_mul_s1_c2 = instr_m_mul_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign instr_m_mulh_s1_c2 = instr_m_mulh_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign instr_m_mulhsu_s1_c2 = instr_m_mulhsu_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign instr_m_div_s1_c2 = instr_m_div_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign instr_m_rem_s1_c2 = instr_m_rem_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign instr_c_lwsp_s1_c2 = instr_c_lwsp_s1_c1;
assign instr_c_swsp_s1_c2 = instr_c_swsp_s1_c1;
assign instr_c_lw_s1_c2 = instr_c_lw_s1_c1;
assign instr_c_sw_s1_c2 = instr_c_sw_s1_c1;
assign instr_c_slli_s1_c2 = instr_c_slli_s1_c1;
assign instr_c_srli_s1_c2 = instr_c_srli_s1_c1;
assign instr_c_srai_s1_c2 = instr_c_srai_s1_c1;
assign instr_s2_c2 = instr_s2_c1;
assign instr_i_jal_s2_c2 = instr_i_jal_s2_c1;
assign instr_i_jalr_s2_c2 = instr_i_jalr_s2_c1;
assign instr_i_beq_s2_c2 = instr_i_beq_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_bne_s2_c2 = instr_i_bne_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_blt_s2_c2 = instr_i_blt_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_bge_s2_c2 = instr_i_bge_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_bltu_s2_c2 = instr_i_bltu_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_bgeu_s2_c2 = instr_i_bgeu_s2_c1 & opcode_i_s2_eq63_c1;
assign instr_i_slli_s2_c2 = instr_i_slli_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq0_c1;
assign instr_i_srli_s2_c2 = instr_i_srli_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq0_c1;
assign instr_i_srai_s2_c2 = instr_i_srai_s2_c1 & opcode_i_s2_eq13_c1 & funct7_i_s2_eq20_c1;
assign instr_i_sll_s2_c2 = instr_i_sll_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1;
assign instr_i_srl_s2_c2 = instr_i_srl_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq0_c1;
assign instr_i_sra_s2_c2 = instr_i_sra_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq20_c1;
assign instr_m_mul_s2_c2 = instr_m_mul_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_mulh_s2_c2 = instr_m_mulh_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_mulhsu_s2_c2 = instr_m_mulhsu_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_div_s2_c2 = instr_m_div_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_divu_s2_c2 = instr_m_divu_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_rem_s2_c2 = instr_m_rem_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_c_j_s2_c2 = instr_c_j_s2_c1;
assign instr_c_jal_s2_c2 = instr_c_jal_s2_c1;
assign instr_c_beqz_s2_c2 = instr_c_beqz_s2_c1;
assign instr_c_bnez_s2_c2 = instr_c_bnez_s2_c1;
assign instr_c_slli_s2_c2 = instr_c_slli_s2_c1;
assign instr_c_srli_s2_c2 = instr_c_srli_s2_c1;
assign instr_c_srai_s2_c2 = instr_c_srai_s2_c1;
assign rs1_s1_c2 = rs1_s1;
assign rs2_s1_c2 = rs2_s1;
assign glue_out_c2 = glue_out_c1;
assign rs1_valid_s1_c2 = rs1_valid_s1;
assign rs2_valid_s1_c2 = rs2_valid_s1;
assign dp_rs1_s2_c2 = dp_rs1_s2_c1;
assign dp_rs2_s2_c2 = dp_rs2_s2_c1;
assign pc_s2_c2 = pc_s2_c1;
assign instr_i_load_s2_c2 = instr_i_load_s2_c1;
assign instr_c_lw_s2_c2 = instr_c_lw_s2_c1;
assign instr_c_lwsp_s2_c2 = instr_c_lwsp_s2_c1;
//assign instr_store_valid_c2 = (pvalid_c1 == 2) &
// (instr_i_store_s2_c1 | instr_c_sw_s2_c1 | instr_c_swsp_s2_c1) &
// thread_pipe_valid/*[2]*/;
assign pvalid_c2 = pvalid_c1;
assign instr_m_s1_c2 = instr_m_s1_c1 & opcode_i_s1_33_c1 & funct7_i_s1_eq1;
assign state_s2_c2 = state_s2_c1;
assign state_eq0_s2_c2 = state_eq0_s2_c1;
assign state_eq1_s2_c2 = state_eq1_s2_c1;
assign state_eq32_s2_c2 = state_eq32_s2_c1;
assign instr_m_divrem_s2_c2 = instr_m_divrem_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign instr_m_mulx_s2_c2 = instr_m_mulx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign rd_valid_s2_c2 = rd_valid_s2;
assign rd_s2_c2 = rd_s2;
assign rf1_addrb_s1_zero_c2 = rf1_addrb_s1_zero;
assign rf2_addrb_s1_zero_c2 = rf2_addrb_s1_zero;
assign dp_comb_s2_c2 = dp_comb_s2;
assign dp_wr_s2_a_c2 = dp_wr_s2_a;
assign pc_clear_s2_c2 = pc_clear_s2_c1;
assign dp_add_a_s2_c2 = dp_add_a_s2;
assign dp_add_b_s2_c2 = dp_add_b_s2;
assign dp_shmul_32a_in_s2_c2 = dp_shmul_32a_in_s2;
assign dp_shmul_a_s2_c2 = dp_shmul_a_s2;
assign noshift_s2_c2 = noshift_s2;
assign dp_divrem_s2_c2 = dp_divrem_s2;
assign dp_div_greater_s2_c2 = dp_div_greater_s2;
assign dp_div_remainder_s2_c2 = dp_div_remainder_s2;
assign branch_s2_c2 = branch_s2;
assign jump_s2_c2 = jump_s2;
assign pc_jump_or_branch_dp_s2_c2 = pc_jump_or_branch_dp_s2;
assign dbus_rd_i_req_c2 = dbus_rd_i_req;
assign instr_m_mulhx_s2_c2 = instr_m_mulhx_s2_c1 & opcode_i_s2_eq33_c1 & funct7_i_s2_eq1_c1;
assign state_eq3_s2_c2 = state_eq3_s2;
assign mul_carry_s2_c2 = mul_carry_s2_c1;
assign stalled_next_sel1_c2 = stalled_next_sel1;
assign stalled_next_sel2_c2 = stalled_next_sel2;
assign dp_slt_s2_lt_0_c2 = dp_slt_s2_lt_0;
assign dp_slt_s2_lt_1_c2 = dp_slt_s2_lt_1;
assign dp_slt_s2_lt_2_c2 = dp_slt_s2_lt_2;
assign dp_slt_s2_lt_3_c2 = dp_slt_s2_lt_3;
assign dp_slt_s2_lt_4_c2 = dp_slt_s2_lt_4;
assign dp_slt_s2_lt_5_c2 = dp_slt_s2_lt_5;
assign dp_slt_s2_lt_6_c2 = dp_slt_s2_lt_6;
assign dp_slt_s2_lt_7_c2 = dp_slt_s2_lt_7;
assign dp_slt_s2_eq_0_c2 = dp_slt_s2_eq_0;
assign dp_slt_s2_eq_1_c2 = dp_slt_s2_eq_1;
assign dp_slt_s2_eq_2_c2 = dp_slt_s2_eq_2;
assign dp_slt_s2_eq_3_c2 = dp_slt_s2_eq_3;
assign dp_slt_s2_eq_4_c2 = dp_slt_s2_eq_4;
assign dp_slt_s2_eq_5_c2 = dp_slt_s2_eq_5;
assign dp_slt_s2_eq_6_c2 = dp_slt_s2_eq_6;
assign dp_slt_s2_eq_7_c2 = dp_slt_s2_eq_7;
assign dp_mul_add_s2_ab_used_c2 = dp_mul_add_s2_ab_used;
assign dp_mul_add_s2_cd_used_c2 = dp_mul_add_s2_cd_used;
assign dp_mul_add_s2_ab_neg_used_c2 = dp_mul_add_s2_ab_neg_used;
assign dp_mul_add_s2_cd_sub_used_c2 = dp_mul_add_s2_cd_sub_used;
assign dp_mul_add_s2_cd_neg_used_c2 = dp_mul_add_s2_cd_neg_used;
assign dp_slt_sel_s2_c2 = dp_slt_sel_s2;
assign dp_slt_inv_s2_c2 = dp_slt_inv_s2;
wire [31:0] instr_s1_c3;
wire instr_i_load_s1_c3;
wire instr_i_store_s1_c3;
wire instr_i_sra_s1_c3;
wire instr_m_mul_s1_c3;
wire instr_m_mulh_s1_c3;
wire instr_m_mulhsu_s1_c3;
wire instr_m_div_s1_c3;
wire instr_m_rem_s1_c3;
wire instr_c_lwsp_s1_c3;
wire instr_c_swsp_s1_c3;
wire instr_c_lw_s1_c3;
wire instr_c_sw_s1_c3;
wire [31:0] instr_s2_c3;
wire instr_i_jalr_s2_c3;
wire instr_m_mul_s2_c3;
wire instr_m_div_s2_c3;
wire instr_m_rem_s2_c3;
wire [31:0] dp_rs1_s2_c3;
wire [31:0] dp_rs2_s2_c3;
wire [31:0] glue_out_c3;
wire [31:0] pc_s2_c3;
wire [31:0] instr_c3;
wire [31:0] pc_step_s2_c3;
wire instr_i_load_s2_c3;
wire instr_c_lw_s2_c3;
wire instr_c_lwsp_s2_c3;
wire [1:0] pvalid_c3;
wire [5:0] state_s2_c3;
wire state_eq0_s2_c3;
wire state_eq1_s2_c3;
wire state_eq32_s2_c3;
wire instr_m_divrem_s2_c3;
wire instr_m_mulx_s2_c3;
//wire [4:0] rd_s2_c3;
wire stalled_next_c3;
wire [4:0] dp_shmul_a_s1_c3;
wire [31:0] dp_rs1_s1_c3;
wire [31:0] dp_rs2_s1_c3;
wire dp_wr_s2_b_c3;
wire [33:0] dp_add_s2_c3;
wire [31:0] dp_shmul_s2_c3;
wire [31:0] dp_divrem_rfin_s2_c3;
wire branch_s2_c3;
wire jump_s2_c3;
wire [31:0] pc_dp_d_s2_c3;
wire rs1_wth_s1_c3;
wire rs2_wth_s1_c3;
wire state_eq31_s2_c3;
wire dp_rs1_s2_next_sel1_c3;
wire [31:0] dp_rs1_s2_next_div_c3;
wire [31:0] dp_out_s2_early_c3;
wire instr_m_mulhx_s2_c3;
wire state_lt3_s2_c3;
wire state_eq2_s2_c3;
wire [1:0] mul_carry_s2_c3;
wire dp_rs1_s2_next_mul_sel_c3;
wire dp_lw_s2_sel_c3;
wire state_s2_next_sel1_c3;
wire state_s2_next_sel2_c3;
wire dp_rs2_s2_next_mul_sel_c3;
wire dp_rs2_s2_next_sh_sel_c3;
wire dp_rs2_s2_next_def_sel_c3;
wire dp_rs2_s2_next_sel_c3;
wire [31:0] dp_rs2_s2_next_stalled_c3;
wire [31:0] dp_rs2_s2_next_offset_c3;
wire dp_rs1_s2_next_def_sel_c3;
wire dp_rs2_s2_next_div_sel_c3;
wire dp_rs2_s2_next_mul2_sel1_c3;
wire dp_rs2_s2_next_mul2_sel2_c3;
wire dp_rs2_s2_next_rf_dp_load_sel_c3;
assign instr_s1_c3 = instr_s1_c2;
assign instr_i_load_s1_c3 = instr_i_load_s1_c2;
assign instr_i_store_s1_c3 = instr_i_store_s1_c2;
assign instr_i_sra_s1_c3 = instr_i_sra_s1_c2;
assign instr_m_mul_s1_c3 = instr_m_mul_s1_c2;
assign instr_m_mulh_s1_c3 = instr_m_mulh_s1_c2;
assign instr_m_mulhsu_s1_c3 = instr_m_mulhsu_s1_c2;
assign instr_m_div_s1_c3 = instr_m_div_s1_c2;
assign instr_m_rem_s1_c3 = instr_m_rem_s1_c2;
assign instr_c_lwsp_s1_c3 = instr_c_lwsp_s1_c2;
assign instr_c_swsp_s1_c3 = instr_c_swsp_s1_c2;
assign instr_c_lw_s1_c3 = instr_c_lw_s1_c2;
assign instr_c_sw_s1_c3 = instr_c_sw_s1_c2;
assign instr_s2_c3 = instr_s2_c2;
assign instr_i_jalr_s2_c3 = instr_i_jalr_s2_c2;
assign instr_m_mul_s2_c3 = instr_m_mul_s2_c2;
assign instr_m_div_s2_c3 = instr_m_div_s2_c2;
assign instr_m_rem_s2_c3 = instr_m_rem_s2_c2;
assign dp_rs1_s2_c3 = dp_rs1_s2_c2;
assign dp_rs2_s2_c3 = dp_rs2_s2_c2;
assign glue_out_c3 = glue_out_c2;
assign pc_s2_c3 = pc_s2_c2;
assign instr_c3 = instr;
assign pc_step_s2_c3 = pc_step_s2;
assign instr_i_load_s2_c3 = instr_i_load_s2_c2;
assign instr_c_lw_s2_c3 = instr_c_lw_s2_c2;
assign instr_c_lwsp_s2_c3 = instr_c_lwsp_s2_c2;
assign pvalid_c3 = pvalid_c2;
assign state_s2_c3 = state_s2_c2;
assign state_eq0_s2_c3 = state_eq0_s2_c2;
assign state_eq1_s2_c3 = state_eq1_s2_c2;
assign state_eq32_s2_c3 = state_eq32_s2_c2;
assign instr_m_divrem_s2_c3 = instr_m_divrem_s2_c2;
assign instr_m_mulx_s2_c3 = instr_m_mulx_s2_c2;
//assign rd_s2_c3 = rd_s2_c2;
assign stalled_next_c3 = stalled_next;
assign dp_shmul_a_s1_c3 = dp_shmul_a_s1;
assign dp_rs1_s1_c3 = dp_rs1_s1;
assign dp_rs2_s1_c3 = dp_rs2_s1;
assign dp_wr_s2_b_c3 = dp_wr_s2_b;
assign dp_add_s2_c3 = dp_add_s2;
assign dp_shmul_s2_c3 = dp_shmul_s2;
assign dp_divrem_rfin_s2_c3 = dp_divrem_rfin_s2;
assign branch_s2_c3 = branch_s2_c2;
assign jump_s2_c3 = jump_s2_c2;
assign pc_dp_d_s2_c3 = pc_dp_d_s2;
assign rs1_wth_s1_c3 = rs1_wth_s1;
assign rs2_wth_s1_c3 = rs2_wth_s1;
assign state_eq31_s2_c3 = state_eq31_s2;
assign dp_rs1_s2_next_sel1_c3 = dp_rs1_s2_next_sel1;
assign dp_rs1_s2_next_div_c3 = dp_rs1_s2_next_div;
assign dp_out_s2_early_c3 = dp_out_s2_early;
assign instr_m_mulhx_s2_c3 = instr_m_mulhx_s2_c2;
assign state_lt3_s2_c3 = state_lt3_s2;
assign state_eq2_s2_c3 = state_eq2_s2;
assign mul_carry_s2_c3 = mul_carry_s2_c2;
assign dp_rs1_s2_next_mul_sel_c3 = dp_rs1_s2_next_mul_sel;
assign dp_lw_s2_sel_c3 = dp_lw_s2_sel;
assign state_s2_next_sel1_c3 = state_s2_next_sel1;
assign state_s2_next_sel2_c3 = state_s2_next_sel2;
assign dp_rs2_s2_next_mul_sel_c3 = dp_rs2_s2_next_mul_sel;
assign dp_rs2_s2_next_sh_sel_c3 = dp_rs2_s2_next_sh_sel;
assign dp_rs2_s2_next_def_sel_c3 = dp_rs2_s2_next_def_sel;
assign dp_rs2_s2_next_sel_c3 = dp_rs2_s2_next_sel;
assign dp_rs2_s2_next_stalled_c3 = dp_rs2_s2_next_stalled;
assign dp_rs2_s2_next_offset_c3 = dp_rs2_s2_next_offset;
assign dp_rs1_s2_next_def_sel_c3 = dp_rs1_s2_next_def_sel;
assign dp_rs2_s2_next_div_sel_c3 = dp_rs2_s2_next_div_sel;
assign dp_rs2_s2_next_mul2_sel1_c3 = dp_rs2_s2_next_mul2_sel1;
assign dp_rs2_s2_next_mul2_sel2_c3 = dp_rs2_s2_next_mul2_sel2;
assign dp_rs2_s2_next_rf_dp_load_sel_c3 = dp_rs2_s2_next_rf_dp_load_sel;
endmodule