leg.v

来自「verilog hdl编写,六段流水线CPU.程序完整」· Verilog 代码 · 共 1,311 行 · 第 1/5 页

V
1,311
字号

wire            d_op_decoded_ls_b_or_w;         //byte or word indicate
wire            d_op_decoded_ls_u;              // u bit 
wire            d_op_decoded_ls_p;              // update rn
wire            d_op_decoded_ls_pre_addr;
//branch and link
reg     [27:0]  d_link_addr;
reg     [4:0]   rf_raddra_r;
wire            d_op_decoded_br;
wire    [31:0]  d_op_decoded_addr_ext;
wire            d_op_decoded_br_l_bit;
wire            d_ar_load_r15;

//software interrupt
wire            d_op_decoded_swi;
wire            d_op_decoded_undefined;
//stall condition
wire            d_ls_stall_drd_eq_frs;  //d_ls_stall_drd_eq_frs: current read address rs or rm == last load rd ------------- cause 2 cycle stall
wire            d_ls_stall_drn_eq_frs;  //d_ls_stall_drn_eq_frs: current read address rs or rm == last ls post write rn ---- cause 1 cycle stall
wire            d_ls_stall_drd_eq_frn;  //d_ls_stall_drd_eq_frn: current read address rn  == last load  rd ----------------- cause 1 cycle stall
wire            d_ar_stall_drd_eq_frs;  //d_ar_stall_drd_eq_frs: current read address rs or rm == last write rd------------- cause 1 cycle stall
wire            d_ar_stall_d_shift_and_c_wait;
//barrier shifter
wire    [31:00] shifter_result;
wire    [31:00] shifter_oprand;  
wire    [4:0]   shifter_opcode;
wire    [2:0]   shifter_mode;
wire            shifter_direction;
wire            shifter_carry_in;
wire            shifter_carry_out;
reg             shifter_carry_r;
wire            d_shifter_op_immd;
wire            d_shifter_op_logic_shiftl_by_immd;
wire            d_shifter_op_logic_shiftr_by_immd;
wire            d_shifter_op_arthm_shiftr_by_immd;
wire            d_shifter_op_rotater_by_immd;
wire            d_shifter_op_rotater_immd;

wire            d_shifter_op_logic_shiftl_by_regd;
wire            d_shifter_op_logic_shiftr_by_regd;
wire            d_shifter_op_arthm_shiftr_by_regd;
wire            d_shifter_op_rotater_by_regd;
wire            d_shifter_op_rotater_with_ext;
wire            d_op_decoded_carry_from_arithm;
//rf related
reg     [4:0]   d_op_decoded_raddrc;
wire    [4:0]   d_op_decoded_waddra;

//cpsr related
wire            d_op_decoded_msr;
wire            d_op_decoded_mrs;
wire    [7:0]   d_op_deocded_msr_mask_c;
wire    [7:0]   d_op_deocded_msr_mask_x;
wire    [7:0]   d_op_deocded_msr_mask_s;
wire    [7:0]   d_op_deocded_msr_mask_f;
wire    [31:0]  d_op_deocded_msr_mask;
wire            d_op_decoded_msr_r_bit;
wire            d_op_decoded_mrs_r_bit;
reg             d_lsm_restore_rd_valid;
reg     [3:0]   d_lsm_inst_count;
//register read stage
//arithmetic
reg             r_op_decoded_and;
reg             r_op_decoded_eor;
reg             r_op_decoded_sub;
reg             r_op_decoded_rsb;
reg             r_op_decoded_add;
reg             r_op_decoded_adc;
reg             r_op_decoded_sbc;
reg             r_op_decoded_rsc;
reg             r_op_decoded_tst;
reg             r_op_decoded_teq;
reg             r_op_decoded_cmp;
reg             r_op_decoded_cmn;
reg             r_op_decoded_orr;
reg             r_op_decoded_mov;
reg             r_op_decoded_bic;
reg             r_op_decoded_mvn;
reg             r_op_decoded_mul;
reg     [31:0]  shift_result_r;

//condition codes
reg             r_op_cond_eqz;
reg             r_op_cond_nez;
reg             r_op_cond_csc;
reg             r_op_cond_ccc;
reg             r_op_cond_min;
reg             r_op_cond_pln;
reg             r_op_cond_vsv;
reg             r_op_cond_vcv;
reg             r_op_cond_hic;
reg             r_op_cond_lsc;
reg             r_op_cond_gen;
reg             r_op_cond_ltn;
reg             r_op_cond_gtz;
reg             r_op_cond_lez;
reg             r_op_cond_al; 
reg             r_op_cond_nv; 

