u@home:~$

  • branch指令里的jirl

    jirl主要就是把pc+4的值存到rd寄存器里,而且寻址也不是pc+offs,而是[rj]+offs。 在实现上,就相当于branch指令和ALU指令的结合。 既需要跳转,又需要算出地址并写回到rd指定的寄存器里。 526 wire rddata_sel_alu_res_m_l; 527 wire rddata_sel_lsu_res_m_l; 528 wire rddata_sel_bru_res_m_l; 529 530 assign rddata_sel_alu_res_m_l = (lsu_ecl_rdata_valid_m | bru_wen_m); // default is alu resulst if no other module claims it 531 assign rddata_sel_lsu_res_m_l = ~lsu_ecl_rdata_valid_m; 532 assign rddata_sel_bru_res_m_l = ~bru_wen_m; 533 534 dp_mux3ds #(`GRLEN) rd_data_mux(.dout (rd_data_m), 535 .in0 (alu_ecl_res_m),...

  • branch logic

    exu/rtl/sparc_exu.v sparc_exu_ecl ecl( .so (short_so0), .si (short_scan0_1), .rst_tri_en (mux_drive_disable), .byp_ecl_wrccr_data_w(byp_irf_rd_data_w[7:0]), .alu_ecl_adder_out_31_e(exu_ifu_brpc_e[31]), .byp_ecl_rd_data_3lsb_m(exu_tlu_wsr_data_m[2:0]), .alu_ecl_adder_out_7_0_e(exu_ifu_brpc_e[7:0]), ... sparc_exu_alu alu( .byp_alu_rs3_data_e(exu_lsu_rs3_data_e[63:0]), .so (scan0_2), .si (scan0_1), .ifu_lsu_casa_e (ecl_alu_casa_e), /*AUTOINST*/ // Outputs .alu_byp_rd_data_e (alu_byp_rd_data_e[63:0]), .exu_ifu_brpc_e (exu_ifu_brpc_e[47:0]), .exu_lsu_ldst_va_e (exu_lsu_ldst_va_e[47:0]), .exu_lsu_early_va_e(exu_lsu_early_va_e[10:3]), .exu_mmu_early_va_e(exu_mmu_early_va_e[7:0]), .alu_ecl_add_n64_e (alu_ecl_add_n64_e), .alu_ecl_add_n32_e (alu_ecl_add_n32_e), .alu_ecl_log_n64_e (alu_ecl_log_n64_e), .alu_ecl_log_n32_e (alu_ecl_log_n32_e), ... exu_ifu_brpc_e是exu给ifu的branch地址,可以看到这部分是在_e得出的。 从文档里也看到branch address的计算也是复用了ALU,应该就是ALU里的exu_ifu_brpc_e。 而在sparc_ifu.v里却有这个 // Branch Logic...

  • LSU data_recv, 又用了回逻辑开关

    data_recv的逻辑就是在data_addr_ok以后为1,表示等待接收数据和data_data_ok信号。 data_recv应该是这个意思。 data_addr_ok __--______________ data_data_ok ______________--__ data_recv ____------------__ 这个还是个开关一样的逻辑,data_addr_ok data_data_ok都是只给1个cycle。 402 wire lsu_recv_next; 403 404 assign lsu_recv_next = (lsu_recv | data_addr_ok) & (~data_data_ok); 405 406 dff_s #(1) lsu_recv_reg ( 407 .din (lsu_recv_next), 408 .clk (clk), 409 .q (lsu_recv), 410 .se(), .si(), .so());