Remove Config of IRQ, Use reg module from latch.
This commit is contained in:
		
							parent
							
								
									9c0d7d7593
								
							
						
					
					
						commit
						9adf1c0029
					
				
							
								
								
									
										135
									
								
								picorv32.v
								
								
								
								
							
							
						
						
									
										135
									
								
								picorv32.v
								
								
								
								
							|  | @ -38,9 +38,6 @@ | |||
| `define assert(assert_expr) empty_statement | ||||
| `define FORMAL_KEEP | ||||
| 
 | ||||
| // uncomment this for register file in extra module | ||||
| // `define PICORV32_REGS picorv32_regs | ||||
| 
 | ||||
| // this macro can be used to check if the verilog files in your | ||||
| // design are read in the correct order. | ||||
| `define PICORV32_V | ||||
|  | @ -55,9 +52,6 @@ module picorv32 #( | |||
| 	parameter [ 0:0] BARREL_SHIFTER = 0, | ||||
| 	parameter [ 0:0] TWO_CYCLE_COMPARE = 0, | ||||
| 	parameter [ 0:0] TWO_CYCLE_ALU = 0, | ||||
| 	parameter [ 0:0] ENABLE_IRQ = 0, | ||||
| 	parameter [ 0:0] ENABLE_IRQ_QREGS = 1, | ||||
| 	parameter [ 0:0] ENABLE_IRQ_TIMER = 1, | ||||
| 	parameter [ 0:0] ENABLE_TRACE = 0, | ||||
| 	parameter [31:0] MASKED_IRQ = 32'h 0000_0000, | ||||
| 	parameter [31:0] LATCHED_IRQ = 32'h ffff_ffff, | ||||
|  | @ -107,8 +101,8 @@ module picorv32 #( | |||
| 	localparam integer irq_buserror = 2; | ||||
| 
 | ||||
| 	localparam integer irqregs_offset = 32; | ||||
| 	localparam integer regfile_size = 32 + 4*ENABLE_IRQ*ENABLE_IRQ_QREGS; | ||||
| 	localparam integer regindex_bits = 5 + ENABLE_IRQ*ENABLE_IRQ_QREGS; | ||||
| 	localparam integer regfile_size = 32 + 4; | ||||
| 	localparam integer regindex_bits = 5 + 1; | ||||
| 
 | ||||
| 	localparam WITH_PCPI = 1; // AAAA | ||||
| 
 | ||||
|  | @ -143,10 +137,6 @@ module picorv32 #( | |||
| 	reg [31:0] irq_pending; | ||||
| 	reg [31:0] timer; | ||||
| 
 | ||||
| `ifndef PICORV32_REGS | ||||
| 	reg [31:0] cpuregs [0:regfile_size-1]; | ||||
| `endif | ||||
| 
 | ||||
| 	task empty_statement; | ||||
| 		// This task is used by the `assert directive in non-formal mode to | ||||
| 		// avoid empty statement (which are unsupported by plain Verilog syntax). | ||||
|  | @ -602,8 +592,8 @@ module picorv32 #( | |||
| 			instr_auipc   <= mem_rdata_latched[6:0] == 7'b0010111; | ||||
| 			instr_jal     <= mem_rdata_latched[6:0] == 7'b1101111; | ||||
| 			instr_jalr    <= mem_rdata_latched[6:0] == 7'b1100111 && mem_rdata_latched[14:12] == 3'b000; | ||||
| 			instr_retirq  <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010 && ENABLE_IRQ; | ||||
| 			instr_waitirq <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000100 && ENABLE_IRQ; | ||||
| 			instr_retirq  <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010; | ||||
| 			instr_waitirq <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000100; | ||||
| 
 | ||||
| 			is_beq_bne_blt_bge_bltu_bgeu <= mem_rdata_latched[6:0] == 7'b1100011; | ||||
| 			is_lb_lh_lw_lbu_lhu          <= mem_rdata_latched[6:0] == 7'b0000011; | ||||
|  | @ -617,11 +607,11 @@ module picorv32 #( | |||
| 			decoded_rs1 <= mem_rdata_latched[19:15]; | ||||
| 			decoded_rs2 <= mem_rdata_latched[24:20]; | ||||
| 
 | ||||
| 			if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000000 && ENABLE_IRQ && ENABLE_IRQ_QREGS) | ||||
| 			if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000000) | ||||
| 				decoded_rs1[regindex_bits-1] <= 1; // instr_getq | ||||
| 
 | ||||
