1.1 --- a/lm32_cpu.v Sun Mar 06 19:49:17 2011 +0000 1.2 +++ b/lm32_cpu.v Sun Mar 06 21:03:32 2011 +0000 1.3 @@ -1269,70 +1269,44 @@ 1.4 /*---------------------------------------------------------------------- 1.5 Register file instantiation as Pseudo-Dual Port EBRs. 1.6 ----------------------------------------------------------------------*/ 1.7 - pmi_ram_dp 1.8 + // Modified by GSI: removed non-portable RAM instantiation 1.9 + lm32_dp_ram 1.10 #( 1.11 // ----- Parameters ----- 1.12 - .pmi_wr_addr_depth(1<<5), 1.13 - .pmi_wr_addr_width(5), 1.14 - .pmi_wr_data_width(32), 1.15 - .pmi_rd_addr_depth(1<<5), 1.16 - .pmi_rd_addr_width(5), 1.17 - .pmi_rd_data_width(32), 1.18 - .pmi_regmode("noreg"), 1.19 - .pmi_gsr("enable"), 1.20 - .pmi_resetmode("sync"), 1.21 - .pmi_init_file("none"), 1.22 - .pmi_init_file_format("binary"), 1.23 - .pmi_family(`LATTICE_FAMILY), 1.24 - .module_type("pmi_ram_dp") 1.25 + .addr_depth(1<<5), 1.26 + .addr_width(5), 1.27 + .data_width(32) 1.28 ) 1.29 reg_0 1.30 ( 1.31 // ----- Inputs ----- 1.32 - .Data(w_result), 1.33 - .WrAddress(write_idx_w), 1.34 - .RdAddress(instruction_f[25:21]), 1.35 - .WrClock(clk_i), 1.36 - .RdClock(clk_i), 1.37 - .WrClockEn(`TRUE), 1.38 - .RdClockEn(`TRUE), 1.39 - .WE(reg_write_enable_q_w), 1.40 - .Reset(rst_i), 1.41 + .clk_i (clk_i), 1.42 + .rst_i (rst_i), 1.43 + .we_i (reg_write_enable_q_w), 1.44 + .wdata_i (w_result), 1.45 + .waddr_i (write_idx_w), 1.46 + .raddr_i (instruction_f[25:21]), 1.47 // ----- Outputs ----- 1.48 - .Q(regfile_data_0) 1.49 + .rdata_o (regfile_data_0) 1.50 ); 1.51 1.52 - pmi_ram_dp 1.53 + lm32_dp_ram 1.54 #( 1.55 - // ----- Parameters ----- 1.56 - .pmi_wr_addr_depth(1<<5), 1.57 - .pmi_wr_addr_width(5), 1.58 - .pmi_wr_data_width(32), 1.59 - .pmi_rd_addr_depth(1<<5), 1.60 - .pmi_rd_addr_width(5), 1.61 - .pmi_rd_data_width(32), 1.62 - .pmi_regmode("noreg"), 1.63 - .pmi_gsr("enable"), 1.64 - .pmi_resetmode("sync"), 1.65 - .pmi_init_file("none"), 1.66 - .pmi_init_file_format("binary"), 1.67 - .pmi_family(`LATTICE_FAMILY), 1.68 - .module_type("pmi_ram_dp") 1.69 + .addr_depth(1<<5), 1.70 + .addr_width(5), 1.71 + .data_width(32) 1.72 ) 1.73 reg_1 1.74 ( 1.75 // ----- Inputs ----- 1.76 - .Data(w_result), 1.77 - .WrAddress(write_idx_w), 1.78 - .RdAddress(instruction_f[20:16]), 1.79 - .WrClock(clk_i), 1.80 - .RdClock(clk_i), 1.81 - .WrClockEn(`TRUE), 1.82 - .RdClockEn(`TRUE), 1.83 - .WE(reg_write_enable_q_w), 1.84 - .Reset(rst_i), 1.85 + .clk_i (clk_i), 1.86 + .rst_i (rst_i), 1.87 + .we_i (reg_write_enable_q_w), 1.88 + .wdata_i (w_result), 1.89 + .waddr_i (write_idx_w), 1.90 + .raddr_i (instruction_f[20:16]), 1.91 // ----- Outputs ----- 1.92 - .Q(regfile_data_1) 1.93 + .rdata_o (regfile_data_1) 1.94 ); 1.95 `endif 1.96 1.97 @@ -1882,7 +1856,9 @@ 1.98 exception has occured. This stall will ensure that D_CYC_O and 1.99 store_m will both be low for one cycle. 1.100 */ 1.101 +`ifdef CFG_INTERRUPTS_ENABLED 1.102 || ((store_x == `TRUE) && (interrupt_exception == `TRUE)) 1.103 +`endif 1.104 || (load_m == `TRUE) 1.105 || (load_x == `TRUE) 1.106 ) 1.107 @@ -2042,15 +2018,29 @@ 1.108 1.109 // Cache flush 1.110 `ifdef CFG_ICACHE_ENABLED 1.111 -assign iflush = (csr_write_enable_d == `TRUE) 1.112 - && (csr_d == `LM32_CSR_ICC) 1.113 - && (stall_d == `FALSE) 1.114 - && (kill_d == `FALSE) 1.115 - && (valid_d == `TRUE); 1.116 +assign iflush = ( (csr_write_enable_d == `TRUE) 1.117 + && (csr_d == `LM32_CSR_ICC) 1.118 + && (stall_d == `FALSE) 1.119 + && (kill_d == `FALSE) 1.120 + && (valid_d == `TRUE)) 1.121 +// Added by GSI: needed to flush cache after loading firmware per JTAG 1.122 +`ifdef CFG_HW_DEBUG_ENABLED 1.123 + || 1.124 + ( (jtag_csr_write_enable == `TRUE) 1.125 + && (jtag_csr == `LM32_CSR_ICC)) 1.126 +`endif 1.127 + ; 1.128 `endif 1.129 `ifdef CFG_DCACHE_ENABLED 1.130 -assign dflush_x = (csr_write_enable_q_x == `TRUE) 1.131 - && (csr_x == `LM32_CSR_DCC); 1.132 +assign dflush_x = ( (csr_write_enable_q_x == `TRUE) 1.133 + && (csr_x == `LM32_CSR_DCC)) 1.134 +// Added by GSI: needed to flush cache after loading firmware per JTAG 1.135 +`ifdef CFG_HW_DEBUG_ENABLED 1.136 + || 1.137 + ( (jtag_csr_write_enable == `TRUE) 1.138 + && (jtag_csr == `LM32_CSR_DCC)) 1.139 +`endif 1.140 + ; 1.141 `endif 1.142 1.143 // Extract CSR index 1.144 @@ -2252,7 +2242,7 @@ 1.145 operand_0_x <= {`LM32_WORD_WIDTH{1'b0}}; 1.146 operand_1_x <= {`LM32_WORD_WIDTH{1'b0}}; 1.147 store_operand_x <= {`LM32_WORD_WIDTH{1'b0}}; 1.148 - branch_target_x <= {`LM32_WORD_WIDTH{1'b0}}; 1.149 + branch_target_x <= {`LM32_PC_WIDTH{1'b0}}; 1.150 x_result_sel_csr_x <= `FALSE; 1.151 `ifdef LM32_MC_ARITHMETIC_ENABLED 1.152 x_result_sel_mc_arith_x <= `FALSE; 1.153 @@ -2313,7 +2303,7 @@ 1.154 `endif 1.155 csr_write_enable_x <= `FALSE; 1.156 operand_m <= {`LM32_WORD_WIDTH{1'b0}}; 1.157 - branch_target_m <= {`LM32_WORD_WIDTH{1'b0}}; 1.158 + branch_target_m <= {`LM32_PC_WIDTH{1'b0}}; 1.159 m_result_sel_compare_m <= `FALSE; 1.160 `ifdef CFG_PL_BARREL_SHIFT_ENABLED 1.161 m_result_sel_shift_m <= `FALSE;