//r stage decoding
reg     [3:0]   r_op_rd;
reg     [3:0]   r_op_rn;
reg             r_op_decoded_ldr;
reg             r_op_decoded_str;
reg             r_op_decoded_ls_b_or_w;       //byte or word indicate
reg             r_op_decoded_ls_u;
reg             r_op_decoded_ls_p;
reg             r_op_decoded_ls_pre_addr;
reg             r_op_decoded_br;
reg     [31:0]  r_op_decoded_addr_ext;
reg             r_op_decoded_br_l_bit;
reg             r_write_porta_ena;
reg             r_write_portb_ena;
reg             r_op_decoded_ar;
wire    [4:0]   r_op_decoded_waddra;
reg             r_op_deocded_mult_accm;
reg             r_op_decoded_swi;
//control and branch
reg             r_op_s_bit;
reg     [27:0]  r_link_addr;
wire            r_exec;
wire            r_condition_passed;
wire            r_ls_stall_drd_eq_frs;
wire            r_ar_accm_stall_drd_eq_frs;
wire            r_ar_mull_stall_drh_eq_frs;
reg             r_foward_ena;
reg             r_op_decoded_carry_from_arithm;
//alu related
wire    [31:0]  r_opranda;
wire    [31:0]  r_oprandb;
wire    [31:0]  r_logic_opranda;
wire    [31:0]  r_logic_oprandb;
wire    [31:0]  r_add_sub_opranda;
wire    [31:0]  r_add_sub_oprandb;
wire            r_add_sub_carry_in;
wire            r_add_sub_carry_out;
wire            r_add_sub_overflow;
wire    [33:0]  r_add_sub_result_pre;
wire    [31:0]  r_add_sub_result;
wire            r_op_add_sub;   //1 meas add and 0 means subtraction
wire    [31:0]  r_and_result;
wire    [31:0]  r_or_result;
wire    [31:0]  r_xor_result;
wire    [31:0]  r_logic_reslut;
wire    [31:0]  r_alu_result;
reg             r_load_r15;
reg             r_lsm_restore_rd_valid;
reg     [3:0]   r_lsm_inst_count;

wire    [31:0]  mult_result_low;
wire    [31:0]  mult_result_high;
reg             r_mult_long_r;
reg 	[31:0]	mult_opranda;
reg 	[31:0]	mult_oprandb;


//a stage related
reg     [3:0]   a_op_rd;
reg     [3:0]   a_op_rn;

reg             a_write_porta_ena;
reg             a_write_portb_ena;
reg             a_op_decoded_mul;
reg             a_mult_long_r;

reg             a_op_decoded_ldr;
reg             a_op_decoded_str;
reg             a_op_decoded_ls_b_or_w;       //byte or word indicate
reg             a_op_decoded_ls_u;
reg             a_op_decoded_ls_p;
reg             a_op_decoded_ls_pre_addr;
reg     [31:0]  a_str_dataout;
reg             a_op_decoded_br;
reg             a_op_decoded_br_l_bit;
reg     [31:0]  a_op_decoded_addr_ext;
reg     [27:0]  a_link_addr;
reg             a_exec;
reg             a_condition_passed;
wire            a_br_exec;
reg             a_op_deocded_mult_accm;
reg     [31:0]  a_alu_result_r;
reg     [31:0]  a_mla_opranda_r;
//write port a decoding
wire    [4:0]   a_post_indexed_waddr;
wire    [4:0]   a_arth_waddr;
wire    [4:0]   a_link_r14;
wire            a_load_r15;
reg     [4:0]   a_op_decoded_waddra;
wire    [4:0]   a_op_decoded_waddrb;
reg             a_foward_ena;
wire    [31:0]  a_mla_result;
reg     [31:0]  a_ls_rn_data;
reg             a_irq_exec;
reg             a_lsm_restore_rd_valid;
reg     [3:0]   a_lsm_inst_count;
reg     [31:0]  a_lsm_inst_store_addr;
//w stage
reg     [3:0]   w_op_rd;
reg     [1:0]   w_low_addr;
reg     [4:0]   w_op_decoded_waddrb;
reg             w_op_decoded_ldr;
reg             w_op_decoded_str;
reg             w_op_decoded_ls_b_or_w;       //byte or word indicate
reg             w_op_decoded_ls_u;
reg             w_op_decoded_ls_p;
wire    [31:0]  w_d_shift_result;
reg             w_mult_long_r;
reg             w_op_deocded_mult_accm;
wire            w_load_r15;
reg             w_foward_ena;
reg             w_write_portb_ena;
reg     [31:0]  w_mla_result_r;
//data alignment
wire    [31:0]  w_d_lda;
wire    [31:0]  w_d_ldb;
//io related
wire            d_data_valid;

//register file related
wire    [4:0]   rf_raddra;
wire    [4:0]   rf_raddrb; 
wire    [4:0]   rf_raddrc;
wire    [31:0]  rf_rdataa;
wire    [31:0]  rf_rdatab;
wire    [31:0]  rf_rdatac;
wire    [4:0]   rf_waddra;
wire    [4:0]   rf_waddrb;
wire    [31:0]  rf_wdataa;
wire    [31:0]  rf_wdatab;
wire            rf_wea;
wire            rf_web;

//----------------cpsr and cpsr related
reg     [31:0]  cpsr;
reg     [31:0]  spsr_fiq;
reg     [31:0]  spsr_svc;
reg     [31:0]  spsr_abt;
reg     [31:0]  spsr_irq;
reg     [31:0]  spsr_und;       //it's not worth to implemented them into a m4k, so I just left them as registers
wire    [31:0]  current_spsr;

wire            cpsr_n_o;
wire            cpsr_z_o;
wire            cpsr_c_o;
wire            cpsr_v_o;
wire            cpsr_q_o;       //not implemented
wire    [18:00] cpsr_dnm_o;     //not implemented
wire            cpsr_i_o;       //irq control 1: irq disable
wire            cpsr_f_o;       //frq control 1: frq disable
wire            cpsr_t_o;       //thumb state, not implemented
wire    [04:00] cpsr_m_o;       //mode registers

wire            cpsr_n_i;
wire            cpsr_z_i;
wire            cpsr_c_i;
wire            cpsr_v_i;
wire            cpsr_q_i;       //not implemented
wire    [18:00] cpsr_dnm_i;     //not implemented
wire            cpsr_i_i;       //irq control 1: irq disable
wire            cpsr_f_i;       //frq control 1: frq disable
wire            cpsr_t_i;       //thumb state, not implemented
wire    [04:00] cpsr_m_i;       //mode registers

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?