| 			if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010 && ENABLE_IRQ) | ||||
| 				decoded_rs1 <= ENABLE_IRQ_QREGS ? irqregs_offset : 3; // instr_retirq | ||||
| 			if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010) | ||||
| 				decoded_rs1 <= irqregs_offset; // instr_retirq | ||||
| 
 | ||||
| 			compressed_instr <= 0; | ||||
| 		end | ||||
|  | @ -677,10 +667,10 @@ module picorv32 #( | |||
| 
 | ||||
| 			instr_ecall_ebreak <= (mem_rdata_q[6:0] == 7'b1110011 && !mem_rdata_q[31:21] && !mem_rdata_q[19:7]); | ||||
| 
 | ||||
| 			instr_getq    <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000000 && ENABLE_IRQ && ENABLE_IRQ_QREGS; | ||||
| 			instr_setq    <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000001 && ENABLE_IRQ && ENABLE_IRQ_QREGS; | ||||
| 			instr_maskirq <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000011 && ENABLE_IRQ; | ||||
| 			instr_timer   <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000101 && ENABLE_IRQ && ENABLE_IRQ_TIMER; | ||||
| 			instr_getq    <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000000; | ||||
| 			instr_setq    <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000001; | ||||
| 			instr_maskirq <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000011; | ||||
| 			instr_timer   <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000101; | ||||
| 
 | ||||
| 			is_slli_srli_srai <= is_alu_reg_imm && |{ | ||||
| 				mem_rdata_q[14:12] == 3'b001 && mem_rdata_q[31:25] == 7'b0000000, | ||||
|  | @ -868,11 +858,6 @@ module picorv32 #( | |||
| 			BARREL_SHIFTER && (instr_srl || instr_srli || instr_sra || instr_srai): | ||||
| 				alu_out = alu_shr; | ||||
| 		endcase | ||||
| 
 | ||||
| `ifdef RISCV_FORMAL_BLACKBOX_ALU | ||||
| 		alu_out_0 = $anyseq; | ||||
| 		alu_out = $anyseq; | ||||
| `endif | ||||
| 	end | ||||
| 
 | ||||
| 	reg cpuregs_write; | ||||
|  | @ -896,11 +881,11 @@ module picorv32 #( | |||
| 					cpuregs_wrdata = latched_stalu ? alu_out_q : reg_out; | ||||
| 					cpuregs_write = 1; | ||||
| 				end | ||||
| 				ENABLE_IRQ && irq_state[0]: begin | ||||
| 				irq_state[0]: begin | ||||
| 					cpuregs_wrdata = reg_next_pc | latched_compr; | ||||
| 					cpuregs_write = 1; | ||||
| 				end | ||||
| 				ENABLE_IRQ && irq_state[1]: begin | ||||
| 				irq_state[1]: begin | ||||
| 					cpuregs_wrdata = irq_pending & ~irq_mask; | ||||
| 					cpuregs_write = 1; | ||||
| 				end | ||||
|  | @ -908,30 +893,6 @@ module picorv32 #( | |||
| 		end | ||||
| 	end | ||||
| 
 | ||||
| `ifndef PICORV32_REGS | ||||
| 	always @(posedge clk) begin | ||||
| 		if (resetn && cpuregs_write && latched_rd) | ||||
| `ifdef PICORV32_TESTBUG_001 | ||||
| 			cpuregs[latched_rd ^ 1] <= cpuregs_wrdata; | ||||
| `elsif PICORV32_TESTBUG_002 | ||||
| 			cpuregs[latched_rd] <= cpuregs_wrdata ^ 1; | ||||
| `else | ||||
| 			cpuregs[latched_rd] <= cpuregs_wrdata; | ||||
| `endif | ||||
| 	end | ||||
| 
 | ||||
| 	always @* begin | ||||
| 		decoded_rs = 'bx; | ||||
| `ifndef RISCV_FORMAL_BLACKBOX_REGS | ||||
| 		cpuregs_rs1 = decoded_rs1 ? cpuregs[decoded_rs1] : 0; | ||||
| 		cpuregs_rs2 = decoded_rs2 ? cpuregs[decoded_rs2] : 0; | ||||
| `else | ||||
| 		cpuregs_rs1 = decoded_rs1 ? $anyseq : 0; | ||||
| 		cpuregs_rs2 = decoded_rs2 ? $anyseq : 0; | ||||
| `endif | ||||
| 
 | ||||
| 	end | ||||
| `else | ||||
| 	wire[31:0] cpuregs_rdata1; | ||||
| 	wire[31:0] cpuregs_rdata2; | ||||
| 
 | ||||
|  | @ -939,7 +900,7 @@ module picorv32 #( | |||
| 	wire [5:0] cpuregs_raddr1 = decoded_rs1; | ||||
| 	wire [5:0] cpuregs_raddr2 = decoded_rs2; | ||||
| 
 | ||||
| 	`PICORV32_REGS cpuregs ( | ||||
| 	picorv32_regs cpuregs ( | ||||
| 		.clk(clk), | ||||
| 		.wen(resetn && cpuregs_write && latched_rd), | ||||
| 		.waddr(cpuregs_waddr), | ||||
|  | @ -955,9 +916,8 @@ module picorv32 #( | |||
| 		cpuregs_rs1 = decoded_rs1 ? cpuregs_rdata1 : 0; | ||||
| 		cpuregs_rs2 = decoded_rs2 ? cpuregs_rdata2 : 0; | ||||
| 	end | ||||
| `endif | ||||
| 
 | ||||
| 	assign launch_next_insn = cpu_state == cpu_state_fetch && decoder_trigger && (!ENABLE_IRQ || irq_delay || irq_active || !(irq_pending & ~irq_mask)); | ||||
| 	assign launch_next_insn = cpu_state == cpu_state_fetch && decoder_trigger && (irq_delay || irq_active || !(irq_pending & ~irq_mask)); | ||||
| 
 | ||||
| 	always @(posedge clk) begin | ||||
| 		trap <= 0; | ||||
|  | @ -989,9 +949,9 @@ module picorv32 #( | |||
| 			pcpi_timeout <= !pcpi_timeout_counter; | ||||
| 		end | ||||
| 		count_cycle <= resetn ? count_cycle + 1 : 0; | ||||
| 		next_irq_pending = ENABLE_IRQ ? irq_pending & LATCHED_IRQ : 'bx; | ||||
| 		next_irq_pending = irq_pending & LATCHED_IRQ; | ||||
| 
 | ||||
| 		if (ENABLE_IRQ && ENABLE_IRQ_TIMER && timer) begin | ||||
| 		if (timer) begin | ||||
| 			timer <= timer - 1; | ||||
| 		end | ||||
| 
 | ||||
|  | @ -1054,12 +1014,12 @@ module picorv32 #( | |||
| 					latched_store && !latched_branch: begin | ||||
| 						`debug($display("ST_RD:  %2d 0x%08x", latched_rd, latched_stalu ? alu_out_q : reg_out);) | ||||
| 					end | ||||
| 					ENABLE_IRQ && irq_state[0]: begin | ||||
| 					irq_state[0]: begin | ||||
| 						current_pc = PROGADDR_IRQ; | ||||
| 						irq_active <= 1; | ||||
| 						mem_do_rinst <= 1; | ||||
| 					end | ||||
| 					ENABLE_IRQ && irq_state[1]: begin | ||||
| 					irq_state[1]: begin | ||||
| 						eoi <= irq_pending & ~irq_mask; | ||||
| 						next_irq_pending = next_irq_pending & irq_mask; | ||||
| 					end | ||||
|  | @ -1086,17 +1046,14 @@ module picorv32 #( | |||
| 				latched_rd <= decoded_rd; | ||||
| 				latched_compr <= compressed_instr; | ||||
| 
 | ||||
| 				if (ENABLE_IRQ && ((decoder_trigger && !irq_active && !irq_delay && |(irq_pending & ~irq_mask)) || irq_state)) begin | ||||
| 				if (((decoder_trigger && !irq_active && !irq_delay && |(irq_pending & ~irq_mask)) || irq_state)) begin | ||||
| 					irq_state <= | ||||
| 						irq_state == 2'b00 ? 2'b01 : | ||||
| 						irq_state == 2'b01 ? 2'b10 : 2'b00; | ||||
| 					latched_compr <= latched_compr; | ||||
| 					if (ENABLE_IRQ_QREGS) | ||||
| 						latched_rd <= irqregs_offset | irq_state[0]; | ||||
| 					else | ||||
| 						latched_rd <= irq_state[0] ? 4 : 3; | ||||
| 					latched_rd <= irqregs_offset | irq_state[0]; | ||||
| 				end else | ||||
| 				if (ENABLE_IRQ && (decoder_trigger || do_waitirq) && instr_waitirq) begin | ||||
| 				if ((decoder_trigger || do_waitirq) && instr_waitirq) begin | ||||
| 					if (irq_pending) begin | ||||
| 						latched_store <= 1; | ||||
| 						reg_out <= irq_pending; | ||||
|  | @ -1152,7 +1109,7 @@ module picorv32 #( | |||
| 							if (pcpi_timeout || instr_ecall_ebreak) begin | ||||
| 								pcpi_valid <= 0; | ||||
| 								`debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);) | ||||
| 								if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 								if (!irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 									next_irq_pending[irq_ebreak] = 1; | ||||
| 									cpu_state <= cpu_state_fetch; | ||||
| 								end else | ||||
|  | @ -1160,7 +1117,7 @@ module picorv32 #( | |||
| 							end | ||||
| 						end else begin | ||||
| 							`debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);) | ||||
| 							if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 							if (!irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 								next_irq_pending[irq_ebreak] = 1; | ||||
| 								cpu_state <= cpu_state_fetch; | ||||
| 							end else | ||||
|  | @ -1191,7 +1148,7 @@ module picorv32 #( | |||
| 							mem_do_rinst <= mem_do_prefetch; | ||||
| 						cpu_state <= cpu_state_exec; | ||||
| 					end | ||||
| 					ENABLE_IRQ && ENABLE_IRQ_QREGS && instr_getq: begin | ||||
| 					instr_getq: begin | ||||
| 						`debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);) | ||||
| 						reg_out <= cpuregs_rs1; | ||||
| 						dbg_rs1val <= cpuregs_rs1; | ||||
|  | @ -1199,7 +1156,7 @@ module picorv32 #( | |||
| 						latched_store <= 1; | ||||
| 						cpu_state <= cpu_state_fetch; | ||||
| 					end | ||||
| 					ENABLE_IRQ && ENABLE_IRQ_QREGS && instr_setq: begin | ||||
| 					instr_setq: begin | ||||
| 						`debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);) | ||||
| 						reg_out <= cpuregs_rs1; | ||||
| 						dbg_rs1val <= cpuregs_rs1; | ||||
|  | @ -1208,7 +1165,7 @@ module picorv32 #( | |||
| 						latched_store <= 1; | ||||
| 						cpu_state <= cpu_state_fetch; | ||||
| 					end | ||||
| 					ENABLE_IRQ && instr_retirq: begin | ||||
| 					instr_retirq: begin | ||||
| 						eoi <= 0; | ||||
| 						irq_active <= 0; | ||||
| 						latched_branch <= 1; | ||||
|  | @ -1219,7 +1176,7 @@ module picorv32 #( | |||
| 						dbg_rs1val_valid <= 1; | ||||
| 						cpu_state <= cpu_state_fetch; | ||||
| 					end | ||||
| 					ENABLE_IRQ && instr_maskirq: begin | ||||
| 					instr_maskirq: begin | ||||
| 						latched_store <= 1; | ||||
| 						reg_out <= irq_mask; | ||||
| 						`debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);) | ||||
|  | @ -1228,7 +1185,7 @@ module picorv32 #( | |||
| 						dbg_rs1val_valid <= 1; | ||||
| 						cpu_state <= cpu_state_fetch; | ||||
| 					end | ||||
| 					ENABLE_IRQ && ENABLE_IRQ_TIMER && instr_timer: begin | ||||
| 					instr_timer: begin | ||||
| 						latched_store <= 1; | ||||
| 						reg_out <= timer; | ||||
| 						`debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);) | ||||
|  | @ -1318,7 +1275,7 @@ module picorv32 #( | |||
| 						if (pcpi_timeout || instr_ecall_ebreak) begin | ||||
| 							pcpi_valid <= 0; | ||||
| 							`debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);) | ||||
| 							if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 							if (!irq_mask[irq_ebreak] && !irq_active) begin | ||||
| 								next_irq_pending[irq_ebreak] = 1; | ||||
| 								cpu_state <= cpu_state_fetch; | ||||
| 							end else | ||||
|  | @ -1453,24 +1410,22 @@ module picorv32 #( | |||
| 			end | ||||
| 		endcase | ||||
| 
 | ||||
| 		if (ENABLE_IRQ) begin | ||||
| 			next_irq_pending = next_irq_pending | irq; | ||||
| 			if(ENABLE_IRQ_TIMER && timer) | ||||
| 				if (timer - 1 == 0) | ||||
| 					next_irq_pending[irq_timer] = 1; | ||||
| 		end | ||||
| 		next_irq_pending = next_irq_pending | irq; | ||||
| 		if(timer) | ||||
| 			if (timer - 1 == 0) | ||||
| 				next_irq_pending[irq_timer] = 1; | ||||
| 
 | ||||
| 		if (resetn && (mem_do_rdata || mem_do_wdata)) begin | ||||
| 			if (mem_wordsize == 0 && reg_op1[1:0] != 0) begin | ||||
| 				`debug($display("MISALIGNED WORD: 0x%08x", reg_op1);) | ||||
| 				if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin | ||||
| 				if (!irq_mask[irq_buserror] && !irq_active) begin | ||||
| 					next_irq_pending[irq_buserror] = 1; | ||||
| 				end else | ||||
| 					cpu_state <= cpu_state_trap; | ||||
| 			end | ||||
| 			if (mem_wordsize == 1 && reg_op1[0] != 0) begin | ||||
| 				`debug($display("MISALIGNED HALFWORD: 0x%08x", reg_op1);) | ||||
| 				if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin | ||||
| 				if (!irq_mask[irq_buserror] && !irq_active) begin | ||||
| 					next_irq_pending[irq_buserror] = 1; | ||||
| 				end else | ||||
| 					cpu_state <= cpu_state_trap; | ||||
|  | @ -1478,7 +1433,7 @@ module picorv32 #( | |||
| 		end | ||||
| 		if (resetn && mem_do_rinst && (|reg_pc[1:0])) begin | ||||
| 			`debug($display("MISALIGNED INSTRUCTION: 0x%08x", reg_pc);) | ||||
| 			if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin | ||||
| 			if (!irq_mask[irq_buserror] && !irq_active) begin | ||||
| 				next_irq_pending[irq_buserror] = 1; | ||||
| 			end else | ||||
| 				cpu_state <= cpu_state_trap; | ||||
|  | @ -1503,11 +1458,6 @@ module picorv32 #( | |||
| 	end | ||||
| endmodule | ||||
| 
 | ||||
