URL
https://opencores.org/ocsvn/altor32/altor32/trunk
Subversion Repositories altor32
Compare Revisions
- This comparison shows the changes necessary to convert path
/altor32/trunk
- from Rev 44 to Rev 43
- ↔ Reverse comparison
Rev 44 → Rev 43
/rtl/cpu/altor32.v
399,7 → 399,7
.rst_i(rst_i), |
|
.intr_i(intr_i), |
.break_i(nmi_i), |
.nmi_i(nmi_i), |
|
// Status |
.fault_o(fault_o), |
/rtl/cpu/altor32_exec.v
50,8 → 50,8
// Maskable interrupt |
input intr_i /*verilator public*/, |
|
// Break interrupt |
input break_i /*verilator public*/, |
// Unmaskable interrupt |
input nmi_i /*verilator public*/, |
|
// Fault |
output reg fault_o /*verilator public*/, |
194,7 → 194,8
|
reg d_mem_load_q; |
|
reg break_q; |
// Delayed NMI |
reg nmi_q; |
|
// Exception/Interrupt was last instruction |
reg exc_last_q; |
500,11 → 501,6
// If valid instruction, check if SR needs updating |
if (execute_inst_r & ~stall_inst_r) |
begin |
|
// Clear step control (if not executing higher priority syscall/break) |
if (!inst_sys_w && !inst_trap_w) |
next_sr_r[`SR_STEP] = 1'b0; |
|
case (1'b1) |
inst_mtspr_w: |
begin |
1190,21 → 1186,18
|
fault_o <= 1'b0; |
|
break_q <= 1'b0; |
break_o <= 1'b0; |
nmi_q <= 1'b0; |
end |
else |
begin |
// Flop break request, clear when break interrupt executed |
if (break_i) |
break_q <= 1'b1; |
// Record NMI in-case it can't be processed this cycle |
if (nmi_i) |
nmi_q <= 1'b1; |
|
// Reset branch request |
pc_fetch_q <= 1'b0; |
exc_last_q <= 1'b0; |
|
break_o <= 1'b0; |
|
// Update SR |
sr_q <= next_sr_r; |
|
1235,7 → 1228,7
exc_last_q <= 1'b1; |
|
fault_o <= 1'b1; |
end |
end |
// Exception: Syscall / Break |
else if (branch_except_r) |
begin |
1243,7 → 1236,7
epc_q <= next_pc_r; |
esr_q <= next_sr_r; |
|
// Disable further interrupts / break events |
// Disable further interrupts |
sr_q <= 32'b0; |
|
// Set PC to exception vector |
1250,41 → 1243,37
pc_branch_q <= branch_target_r; |
pc_fetch_q <= 1'b1; |
exc_last_q <= 1'b1; |
|
if (inst_trap_w) |
break_o <= 1'b1; |
|
`ifdef CONF_CORE_DEBUG |
$display(" Exception 0x%08x", branch_target_r); |
`endif |
end |
// Single step / break request |
else if ((sr_q[`SR_STEP] || break_q) && sr_q[`SR_DBGEN]) |
// Non-maskable interrupt |
else if (nmi_i | nmi_q) |
begin |
nmi_q <= 1'b0; |
|
// Save PC of next instruction |
if (branch_r) |
epc_q <= branch_target_r; |
epc_q <= branch_target_r; |
// Next expected PC (current PC + 4) |
else |
epc_q <= next_pc_r; |
epc_q <= next_pc_r; |
|
// Save SR |
esr_q <= next_sr_r; |
|
// Disable further interrupts / break events |
// Disable further interrupts |
sr_q <= 32'b0; |
break_q <= 1'b0; |
break_o <= 1'b1; |
|
// Set PC to trap vector |
pc_branch_q <= ISR_VECTOR + `VECTOR_TRAP; |
// Set PC to exception vector |
pc_branch_q <= ISR_VECTOR + `VECTOR_NMI; |
pc_fetch_q <= 1'b1; |
exc_last_q <= 1'b1; |
|
|
`ifdef CONF_CORE_DEBUG |
$display(" Break Event 0x%08x", ISR_VECTOR + `VECTOR_TRAP); |
$display(" NMI 0x%08x", ISR_VECTOR + `VECTOR_NMI); |
`endif |
end |
end |
// External interrupt |
else if (intr_i && next_sr_r[`SR_IEE]) |
begin |
1297,7 → 1286,7
|
esr_q <= next_sr_r; |
|
// Disable further interrupts / break events |
// Disable further interrupts |
sr_q <= 32'b0; |
|
// Set PC to external interrupt vector |
1519,13 → 1508,15
begin |
if (rst_i == 1'b1) |
begin |
break_o <= 1'b0; |
icache_flush_o <= 1'b0; |
dcache_flush_o <= 1'b0; |
end |
else |
begin |
break_o <= 1'b0; |
icache_flush_o <= 1'b0; |
dcache_flush_o <= 1'b0; |
dcache_flush_o <= 1'b0; |
|
//--------------------------------------------------------------- |
// Valid instruction |
1545,6 → 1536,9
end |
endcase |
end |
|
inst_trap_w: // l.trap |
break_o <= 1'b1; |
default: |
; |
endcase |
/rtl/cpu/altor32_defs.v
164,8 → 164,6
`define SR_SUMRA 16 |
`define SR_ICACHE_FLUSH 17 |
`define SR_DCACHE_FLUSH 18 |
`define SR_STEP 19 |
`define SR_DBGEN 20 |
|
//----------------------------------------------------------------- |
// OR32 Vectors |
176,4 → 174,5
`define VECTOR_EXTINT 32'h00000300 |
`define VECTOR_SYSCALL 32'h00000400 |
`define VECTOR_TRAP 32'h00000600 |
`define VECTOR_NMI 32'h00000700 |
`define VECTOR_BUS_ERROR 32'h00000800 |