|
@@ -102,49 +102,50 @@ module picorv32 #(
|
|
|
parameter [ 4:0] RA_IRQ_REG = ENABLE_IRQ_QREGS ? 26 : 3,
|
|
|
parameter [ 4:0] MASK_IRQ_REG = ENABLE_IRQ_QREGS ? 27 : 4
|
|
|
) (
|
|
|
- input clk, resetn,
|
|
|
- output reg trap,
|
|
|
+ input clk, resetn,
|
|
|
+ input halt,
|
|
|
+ output reg trap,
|
|
|
|
|
|
- input [31:0] progaddr_reset,
|
|
|
- input [31:0] progaddr_irq,
|
|
|
+ input [31:0] progaddr_reset,
|
|
|
+ input [31:0] progaddr_irq,
|
|
|
|
|
|
- output reg mem_valid,
|
|
|
- output reg mem_instr,
|
|
|
- input mem_ready,
|
|
|
+ output reg mem_valid,
|
|
|
+ output reg mem_instr,
|
|
|
+ input mem_ready,
|
|
|
|
|
|
output reg [31:0] mem_addr,
|
|
|
output reg [31:0] mem_wdata,
|
|
|
output reg [ 3:0] mem_wstrb,
|
|
|
- input [31:0] mem_rdata,
|
|
|
+ input [31:0] mem_rdata,
|
|
|
|
|
|
// Look-Ahead Interface
|
|
|
- output mem_la_read,
|
|
|
- output mem_la_write,
|
|
|
- output [31:0] mem_la_addr,
|
|
|
+ output mem_la_read,
|
|
|
+ output mem_la_write,
|
|
|
+ output [31:0] mem_la_addr,
|
|
|
output reg [31:0] mem_la_wdata,
|
|
|
output reg [ 3:0] mem_la_wstrb,
|
|
|
|
|
|
// Pico Co-Processor Interface (PCPI)
|
|
|
- output reg pcpi_valid,
|
|
|
+ output reg pcpi_valid,
|
|
|
output reg [31:0] pcpi_insn,
|
|
|
- output [31:0] pcpi_rs1,
|
|
|
- output [31:0] pcpi_rs2,
|
|
|
- input pcpi_wr,
|
|
|
- input [31:0] pcpi_rd,
|
|
|
- input pcpi_wait,
|
|
|
- input pcpi_ready,
|
|
|
+ output [31:0] pcpi_rs1,
|
|
|
+ output [31:0] pcpi_rs2,
|
|
|
+ input pcpi_wr,
|
|
|
+ input [31:0] pcpi_rd,
|
|
|
+ input pcpi_wait,
|
|
|
+ input pcpi_ready,
|
|
|
|
|
|
// IRQ Interface
|
|
|
- input [31:0] irq,
|
|
|
+ input [31:0] irq,
|
|
|
output reg [31:0] eoi,
|
|
|
|
|
|
`ifdef RISCV_FORMAL
|
|
|
- output reg rvfi_valid,
|
|
|
+ output reg rvfi_valid,
|
|
|
output reg [63:0] rvfi_order,
|
|
|
output reg [31:0] rvfi_insn,
|
|
|
- output reg rvfi_trap,
|
|
|
- output reg rvfi_halt,
|
|
|
- output reg rvfi_intr,
|
|
|
+ output reg rvfi_trap,
|
|
|
+ output reg rvfi_halt,
|
|
|
+ output reg rvfi_intr,
|
|
|
output reg [ 1:0] rvfi_mode,
|
|
|
output reg [ 1:0] rvfi_ixl,
|
|
|
output reg [ 4:0] rvfi_rs1_addr,
|
|
@@ -173,7 +174,7 @@ module picorv32 #(
|
|
|
`endif
|
|
|
|
|
|
// Trace Interface
|
|
|
- output reg trace_valid,
|
|
|
+ output reg trace_valid,
|
|
|
output reg [35:0] trace_data
|
|
|
);
|
|
|
localparam integer irq_timer = 0;
|
|
@@ -415,7 +416,7 @@ module picorv32 #(
|
|
|
if (!resetn) begin
|
|
|
mem_la_firstword_reg <= 0;
|
|
|
last_mem_valid <= 0;
|
|
|
- end else begin
|
|
|
+ end else if (~halt) begin
|
|
|
if (!last_mem_valid)
|
|
|
mem_la_firstword_reg <= mem_la_firstword;
|
|
|
last_mem_valid <= mem_valid && !mem_ready;
|
|
@@ -1438,7 +1439,9 @@ module picorv32 #(
|
|
|
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 &&
|
|
|
+ (!ENABLE_IRQ || irq_delay || irq_active || !(irq_pending & ~irq_mask));
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
trap <= 0;
|
|
@@ -1530,7 +1533,7 @@ module picorv32 #(
|
|
|
end
|
|
|
|
|
|
cpu_state_fetch: begin
|
|
|
- mem_do_rinst <= !decoder_trigger && !do_waitirq;
|
|
|
+ mem_do_rinst <= !decoder_trigger && !do_waitirq && !(halt && !irq_state);
|
|
|
mem_wordsize <= 0;
|
|
|
|
|
|
current_pc = reg_next_pc;
|
|
@@ -1576,6 +1579,9 @@ module picorv32 #(
|
|
|
latched_rd <= decoded_rd;
|
|
|
latched_compr <= compressed_instr;
|
|
|
|
|
|
+ if (halt && !irq_state) begin
|
|
|
+ // Do nothing, but allow an already started instruction or IRQ to complete
|
|
|
+ end else
|
|
|
if (ENABLE_IRQ && ((decoder_trigger && !irq_active && !irq_delay && |(irq_pending & ~irq_mask)) || irq_state)) begin
|
|
|
irq_state <=
|
|
|
irq_state == 2'b00 ? 2'b01 :
|