| // This is a simple example implementation of PICORV32_REGS. | ||||
| // Use the PICORV32_REGS mechanism if you want to use custom | ||||
| // memory resources to implement the processor register file. | ||||
| // Note that your implementation must match the requirements of | ||||
| // the PicoRV32 configuration. (e.g. QREGS, etc) | ||||
| module picorv32_regs ( | ||||
| 	input clk, wen, | ||||
| 	input [5:0] waddr, | ||||
|  | @ -1517,16 +1467,13 @@ module picorv32_regs ( | |||
| 	output [31:0] rdata1, | ||||
| 	output [31:0] rdata2 | ||||
| ); | ||||
| 	reg [31:0] regs [0:30]; | ||||
| 
 | ||||
| 	reg [31:0] regs [0:35]; | ||||
| 	always @(posedge clk) | ||||
| 		if (wen) regs[~waddr[4:0]] <= wdata; | ||||
| 
 | ||||
| 	assign rdata1 = regs[~raddr1[4:0]]; | ||||
| 	assign rdata2 = regs[~raddr2[4:0]]; | ||||
| 		if (wen) regs[waddr[5:0]] <= wdata; | ||||
| 	assign rdata1 = regs[raddr1]; | ||||
| 	assign rdata2 = regs[raddr2]; | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************** | ||||
|  * picorv32_pcpi_mul | ||||
|  ***************************************************************/ | ||||
|  |  | |||
|  | @ -191,7 +191,6 @@ module picorv32_wb #( | |||
|   assign resetn = ~wb_rst_i; | ||||
| 
 | ||||
|   picorv32 #( | ||||
|       .ENABLE_IRQ(1), | ||||
|       .ENABLE_TRACE(1), | ||||
|       .MASKED_IRQ(32'h0000_0000), | ||||
|       .LATCHED_IRQ(32'hffff_ffff), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue