-
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());
-
BUG FIX pc_f到pc_d,在指令还没fetch回来的时候就把pc_f传给pc_d了。
这部分传递受到exu_ifu_stall_req控制,同时也受inst_valid控制。 就算是ALU指令也不应该是阶梯一样,每个cycle都向下传,因为这里fetch指令的时候要5个周期。 应该是下面蓝线这样,pc_bf和pc_f以后就停住了,直到新的pc_bf处的指令读回来了,这个时候pc_bf+4,pc_f再次获得pc_bf的值。 在时序图里,会有一个时刻,pc_f和pc_bf值一样,指向下一条指令,而且inst为0,这时候_f阶段的valid信号也是0。 当时在想,这个时候要不要不让pc_f等于pc_bf,因为如果这个时候要用pc_f的值并不正确,等指令fetch到了pc_f再更新才好。 我看了OpenSPARC,也是这样。 ifu/rtl/sparc_ifu_fdp.v // assign fdp_icd_vaddr_bf = icaddr_bf[47:0]; // this goes to the itlb, icd and ict on top of fdp // this is !!very critical!! assign fdp_icd_vaddr_bf = pc_bf[47:2]; // create separate output for the icv to the left assign fdp_icv_index_bf = pc_bf[11:5]; // Place...