OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openmsp430/trunk/core/sim
    from Rev 186 to Rev 192
    Reverse comparison

Rev 186 → Rev 192

/rtl_sim/run/run_all
58,6 → 58,8
# Interrupts & NMI
../bin/msp430sim sing-op_reti | tee ./log/sing-op_reti.log
../bin/msp430sim nmi | tee ./log/nmi.log
../bin/msp430sim irq32 | tee ./log/irq32.log
../bin/msp430sim irq64 | tee ./log/irq64.log
 
# ROM Data Read access
../bin/msp430sim two-op_add_rom-rd | tee ./log/two-op_add_rom-rd.log
/rtl_sim/src/irq32.v
0,0 → 1,345
/*===========================================================================*/
/* Copyright (C) 2001 Authors */
/* */
/* This source file may be used and distributed without restriction provided */
/* that this copyright statement is not removed from the file and that any */
/* derivative work contains the original copyright notice and the associated */
/* disclaimer. */
/* */
/* This source file is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation; either version 2.1 of the License, or */
/* (at your option) any later version. */
/* */
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this source; if not, write to the Free Software Foundation, */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/*===========================================================================*/
/* IRQ 1 to 16 FOR SYSTEM WITH 32 IRQs */
/*---------------------------------------------------------------------------*/
/* Test the some IRQs for RTL configuration with more than 16 IRQs: */
/* */
/* - for 16 IRQ configuration: test is skipped. */
/* - for 32 IRQ configuration: will test IRQ 1 to 16. */
/* - for 64 IRQ configuration: will test IRQ 32 to 48. */
/* */
/* Author(s): */
/* - Olivier Girard, olgirard@gmail.com */
/* */
/*---------------------------------------------------------------------------*/
/* $Rev: 95 $ */
/* $LastChangedBy: olivier.girard $ */
/* $LastChangedDate: 2011-02-24 21:37:57 +0100 (Thu, 24 Feb 2011) $ */
/*===========================================================================*/
 
integer i;
reg [15:0] temp_val;
 
initial
begin
$display(" ===============================================");
$display("| START SIMULATION |");
$display(" ===============================================");
`ifdef IRQ_NR_GE_32
 
repeat(5) @(posedge mclk);
stimulus_done = 0;
 
// RETI Instruction test
//--------------------------
@(r15==16'h1000);
if (r3 !==16'h0000) tb_error("====== RESET Vector: R3 value =====");
if (r4 !==16'h0000) tb_error("====== RESET Vector: R4 value =====");
if (r5 !==16'h0000) tb_error("====== RESET Vector: R5 value =====");
if (r6 !==16'h0000) tb_error("====== RESET Vector: R6 value =====");
if (r7 !==16'h0000) tb_error("====== RESET Vector: R7 value =====");
if (r8 !==16'h0000) tb_error("====== RESET Vector: R8 value =====");
if (r9 !==16'h0000) tb_error("====== RESET Vector: R9 value =====");
if (r10 !==16'h0000) tb_error("====== RESET Vector: R10 value =====");
if (r11 !==16'h0000) tb_error("====== RESET Vector: R11 value =====");
if (r12 !==16'h0000) tb_error("====== RESET Vector: R12 value =====");
if (r13 !==16'h0000) tb_error("====== RESET Vector: R13 value =====");
if (r14 !==16'h0000) tb_error("====== RESET Vector: R14 value =====");
 
 
// RETI Instruction test
//--------------------------
@(r15==16'h2000);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== RETI: SP value =====");
if (r2 !==16'h010f) tb_error("====== RETI: SR value =====");
if (r5 !==16'h1234) tb_error("====== RETI: R5 value =====");
 
 
// Test interruption 0
//--------------------------
@(r15==16'h3000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-32:0] = {`IRQ_NR-32+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-32:0] = {`IRQ_NR-32+1{1'b0}};
 
@(r15==16'h3001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 0: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 0: GIE value =====");
if (r6 !==16'h5678) tb_error("====== IRQ 0: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 0: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 0: R8 value =====");
 
 
// Test interruption 1
//--------------------------
@(r15==16'h4000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-31:0] = {`IRQ_NR-31+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-31:0] = {`IRQ_NR-31+1{1'b0}};
 
@(r15==16'h4001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 1: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 1: GIE value =====");
if (r6 !==16'h9abc) tb_error("====== IRQ 1: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 1: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 1: R8 value =====");
 
 
// Test interruption 2
//--------------------------
@(r15==16'h5000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-30:0] = {`IRQ_NR-30+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-30:0] = {`IRQ_NR-30+1{1'b0}};
 
@(r15==16'h5001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 2: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 2: GIE value =====");
if (r6 !==16'hdef1) tb_error("====== IRQ 2: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 2: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 2: R8 value =====");
 
 
// Test interruption 3
//--------------------------
@(r15==16'h6000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-29:0] = {`IRQ_NR-29+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-29:0] = {`IRQ_NR-29+1{1'b0}};
 
@(r15==16'h6001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 3: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 3: GIE value =====");
if (r6 !==16'h2345) tb_error("====== IRQ 3: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 3: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 3: R8 value =====");
 
 
// Test interruption 4
//--------------------------
@(r15==16'h7000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-28:0] = {`IRQ_NR-28+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-28:0] = {`IRQ_NR-28+1{1'b0}};
 
@(r15==16'h7001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 4: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 4: GIE value =====");
if (r6 !==16'h6789) tb_error("====== IRQ 4: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 4: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 4: R8 value =====");
 
 
// Test interruption 5
//--------------------------
@(r15==16'h8000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-27:0] = {`IRQ_NR-27+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-27:0] = {`IRQ_NR-27+1{1'b0}};
 
@(r15==16'h8001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 5: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 5: GIE value =====");
if (r6 !==16'habcd) tb_error("====== IRQ 5: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 5: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 5: R8 value =====");
 
 
// Test interruption 6
//--------------------------
@(r15==16'h9000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-26:0] = {`IRQ_NR-26+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-26:0] = {`IRQ_NR-26+1{1'b0}};
 
@(r15==16'h9001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 6: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 6: GIE value =====");
if (r6 !==16'hef12) tb_error("====== IRQ 6: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 6: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 6: R8 value =====");
 
 
// Test interruption 7
//--------------------------
@(r15==16'ha000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-25:0] = {`IRQ_NR-25+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-25:0] = {`IRQ_NR-25+1{1'b0}};
 
@(r15==16'ha001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 7: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 7: GIE value =====");
if (r6 !==16'h3456) tb_error("====== IRQ 7: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 7: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 7: R8 value =====");
 
 
// Test interruption 8
//--------------------------
@(r15==16'hb000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-24:0] = {`IRQ_NR-24+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-24:0] = {`IRQ_NR-24+1{1'b0}};
 
@(r15==16'hb001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 8: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 8: GIE value =====");
if (r6 !==16'h789a) tb_error("====== IRQ 8: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 8: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 8: R8 value =====");
 
 
// Test interruption 9
//--------------------------
@(r15==16'hc000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-23:0] = {`IRQ_NR-23+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-23:0] = {`IRQ_NR-23+1{1'b0}};
 
@(r15==16'hc001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 9: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 9: GIE value =====");
if (r6 !==16'hbcde) tb_error("====== IRQ 9: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 9: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 9: R8 value =====");
 
 
// Test interruption 10
//--------------------------
@(r15==16'hd000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-22:0] = {`IRQ_NR-22+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-22:0] = {`IRQ_NR-22+1{1'b0}};
 
@(r15==16'hd001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 10: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 10: GIE value =====");
if (r6 !==16'hf123) tb_error("====== IRQ 10: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 10: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 10: R8 value =====");
 
 
// Test interruption 11
//--------------------------
@(r15==16'he000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-21:0] = {`IRQ_NR-21+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-21:0] = {`IRQ_NR-21+1{1'b0}};
 
@(r15==16'he001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 11: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 11: GIE value =====");
if (r6 !==16'h4567) tb_error("====== IRQ 11: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 11: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 11: R8 value =====");
 
 
// Test interruption 12
//--------------------------
@(r15==16'hf000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-20:0] = {`IRQ_NR-20+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-20:0] = {`IRQ_NR-20+1{1'b0}};
 
@(r15==16'hf001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 12: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 12: GIE value =====");
if (r6 !==16'h89ab) tb_error("====== IRQ 12: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 12: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 12: R8 value =====");
 
 
// Test interruption 13
//--------------------------
@(r15==16'hf100);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-19:0] = {`IRQ_NR-19+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-19:0] = {`IRQ_NR-19+1{1'b0}};
 
@(r15==16'hf101);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 13: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 13: GIE value =====");
if (r6 !==16'hcdef) tb_error("====== IRQ 13: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 13: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 13: R8 value =====");
 
 
// Test interruption 14
//--------------------------
@(r15==16'hf200);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-18:0] = {`IRQ_NR-18+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-18:0] = {`IRQ_NR-18+1{1'b0}};
 
@(r15==16'hf201);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 14: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 14: GIE value =====");
if (r6 !==16'hfedc) tb_error("====== IRQ 14: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 14: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 14: R8 value =====");
 
 
// Test interruption 15
//--------------------------
@(r15==16'hf300);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-17:0] = {`IRQ_NR-17+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-17:0] = {`IRQ_NR-17+1{1'b0}};
 
@(r15==16'hf301);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 15: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 15: GIE value =====");
if (r6 !==16'hba98) tb_error("====== IRQ 15: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 15: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 15: R8 value =====");
 
 
stimulus_done = 1;
`else
 
$display(" ===============================================");
$display("| SIMULATION SKIPPED |");
$display("| (RTL configured to support 16 IRQs only) |");
$display(" ===============================================");
$finish;
`endif
end
 
/rtl_sim/src/irq64.s43
0,0 → 1,877
/*===========================================================================*/
/* Copyright (C) 2001 Authors */
/* */
/* This source file may be used and distributed without restriction provided */
/* that this copyright statement is not removed from the file and that any */
/* derivative work contains the original copyright notice and the associated */
/* disclaimer. */
/* */
/* This source file is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation; either version 2.1 of the License, or */
/* (at your option) any later version. */
/* */
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this source; if not, write to the Free Software Foundation, */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/*===========================================================================*/
/* IRQ 1 to 32 FOR SYSTEM WITH 64 IRQs */
/*---------------------------------------------------------------------------*/
/* Test the some IRQs for RTL configuration with more than 16 IRQs: */
/* */
/* - for 16 IRQ configuration: test is skipped. */
/* - for 32 IRQ configuration: test is skipped. */
/* - for 64 IRQ configuration: will test IRQ 1 to 32. */
/* */
/* */
/* Author(s): */
/* - Olivier Girard, olgirard@gmail.com */
/* */
/*---------------------------------------------------------------------------*/
/* $Rev: 19 $ */
/* $LastChangedBy: olivier.girard $ */
/* $LastChangedDate: 2009-08-04 23:47:15 +0200 (Tue, 04 Aug 2009) $ */
/*===========================================================================*/
 
.include "pmem_defs.asm"
 
.global main
 
mov #0x1234, r3
mov #0x1234, r4
mov #0x1234, r5
mov #0x1234, r6
mov #0x1234, r7
mov #0x1234, r8
mov #0x1234, r9
mov #0x1234, r10
mov #0x1234, r11
mov #0x1234, r12
mov #0x1234, r13
mov #0x1234, r14
main:
# Test RESET vector
#------------------------
mov #0x1000, r15
 
 
# Test RETI instruction
#------------------------
 
# Pre-initialize stack
mov #DMEM_252, r1
push #RETI_ROUTINE
push #0x010f
mov #0x0000, &0x0200
 
# Run RETI test
mov #0x0000, r2
mov #0x0000, r5
reti
end_of_reti_test:
 
mov #0x2000, r15
 
 
# Test IRQ 0
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x3000, r15
 
wait_irq00:
cmp #0x5678, r6
jne wait_irq00
 
mov #0x3001, r15
 
 
# Test IRQ 1
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x4000, r15
 
wait_irq01:
cmp #0x9abc, r6
jne wait_irq01
 
mov #0x4001, r15
 
 
# Test IRQ 2
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x5000, r15
 
wait_irq02:
cmp #0xdef1, r6
jne wait_irq02
 
mov #0x5001, r15
 
 
# Test IRQ 3
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x6000, r15
 
wait_irq03:
cmp #0x2345, r6
jne wait_irq03
 
mov #0x6001, r15
 
 
# Test IRQ 4
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x7000, r15
 
wait_irq04:
cmp #0x6789, r6
jne wait_irq04
 
mov #0x7001, r15
 
 
# Test IRQ 5
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x8000, r15
 
wait_irq05:
cmp #0xabcd, r6
jne wait_irq05
 
mov #0x8001, r15
 
 
# Test IRQ 6
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x9000, r15
 
wait_irq06:
cmp #0xef12, r6
jne wait_irq06
 
mov #0x9001, r15
 
 
# Test IRQ 7
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xa000, r15
 
wait_irq07:
cmp #0x3456, r6
jne wait_irq07
 
mov #0xa001, r15
 
 
# Test IRQ 8
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xb000, r15
 
wait_irq08:
cmp #0x789a, r6
jne wait_irq08
 
mov #0xb001, r15
 
 
# Test IRQ 9
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xc000, r15
 
wait_irq09:
cmp #0xbcde, r6
jne wait_irq09
 
mov #0xc001, r15
 
 
# Test IRQ 10
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xd000, r15
 
wait_irq10:
cmp #0xf123, r6
jne wait_irq10
 
mov #0xd001, r15
 
 
# Test IRQ 11
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xe000, r15
 
wait_irq11:
cmp #0x4567, r6
jne wait_irq11
 
mov #0xe001, r15
 
 
# Test IRQ 12
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf000, r15
 
wait_irq12:
cmp #0x89ab, r6
jne wait_irq12
 
mov #0xf001, r15
 
 
# Test IRQ 13
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf100, r15
 
wait_irq13:
cmp #0xcdef, r6
jne wait_irq13
 
mov #0xf101, r15
 
 
# Test IRQ 14
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf200, r15
 
wait_irq14:
cmp #0xfedc, r6
jne wait_irq14
 
mov #0xf201, r15
 
 
# Test IRQ 15
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf300, r15
 
wait_irq15:
cmp #0xba98, r6
jne wait_irq15
 
mov #0xf301, r15
 
 
# Test IRQ 16
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf400, r15
 
wait_irq16:
cmp #0x7654, r6
jne wait_irq16
 
mov #0xf401, r15
 
 
# Test IRQ 17
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf500, r15
 
wait_irq17:
cmp #0x3210, r6
jne wait_irq17
 
mov #0xf501, r15
 
 
# Test IRQ 18
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf600, r15
 
wait_irq18:
cmp #0x0246, r6
jne wait_irq18
 
mov #0xf601, r15
 
 
# Test IRQ 19
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf700, r15
 
wait_irq19:
cmp #0x1357, r6
jne wait_irq19
 
mov #0xf701, r15
 
 
# Test IRQ 20
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf800, r15
 
wait_irq20:
cmp #0x8ace, r6
jne wait_irq20
 
mov #0xf801, r15
 
 
# Test IRQ 21
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf900, r15
 
wait_irq21:
cmp #0x9bdf, r6
jne wait_irq21
 
mov #0xf901, r15
 
 
# Test IRQ 22
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xfa00, r15
 
wait_irq22:
cmp #0xfdb9, r6
jne wait_irq22
 
mov #0xfa01, r15
 
 
# Test IRQ 23
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xfb00, r15
 
wait_irq23:
cmp #0xeca8, r6
jne wait_irq23
 
mov #0xfb01, r15
 
 
# Test IRQ 24
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xfc00, r15
 
wait_irq24:
cmp #0x7531, r6
jne wait_irq24
 
mov #0xfc01, r15
 
 
# Test IRQ 25
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xfd00, r15
 
wait_irq25:
cmp #0x6420, r6
jne wait_irq25
 
mov #0xfd01, r15
 
 
# Test IRQ 26
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xfe00, r15
 
wait_irq26:
cmp #0x0134, r6
jne wait_irq26
 
mov #0xfe01, r15
 
 
# Test IRQ 27
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xff00, r15
 
wait_irq27:
cmp #0x1245, r6
jne wait_irq27
 
mov #0xff01, r15
 
 
# Test IRQ 28
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xff10, r15
 
wait_irq28:
cmp #0x2356, r6
jne wait_irq28
 
mov #0xff11, r15
 
 
# Test IRQ 29
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xff20, r15
 
wait_irq29:
cmp #0x3467, r6
jne wait_irq29
 
mov #0xff21, r15
 
 
# Test IRQ 30
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xff30, r15
 
wait_irq30:
cmp #0x4578, r6
jne wait_irq30
 
mov #0xff31, r15
 
 
# Test IRQ 31
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xff40, r15
 
wait_irq31:
cmp #0x5689, r6
jne wait_irq31
 
mov #0xff41, r15
 
 
/* ---------------------- END OF TEST --------------- */
end_of_test:
nop
br #0xffff
 
 
 
/* ---------------------- FUNCTIONS --------------- */
 
RETI_ROUTINE:
mov #0x1234, r5
jmp end_of_reti_test
 
 
IRQ00_ROUTINE:
mov #0x5678, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ01_ROUTINE:
mov #0x9abc, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ02_ROUTINE:
mov #0xdef1, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ03_ROUTINE:
mov #0x2345, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ04_ROUTINE:
mov #0x6789, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ05_ROUTINE:
mov #0xabcd, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ06_ROUTINE:
mov #0xef12, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ07_ROUTINE:
mov #0x3456, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ08_ROUTINE:
mov #0x789a, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ09_ROUTINE:
mov #0xbcde, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ10_ROUTINE:
mov #0xf123, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ11_ROUTINE:
mov #0x4567, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ12_ROUTINE:
mov #0x89ab, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ13_ROUTINE:
mov #0xcdef, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ14_ROUTINE:
mov #0xfedc, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ15_ROUTINE:
mov #0xba98, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ16_ROUTINE:
mov #0x7654, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ17_ROUTINE:
mov #0x3210, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ18_ROUTINE:
mov #0x0246, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ19_ROUTINE:
mov #0x1357, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ20_ROUTINE:
mov #0x8ace, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ21_ROUTINE:
mov #0x9bdf, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ22_ROUTINE:
mov #0xfdb9, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ23_ROUTINE:
mov #0xeca8, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ24_ROUTINE:
mov #0x7531, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ25_ROUTINE:
mov #0x6420, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ26_ROUTINE:
mov #0x0134, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ27_ROUTINE:
mov #0x1245, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ28_ROUTINE:
mov #0x2356, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ29_ROUTINE:
mov #0x3467, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ30_ROUTINE:
mov #0x4578, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ31_ROUTINE:
mov #0x5689, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
nop
nop
nop
nop
nop
 
 
 
/* ---------------------- INTERRUPT VECTORS --------------- */
.section .vectors64, "a"
.word IRQ00_ROUTINE ; Interrupt 0 (lowest priority) <unused>
.word IRQ01_ROUTINE ; Interrupt 1 <unused>
.word IRQ02_ROUTINE ; Interrupt 2 <unused>
.word IRQ03_ROUTINE ; Interrupt 3 <unused>
.word IRQ04_ROUTINE ; Interrupt 4 <unused>
.word IRQ05_ROUTINE ; Interrupt 5 <unused>
.word IRQ06_ROUTINE ; Interrupt 6 <unused>
.word IRQ07_ROUTINE ; Interrupt 7 <unused>
.word IRQ08_ROUTINE ; Interrupt 8 <unused>
.word IRQ09_ROUTINE ; Interrupt 9 <unused>
.word IRQ10_ROUTINE ; Interrupt 10 <unused>
.word IRQ11_ROUTINE ; Interrupt 11 <unused>
.word IRQ12_ROUTINE ; Interrupt 12 <unused>
.word IRQ13_ROUTINE ; Interrupt 13 <unused>
.word IRQ14_ROUTINE ; Interrupt 14 <unused>
.word IRQ15_ROUTINE ; Interrupt 15 <unused>
.word IRQ16_ROUTINE ; Interrupt 16 <unused>
.word IRQ17_ROUTINE ; Interrupt 17 <unused>
.word IRQ18_ROUTINE ; Interrupt 18 <unused>
.word IRQ19_ROUTINE ; Interrupt 19 <unused>
.word IRQ20_ROUTINE ; Interrupt 20 <unused>
.word IRQ21_ROUTINE ; Interrupt 21 <unused>
.word IRQ22_ROUTINE ; Interrupt 22 <unused>
.word IRQ23_ROUTINE ; Interrupt 23 <unused>
.word IRQ24_ROUTINE ; Interrupt 24 <unused>
.word IRQ25_ROUTINE ; Interrupt 25 <unused>
.word IRQ26_ROUTINE ; Interrupt 26 <unused>
.word IRQ27_ROUTINE ; Interrupt 27 <unused>
.word IRQ28_ROUTINE ; Interrupt 28 <unused>
.word IRQ29_ROUTINE ; Interrupt 29 <unused>
.word IRQ30_ROUTINE ; Interrupt 30 <unused>
.word IRQ31_ROUTINE ; Interrupt 31 <unused>
 
.section .vectors32, "a"
.word end_of_test ; Interrupt 32 <unused>
.word end_of_test ; Interrupt 33 <unused>
.word end_of_test ; Interrupt 34 <unused>
.word end_of_test ; Interrupt 35 <unused>
.word end_of_test ; Interrupt 36 <unused>
.word end_of_test ; Interrupt 37 <unused>
.word end_of_test ; Interrupt 38 <unused>
.word end_of_test ; Interrupt 39 <unused>
.word end_of_test ; Interrupt 40 <unused>
.word end_of_test ; Interrupt 41 <unused>
.word end_of_test ; Interrupt 42 <unused>
.word end_of_test ; Interrupt 43 <unused>
.word end_of_test ; Interrupt 44 <unused>
.word end_of_test ; Interrupt 45 <unused>
.word end_of_test ; Interrupt 46 <unused>
.word end_of_test ; Interrupt 47 <unused>
 
.section .vectors, "a"
.word end_of_test ; Interrupt 48 <unused>
.word end_of_test ; Interrupt 49 <unused>
.word end_of_test ; Interrupt 50 <unused>
.word end_of_test ; Interrupt 51 <unused>
.word end_of_test ; Interrupt 52 <unused>
.word end_of_test ; Interrupt 53 <unused>
.word end_of_test ; Interrupt 54 <unused>
.word end_of_test ; Interrupt 55 <unused>
.word end_of_test ; Interrupt 56 <unused>
.word end_of_test ; Interrupt 57 <unused>
.word end_of_test ; Interrupt 58 Watchdog timer
.word end_of_test ; Interrupt 59 <unused>
.word end_of_test ; Interrupt 60 <unused>
.word end_of_test ; Interrupt 61 <unused>
.word end_of_test ; Interrupt 62 NMI
.word main ; Interrupt 63 (highest priority) RESET
/rtl_sim/src/irq32.s43
0,0 → 1,491
/*===========================================================================*/
/* Copyright (C) 2001 Authors */
/* */
/* This source file may be used and distributed without restriction provided */
/* that this copyright statement is not removed from the file and that any */
/* derivative work contains the original copyright notice and the associated */
/* disclaimer. */
/* */
/* This source file is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation; either version 2.1 of the License, or */
/* (at your option) any later version. */
/* */
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this source; if not, write to the Free Software Foundation, */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/*===========================================================================*/
/* IRQ 1 to 16 FOR SYSTEM WITH 32 IRQs */
/*---------------------------------------------------------------------------*/
/* Test the some IRQs for RTL configuration with more than 16 IRQs: */
/* */
/* - for 16 IRQ configuration: test is skipped. */
/* - for 32 IRQ configuration: will test IRQ 1 to 16. */
/* - for 64 IRQ configuration: will test IRQ 32 to 48. */
/* */
/* */
/* Author(s): */
/* - Olivier Girard, olgirard@gmail.com */
/* */
/*---------------------------------------------------------------------------*/
/* $Rev: 19 $ */
/* $LastChangedBy: olivier.girard $ */
/* $LastChangedDate: 2009-08-04 23:47:15 +0200 (Tue, 04 Aug 2009) $ */
/*===========================================================================*/
 
.include "pmem_defs.asm"
 
.global main
 
mov #0x1234, r3
mov #0x1234, r4
mov #0x1234, r5
mov #0x1234, r6
mov #0x1234, r7
mov #0x1234, r8
mov #0x1234, r9
mov #0x1234, r10
mov #0x1234, r11
mov #0x1234, r12
mov #0x1234, r13
mov #0x1234, r14
main:
# Test RESET vector
#------------------------
mov #0x1000, r15
 
 
# Test RETI instruction
#------------------------
 
# Pre-initialize stack
mov #DMEM_252, r1
push #RETI_ROUTINE
push #0x010f
mov #0x0000, &0x0200
 
# Run RETI test
mov #0x0000, r2
mov #0x0000, r5
reti
end_of_reti_test:
 
mov #0x2000, r15
 
 
# Test IRQ 0
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x3000, r15
 
wait_irq00:
cmp #0x5678, r6
jne wait_irq00
 
mov #0x3001, r15
 
 
# Test IRQ 1
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x4000, r15
 
wait_irq01:
cmp #0x9abc, r6
jne wait_irq01
 
mov #0x4001, r15
 
 
# Test IRQ 2
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x5000, r15
 
wait_irq02:
cmp #0xdef1, r6
jne wait_irq02
 
mov #0x5001, r15
 
 
# Test IRQ 3
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x6000, r15
 
wait_irq03:
cmp #0x2345, r6
jne wait_irq03
 
mov #0x6001, r15
 
 
# Test IRQ 4
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x7000, r15
 
wait_irq04:
cmp #0x6789, r6
jne wait_irq04
 
mov #0x7001, r15
 
 
# Test IRQ 5
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x8000, r15
 
wait_irq05:
cmp #0xabcd, r6
jne wait_irq05
 
mov #0x8001, r15
 
 
# Test IRQ 6
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0x9000, r15
 
wait_irq06:
cmp #0xef12, r6
jne wait_irq06
 
mov #0x9001, r15
 
 
# Test IRQ 7
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xa000, r15
 
wait_irq07:
cmp #0x3456, r6
jne wait_irq07
 
mov #0xa001, r15
 
 
# Test IRQ 8
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xb000, r15
 
wait_irq08:
cmp #0x789a, r6
jne wait_irq08
 
mov #0xb001, r15
 
 
# Test IRQ 9
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xc000, r15
 
wait_irq09:
cmp #0xbcde, r6
jne wait_irq09
 
mov #0xc001, r15
 
 
# Test IRQ 10
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xd000, r15
 
wait_irq10:
cmp #0xf123, r6
jne wait_irq10
 
mov #0xd001, r15
 
 
# Test IRQ 11
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xe000, r15
 
wait_irq11:
cmp #0x4567, r6
jne wait_irq11
 
mov #0xe001, r15
 
 
# Test IRQ 12
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf000, r15
 
wait_irq12:
cmp #0x89ab, r6
jne wait_irq12
 
mov #0xf001, r15
 
 
# Test IRQ 13
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf100, r15
 
wait_irq13:
cmp #0xcdef, r6
jne wait_irq13
 
mov #0xf101, r15
 
 
# Test IRQ 14
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf200, r15
 
wait_irq14:
cmp #0xfedc, r6
jne wait_irq14
 
mov #0xf201, r15
 
 
# Test IRQ 15
#-------------------------
 
mov #0x0008, r2 ; Enable interrupts
mov #0x0000, r6
mov #0xaaaa, r7
mov #0x5555, r8
mov #0xf300, r15
 
wait_irq15:
cmp #0xba98, r6
jne wait_irq15
 
mov #0xf301, r15
 
 
/* ---------------------- END OF TEST --------------- */
end_of_test:
nop
br #0xffff
 
 
 
/* ---------------------- FUNCTIONS --------------- */
 
RETI_ROUTINE:
mov #0x1234, r5
jmp end_of_reti_test
 
 
IRQ00_ROUTINE:
mov #0x5678, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ01_ROUTINE:
mov #0x9abc, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ02_ROUTINE:
mov #0xdef1, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ03_ROUTINE:
mov #0x2345, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ04_ROUTINE:
mov #0x6789, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ05_ROUTINE:
mov #0xabcd, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ06_ROUTINE:
mov #0xef12, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ07_ROUTINE:
mov #0x3456, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ08_ROUTINE:
mov #0x789a, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ09_ROUTINE:
mov #0xbcde, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ10_ROUTINE:
mov #0xf123, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ11_ROUTINE:
mov #0x4567, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ12_ROUTINE:
mov #0x89ab, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ13_ROUTINE:
mov #0xcdef, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ14_ROUTINE:
mov #0xfedc, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
IRQ15_ROUTINE:
mov #0xba98, r6
mov r2, r7 ; Save Status register
mov r1, r8 ; Save Stack register
reti
 
nop
nop
nop
nop
nop
 
 
 
/* ---------------------- INTERRUPT VECTORS --------------- */
.section .vectors32, "a"
.word IRQ00_ROUTINE ; Interrupt 0 (lowest priority) <unused>
.word IRQ01_ROUTINE ; Interrupt 1 <unused>
.word IRQ02_ROUTINE ; Interrupt 2 <unused>
.word IRQ03_ROUTINE ; Interrupt 3 <unused>
.word IRQ04_ROUTINE ; Interrupt 4 <unused>
.word IRQ05_ROUTINE ; Interrupt 5 <unused>
.word IRQ06_ROUTINE ; Interrupt 6 <unused>
.word IRQ07_ROUTINE ; Interrupt 7 <unused>
.word IRQ08_ROUTINE ; Interrupt 8 <unused>
.word IRQ09_ROUTINE ; Interrupt 9 <unused>
.word IRQ10_ROUTINE ; Interrupt 10 <unused>
.word IRQ11_ROUTINE ; Interrupt 11 <unused>
.word IRQ12_ROUTINE ; Interrupt 12 <unused>
.word IRQ13_ROUTINE ; Interrupt 13 <unused>
.word IRQ14_ROUTINE ; Interrupt 14 <unused>
.word IRQ15_ROUTINE ; Interrupt 15 <unused>
 
.section .vectors, "a"
.word end_of_test ; Interrupt 16 <unused>
.word end_of_test ; Interrupt 17 <unused>
.word end_of_test ; Interrupt 18 <unused>
.word end_of_test ; Interrupt 19 <unused>
.word end_of_test ; Interrupt 20 <unused>
.word end_of_test ; Interrupt 21 <unused>
.word end_of_test ; Interrupt 22 <unused>
.word end_of_test ; Interrupt 23 <unused>
.word end_of_test ; Interrupt 24 <unused>
.word end_of_test ; Interrupt 25 <unused>
.word end_of_test ; Interrupt 26 Watchdog timer
.word end_of_test ; Interrupt 27 <unused>
.word end_of_test ; Interrupt 28 <unused>
.word end_of_test ; Interrupt 29 <unused>
.word end_of_test ; Interrupt 30 NMI
.word main ; Interrupt 31 (highest priority) RESET
/rtl_sim/src/dbg_uart_sync.v
225,13 → 225,13
dbg_uart_wr(CPU_CTL, 16'h0002);
 
// Generate an IRQ
wkup[0] = 1'b1;
wkup[0] = 1'b1;
@(negedge mclk);
irq[0] = 1'b1;
@(negedge irq_acc[0])
irq[`IRQ_NR-16] = 1'b1;
@(negedge irq_acc[`IRQ_NR-16])
@(negedge mclk);
wkup[0] = 1'b0;
irq[0] = 1'b0;
wkup[0] = 1'b0;
irq[`IRQ_NR-16] = 1'b0;
repeat(10) @(posedge mclk);
 
/rtl_sim/src/dbg_uart_onoff.v
200,9 → 200,9
test_nr = 8;
 
// Generate IRQ to terminate the test pattern
irq[1] = 1'b1;
irq[`IRQ_NR-15] = 1'b1;
@(r13);
irq[1] = 1'b0;
irq[`IRQ_NR-15] = 1'b0;
stimulus_done = 1;
 
/rtl_sim/src/nmi.v
65,12 → 65,12
#(6000);
if (inst_cnt !==16'h0000) tb_error("====== NMI rising edge: CPU is not sleeping =====");
 
wkup[0] = 1'b1;
wkup[0] = 1'b1;
@(negedge mclk)
irq[0] = 1'b1;
@(negedge irq_acc[0])
wkup[0] = 1'b0;
irq[0] = 1'b0;
irq[`IRQ_NR-16] = 1'b1;
@(negedge irq_acc[`IRQ_NR-16])
wkup[0] = 1'b0;
irq[`IRQ_NR-16] = 1'b0;
@(r15==16'h1002);
nmi = 1'b0;
182,12 → 182,12
#(2000);
if (inst_cnt !==16'h0000) tb_error("====== NMI nested: CPU is not sleeping =====");
#(2000);
wkup[0] = 1'b1;
irq[0] = 1'b1;
@(negedge irq_acc[0])
wkup[0] = 1'b0;
irq[0] = 1'b0;
nmi = 1'b1;
wkup[0] = 1'b1;
irq[`IRQ_NR-16] = 1'b1;
@(negedge irq_acc[`IRQ_NR-16])
wkup[0] = 1'b0;
irq[`IRQ_NR-16] = 1'b0;
nmi = 1'b1;
 
@(r15==16'h4002);
if (r6 !==16'h0001) tb_error("====== NMI nested: NMI irq was not taken =====");
/rtl_sim/src/irq64.v
0,0 → 1,601
/*===========================================================================*/
/* Copyright (C) 2001 Authors */
/* */
/* This source file may be used and distributed without restriction provided */
/* that this copyright statement is not removed from the file and that any */
/* derivative work contains the original copyright notice and the associated */
/* disclaimer. */
/* */
/* This source file is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation; either version 2.1 of the License, or */
/* (at your option) any later version. */
/* */
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this source; if not, write to the Free Software Foundation, */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/*===========================================================================*/
/* IRQ 1 to 32 FOR SYSTEM WITH 64 IRQs */
/*---------------------------------------------------------------------------*/
/* Test the some IRQs for RTL configuration with more than 16 IRQs: */
/* */
/* - for 16 IRQ configuration: test is skipped. */
/* - for 32 IRQ configuration: test is skipped. */
/* - for 64 IRQ configuration: will test IRQ 1 to 32. */
/* */
/* Author(s): */
/* - Olivier Girard, olgirard@gmail.com */
/* */
/*---------------------------------------------------------------------------*/
/* $Rev: 95 $ */
/* $LastChangedBy: olivier.girard $ */
/* $LastChangedDate: 2011-02-24 21:37:57 +0100 (Thu, 24 Feb 2011) $ */
/*===========================================================================*/
 
integer i;
reg [15:0] temp_val;
 
initial
begin
$display(" ===============================================");
$display("| START SIMULATION |");
$display(" ===============================================");
`ifdef IRQ_64
 
repeat(5) @(posedge mclk);
stimulus_done = 0;
 
// RETI Instruction test
//--------------------------
@(r15==16'h1000);
if (r3 !==16'h0000) tb_error("====== RESET Vector: R3 value =====");
if (r4 !==16'h0000) tb_error("====== RESET Vector: R4 value =====");
if (r5 !==16'h0000) tb_error("====== RESET Vector: R5 value =====");
if (r6 !==16'h0000) tb_error("====== RESET Vector: R6 value =====");
if (r7 !==16'h0000) tb_error("====== RESET Vector: R7 value =====");
if (r8 !==16'h0000) tb_error("====== RESET Vector: R8 value =====");
if (r9 !==16'h0000) tb_error("====== RESET Vector: R9 value =====");
if (r10 !==16'h0000) tb_error("====== RESET Vector: R10 value =====");
if (r11 !==16'h0000) tb_error("====== RESET Vector: R11 value =====");
if (r12 !==16'h0000) tb_error("====== RESET Vector: R12 value =====");
if (r13 !==16'h0000) tb_error("====== RESET Vector: R13 value =====");
if (r14 !==16'h0000) tb_error("====== RESET Vector: R14 value =====");
 
 
// RETI Instruction test
//--------------------------
@(r15==16'h2000);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== RETI: SP value =====");
if (r2 !==16'h010f) tb_error("====== RETI: SR value =====");
if (r5 !==16'h1234) tb_error("====== RETI: R5 value =====");
 
 
// Test interruption 0
//--------------------------
@(r15==16'h3000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-64:0] = {`IRQ_NR-64+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-64:0] = {`IRQ_NR-64+1{1'b0}};
 
@(r15==16'h3001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 0: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 0: GIE value =====");
if (r6 !==16'h5678) tb_error("====== IRQ 0: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 0: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 0: R8 value =====");
 
 
// Test interruption 1
//--------------------------
@(r15==16'h4000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-63:0] = {`IRQ_NR-63+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-63:0] = {`IRQ_NR-63+1{1'b0}};
 
@(r15==16'h4001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 1: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 1: GIE value =====");
if (r6 !==16'h9abc) tb_error("====== IRQ 1: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 1: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 1: R8 value =====");
 
 
// Test interruption 2
//--------------------------
@(r15==16'h5000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-62:0] = {`IRQ_NR-62+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-62:0] = {`IRQ_NR-62+1{1'b0}};
 
@(r15==16'h5001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 2: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 2: GIE value =====");
if (r6 !==16'hdef1) tb_error("====== IRQ 2: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 2: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 2: R8 value =====");
 
 
// Test interruption 3
//--------------------------
@(r15==16'h6000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-61:0] = {`IRQ_NR-61+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-61:0] = {`IRQ_NR-61+1{1'b0}};
 
@(r15==16'h6001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 3: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 3: GIE value =====");
if (r6 !==16'h2345) tb_error("====== IRQ 3: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 3: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 3: R8 value =====");
 
 
// Test interruption 4
//--------------------------
@(r15==16'h7000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-60:0] = {`IRQ_NR-60+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-60:0] = {`IRQ_NR-60+1{1'b0}};
 
@(r15==16'h7001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 4: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 4: GIE value =====");
if (r6 !==16'h6789) tb_error("====== IRQ 4: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 4: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 4: R8 value =====");
 
 
// Test interruption 5
//--------------------------
@(r15==16'h8000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-59:0] = {`IRQ_NR-59+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-59:0] = {`IRQ_NR-59+1{1'b0}};
 
@(r15==16'h8001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 5: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 5: GIE value =====");
if (r6 !==16'habcd) tb_error("====== IRQ 5: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 5: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 5: R8 value =====");
 
 
// Test interruption 6
//--------------------------
@(r15==16'h9000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-58:0] = {`IRQ_NR-58+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-58:0] = {`IRQ_NR-58+1{1'b0}};
 
@(r15==16'h9001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 6: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 6: GIE value =====");
if (r6 !==16'hef12) tb_error("====== IRQ 6: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 6: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 6: R8 value =====");
 
 
// Test interruption 7
//--------------------------
@(r15==16'ha000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-57:0] = {`IRQ_NR-57+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-57:0] = {`IRQ_NR-57+1{1'b0}};
 
@(r15==16'ha001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 7: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 7: GIE value =====");
if (r6 !==16'h3456) tb_error("====== IRQ 7: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 7: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 7: R8 value =====");
 
 
// Test interruption 8
//--------------------------
@(r15==16'hb000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-56:0] = {`IRQ_NR-56+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-56:0] = {`IRQ_NR-56+1{1'b0}};
 
@(r15==16'hb001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 8: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 8: GIE value =====");
if (r6 !==16'h789a) tb_error("====== IRQ 8: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 8: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 8: R8 value =====");
 
 
// Test interruption 9
//--------------------------
@(r15==16'hc000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-55:0] = {`IRQ_NR-55+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-55:0] = {`IRQ_NR-55+1{1'b0}};
 
@(r15==16'hc001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 9: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 9: GIE value =====");
if (r6 !==16'hbcde) tb_error("====== IRQ 9: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 9: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 9: R8 value =====");
 
 
// Test interruption 10
//--------------------------
@(r15==16'hd000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-54:0] = {`IRQ_NR-54+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-54:0] = {`IRQ_NR-54+1{1'b0}};
 
@(r15==16'hd001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 10: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 10: GIE value =====");
if (r6 !==16'hf123) tb_error("====== IRQ 10: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 10: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 10: R8 value =====");
 
 
// Test interruption 11
//--------------------------
@(r15==16'he000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-53:0] = {`IRQ_NR-53+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-53:0] = {`IRQ_NR-53+1{1'b0}};
 
@(r15==16'he001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 11: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 11: GIE value =====");
if (r6 !==16'h4567) tb_error("====== IRQ 11: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 11: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 11: R8 value =====");
 
 
// Test interruption 12
//--------------------------
@(r15==16'hf000);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-52:0] = {`IRQ_NR-52+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-52:0] = {`IRQ_NR-52+1{1'b0}};
 
@(r15==16'hf001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 12: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 12: GIE value =====");
if (r6 !==16'h89ab) tb_error("====== IRQ 12: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 12: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 12: R8 value =====");
 
 
// Test interruption 13
//--------------------------
@(r15==16'hf100);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-51:0] = {`IRQ_NR-51+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-51:0] = {`IRQ_NR-51+1{1'b0}};
 
@(r15==16'hf101);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 13: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 13: GIE value =====");
if (r6 !==16'hcdef) tb_error("====== IRQ 13: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 13: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 13: R8 value =====");
 
 
// Test interruption 14
//--------------------------
@(r15==16'hf200);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-50:0] = {`IRQ_NR-50+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-50:0] = {`IRQ_NR-50+1{1'b0}};
 
@(r15==16'hf201);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 14: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 14: GIE value =====");
if (r6 !==16'hfedc) tb_error("====== IRQ 14: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 14: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 14: R8 value =====");
 
 
// Test interruption 15
//--------------------------
@(r15==16'hf300);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-49:0] = {`IRQ_NR-49+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-49:0] = {`IRQ_NR-49+1{1'b0}};
 
@(r15==16'hf301);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 15: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 15: GIE value =====");
if (r6 !==16'hba98) tb_error("====== IRQ 15: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 15: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 15: R8 value =====");
 
 
// Test interruption 16
//--------------------------
@(r15==16'hf400);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-48:0] = {`IRQ_NR-48+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-48:0] = {`IRQ_NR-48+1{1'b0}};
 
@(r15==16'hf401);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 16: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 16: GIE value =====");
if (r6 !==16'h7654) tb_error("====== IRQ 16: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 16: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 16: R8 value =====");
 
 
// Test interruption 17
//--------------------------
@(r15==16'hf500);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-47:0] = {`IRQ_NR-47+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-47:0] = {`IRQ_NR-47+1{1'b0}};
 
@(r15==16'hf501);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 17: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 17: GIE value =====");
if (r6 !==16'h3210) tb_error("====== IRQ 17: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 17: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 17: R8 value =====");
 
 
// Test interruption 18
//--------------------------
@(r15==16'hf600);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-46:0] = {`IRQ_NR-46+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-46:0] = {`IRQ_NR-46+1{1'b0}};
 
@(r15==16'hf601);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 18: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 18: GIE value =====");
if (r6 !==16'h0246) tb_error("====== IRQ 18: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 18: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 18: R8 value =====");
 
 
// Test interruption 19
//--------------------------
@(r15==16'hf700);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-45:0] = {`IRQ_NR-45+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-45:0] = {`IRQ_NR-45+1{1'b0}};
 
@(r15==16'hf701);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 19: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 19: GIE value =====");
if (r6 !==16'h1357) tb_error("====== IRQ 19: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 19: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 19: R8 value =====");
 
 
// Test interruption 20
//--------------------------
@(r15==16'hf800);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-44:0] = {`IRQ_NR-44+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-44:0] = {`IRQ_NR-44+1{1'b0}};
 
@(r15==16'hf801);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 20: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 20: GIE value =====");
if (r6 !==16'h8ace) tb_error("====== IRQ 20: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 20: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 20: R8 value =====");
 
 
// Test interruption 21
//--------------------------
@(r15==16'hf900);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-43:0] = {`IRQ_NR-43+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-43:0] = {`IRQ_NR-43+1{1'b0}};
 
@(r15==16'hf901);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 21: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 21: GIE value =====");
if (r6 !==16'h9bdf) tb_error("====== IRQ 21: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 21: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 21: R8 value =====");
 
 
// Test interruption 22
//--------------------------
@(r15==16'hfa00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-42:0] = {`IRQ_NR-42+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-42:0] = {`IRQ_NR-42+1{1'b0}};
 
@(r15==16'hfa01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 22: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 22: GIE value =====");
if (r6 !==16'hfdb9) tb_error("====== IRQ 22: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 22: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 22: R8 value =====");
 
 
// Test interruption 23
//--------------------------
@(r15==16'hfb00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-41:0] = {`IRQ_NR-41+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-41:0] = {`IRQ_NR-41+1{1'b0}};
 
@(r15==16'hfb01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 23: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 23: GIE value =====");
if (r6 !==16'heca8) tb_error("====== IRQ 23: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 23: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 23: R8 value =====");
 
 
// Test interruption 24
//--------------------------
@(r15==16'hfc00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-40:0] = {`IRQ_NR-40+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-40:0] = {`IRQ_NR-40+1{1'b0}};
 
@(r15==16'hfc01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 24: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 24: GIE value =====");
if (r6 !==16'h7531) tb_error("====== IRQ 24: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 24: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 24: R8 value =====");
 
 
// Test interruption 25
//--------------------------
@(r15==16'hfd00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-39:0] = {`IRQ_NR-39+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-39:0] = {`IRQ_NR-39+1{1'b0}};
 
@(r15==16'hfd01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 25: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 25: GIE value =====");
if (r6 !==16'h6420) tb_error("====== IRQ 25: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 25: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 25: R8 value =====");
 
 
// Test interruption 26
//--------------------------
@(r15==16'hfe00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-38:0] = {`IRQ_NR-38+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-38:0] = {`IRQ_NR-38+1{1'b0}};
 
@(r15==16'hfe01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 26: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 26: GIE value =====");
if (r6 !==16'h0134) tb_error("====== IRQ 26: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 26: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 26: R8 value =====");
 
 
// Test interruption 27
//--------------------------
@(r15==16'hff00);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-37:0] = {`IRQ_NR-37+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-37:0] = {`IRQ_NR-37+1{1'b0}};
 
@(r15==16'hff01);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 27: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 27: GIE value =====");
if (r6 !==16'h1245) tb_error("====== IRQ 27: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 27: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 27: R8 value =====");
 
 
// Test interruption 28
//--------------------------
@(r15==16'hff10);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-36:0] = {`IRQ_NR-36+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-36:0] = {`IRQ_NR-36+1{1'b0}};
 
@(r15==16'hff11);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 28: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 28: GIE value =====");
if (r6 !==16'h2356) tb_error("====== IRQ 28: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 28: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 28: R8 value =====");
 
 
// Test interruption 29
//--------------------------
@(r15==16'hff20);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-35:0] = {`IRQ_NR-35+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-35:0] = {`IRQ_NR-35+1{1'b0}};
 
@(r15==16'hff21);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 29: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 29: GIE value =====");
if (r6 !==16'h3467) tb_error("====== IRQ 29: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 29: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 29: R8 value =====");
 
 
// Test interruption 30
//--------------------------
@(r15==16'hff30);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-34:0] = {`IRQ_NR-34+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-34:0] = {`IRQ_NR-34+1{1'b0}};
 
@(r15==16'hff31);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 30: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 30: GIE value =====");
if (r6 !==16'h4578) tb_error("====== IRQ 30: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 30: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 30: R8 value =====");
 
 
// Test interruption 31
//--------------------------
@(r15==16'hff40);
repeat(2) @(posedge mclk);
irq[`IRQ_NR-33:0] = {`IRQ_NR-33+1{1'b1}};
repeat(15) @(posedge mclk);
irq[`IRQ_NR-33:0] = {`IRQ_NR-33+1{1'b0}};
 
@(r15==16'hff41);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 31: SP value =====");
if (r2[3] !==1'b1) tb_error("====== IRQ 31: GIE value =====");
if (r6 !==16'h5689) tb_error("====== IRQ 31: R6 value =====");
if (r7 !==16'h0000) tb_error("====== IRQ 31: R7 value =====");
if (r8 !==(`PER_SIZE+16'h004e)) tb_error("====== IRQ 31: R8 value =====");
 
 
stimulus_done = 1;
`else
 
$display(" ===============================================");
$display("| SIMULATION SKIPPED |");
$display("| (RTL configured to support 16 or 32 IRQs) |");
$display(" ===============================================");
$finish;
`endif
end
 
/rtl_sim/src/sing-op_reti.v
74,9 → 74,9
//--------------------------
@(r15==16'h3000);
repeat(2) @(posedge mclk);
irq[0] = 1'b1;
irq[`IRQ_NR-16:0] = {`IRQ_NR-16+1{1'b1}};
repeat(15) @(posedge mclk);
irq[0] = 1'b0;
irq[`IRQ_NR-16:0] = {`IRQ_NR-16+1{1'b0}};
 
@(r15==16'h3001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 0: SP value =====");
90,9 → 90,9
//--------------------------
@(r15==16'h4000);
repeat(2) @(posedge mclk);
irq[1:0] = {2{1'b1}};
irq[`IRQ_NR-15:0] = {`IRQ_NR-15+1{1'b1}};
repeat(15) @(posedge mclk);
irq[1:0] = 1'b0;
irq[`IRQ_NR-15:0] = {`IRQ_NR-15+1{1'b0}};
 
@(r15==16'h4001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 1: SP value =====");
106,9 → 106,9
//--------------------------
@(r15==16'h5000);
repeat(2) @(posedge mclk);
irq[2:0] = {3{1'b1}};
irq[`IRQ_NR-14:0] = {`IRQ_NR-14+1{1'b1}};
repeat(15) @(posedge mclk);
irq[2:0] = 1'b0;
irq[`IRQ_NR-14:0] = {`IRQ_NR-14+1{1'b0}};
 
@(r15==16'h5001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 2: SP value =====");
122,9 → 122,9
//--------------------------
@(r15==16'h6000);
repeat(2) @(posedge mclk);
irq[3:0] = {4{1'b1}};
irq[`IRQ_NR-13:0] = {`IRQ_NR-13+1{1'b1}};
repeat(15) @(posedge mclk);
irq[3:0] = 1'b0;
irq[`IRQ_NR-13:0] = {`IRQ_NR-13+1{1'b0}};
 
@(r15==16'h6001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 3: SP value =====");
138,9 → 138,9
//--------------------------
@(r15==16'h7000);
repeat(2) @(posedge mclk);
irq[4:0] = {5{1'b1}};
irq[`IRQ_NR-12:0] = {`IRQ_NR-12+1{1'b1}};
repeat(15) @(posedge mclk);
irq[4:0] = 1'b0;
irq[`IRQ_NR-12:0] = {`IRQ_NR-12+1{1'b0}};
 
@(r15==16'h7001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 4: SP value =====");
154,9 → 154,9
//--------------------------
@(r15==16'h8000);
repeat(2) @(posedge mclk);
irq[5:0] = {6{1'b1}};
irq[`IRQ_NR-11:0] = {`IRQ_NR-11+1{1'b1}};
repeat(15) @(posedge mclk);
irq[5:0] = 1'b0;
irq[`IRQ_NR-11:0] = {`IRQ_NR-11+1{1'b0}};
 
@(r15==16'h8001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 5: SP value =====");
170,9 → 170,9
//--------------------------
@(r15==16'h9000);
repeat(2) @(posedge mclk);
irq[6:0] = {7{1'b1}};
irq[`IRQ_NR-10:0] = {`IRQ_NR-10+1{1'b1}};
repeat(15) @(posedge mclk);
irq[6:0] = 1'b0;
irq[`IRQ_NR-10:0] = {`IRQ_NR-10+1{1'b0}};
 
@(r15==16'h9001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 6: SP value =====");
186,9 → 186,9
//--------------------------
@(r15==16'ha000);
repeat(2) @(posedge mclk);
irq[7:0] = {8{1'b1}};
irq[`IRQ_NR-9:0] = {`IRQ_NR-9+1{1'b1}};
repeat(15) @(posedge mclk);
irq[7:0] = 1'b0;
irq[`IRQ_NR-9:0] = {`IRQ_NR-9+1{1'b0}};
 
@(r15==16'ha001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 7: SP value =====");
202,9 → 202,9
//--------------------------
@(r15==16'hb000);
repeat(2) @(posedge mclk);
irq[8:0] = {9{1'b1}};
irq[`IRQ_NR-8:0] = {`IRQ_NR-8+1{1'b1}};
repeat(15) @(posedge mclk);
irq[8:0] = 1'b0;
irq[`IRQ_NR-8:0] = {`IRQ_NR-8+1{1'b0}};
 
@(r15==16'hb001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 8: SP value =====");
218,9 → 218,9
//--------------------------
@(r15==16'hc000);
repeat(2) @(posedge mclk);
irq[9:0] = {10{1'b1}};
irq[`IRQ_NR-7:0] = {`IRQ_NR-7+1{1'b1}};
repeat(15) @(posedge mclk);
irq[9:0] = 1'b0;
irq[`IRQ_NR-7:0] = {`IRQ_NR-7+1{1'b0}};
 
@(r15==16'hc001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 9: SP value =====");
234,9 → 234,9
//--------------------------
@(r15==16'hd000);
repeat(2) @(posedge mclk);
irq[10:0] = {11{1'b1}};
irq[`IRQ_NR-6:0] = {`IRQ_NR-6+1{1'b1}};
repeat(15) @(posedge mclk);
irq[10:0] = 1'b0;
irq[`IRQ_NR-6:0] = {`IRQ_NR-6+1{1'b0}};
 
@(r15==16'hd001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 10: SP value =====");
250,9 → 250,9
//--------------------------
@(r15==16'he000);
repeat(2) @(posedge mclk);
irq[11:0] = {12{1'b1}};
irq[`IRQ_NR-5:0] = {`IRQ_NR-5+1{1'b1}};
repeat(15) @(posedge mclk);
irq[11:0] = 1'b0;
irq[`IRQ_NR-5:0] = {`IRQ_NR-5+1{1'b0}};
 
@(r15==16'he001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 11: SP value =====");
266,9 → 266,9
//--------------------------
@(r15==16'hf000);
repeat(2) @(posedge mclk);
irq[12:0] = {13{1'b1}};
irq[`IRQ_NR-4:0] = {`IRQ_NR-4+1{1'b1}};
repeat(15) @(posedge mclk);
irq[12:0] = 1'b0;
irq[`IRQ_NR-4:0] = {`IRQ_NR-4+1{1'b0}};
 
@(r15==16'hf001);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 12: SP value =====");
282,9 → 282,9
//--------------------------
@(r15==16'hf100);
repeat(2) @(posedge mclk);
irq[13:0] = {14{1'b1}};
irq[`IRQ_NR-3:0] = {`IRQ_NR-3+1{1'b1}};
repeat(15) @(posedge mclk);
irq[13:0] = 1'b0;
irq[`IRQ_NR-3:0] = {`IRQ_NR-3+1{1'b0}};
 
@(r15==16'hf101);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== IRQ 13: SP value =====");
301,11 → 301,11
repeat(2) @(negedge mclk);
nmi = 1'b1;
@(posedge nmi_detect);
irq[13:0] = {14{1'b1}};
irq[`IRQ_NR-3:0] = {`IRQ_NR-3+1{1'b1}};
repeat(8) @(posedge mclk);
nmi = 1'b0;
repeat(2) @(posedge mclk);
irq[13:0] = 1'b0;
irq[`IRQ_NR-3:0] = {`IRQ_NR-3+1{1'b0}};
 
@(r15==16'hf201);
if (r1 !==(`PER_SIZE+16'h0052)) tb_error("====== NMI: SP value =====");
/rtl_sim/bin/msp430sim
125,10 → 125,11
# Make local copy of the openMSP403 configuration file
# and prepare it for MSPGCC preprocessing
cp $incfile ./pmem.h
sed -i 's/`ifdef/#ifdef/g' ./pmem.h
sed -i 's/`else/#else/g' ./pmem.h
sed -i 's/`endif/#endif/g' ./pmem.h
sed -i 's/`define/#define/g' ./pmem.h
sed -i 's/`ifdef/#ifdef/g' ./pmem.h
sed -i 's/`else/#else/g' ./pmem.h
sed -i 's/`endif/#endif/g' ./pmem.h
sed -i 's/`define/#define/g' ./pmem.h
sed -i 's/`include/\/\/#include/g' ./pmem.h
sed -i 's/`//g' ./pmem.h
sed -i "s/'//g" ./pmem.h
 
/rtl_sim/bin/msp430sim_c
106,10 → 106,11
# Make local copy of the openMSP403 configuration file
# and prepare it for MSPGCC preprocessing
cp $incfile ./pmem.h
sed -i 's/`ifdef/#ifdef/g' ./pmem.h
sed -i 's/`else/#else/g' ./pmem.h
sed -i 's/`endif/#endif/g' ./pmem.h
sed -i 's/`define/#define/g' ./pmem.h
sed -i 's/`ifdef/#ifdef/g' ./pmem.h
sed -i 's/`else/#else/g' ./pmem.h
sed -i 's/`endif/#endif/g' ./pmem.h
sed -i 's/`define/#define/g' ./pmem.h
sed -i 's/`include/\/\/#include/g' ./pmem.h
sed -i 's/`//g' ./pmem.h
sed -i "s/'//g" ./pmem.h
 
/rtl_sim/bin/template.x
3,9 → 3,11
OUTPUT_ARCH("msp430")
MEMORY
{
text (rx) : ORIGIN = PMEM_BASE, LENGTH = PMEM_SIZE
data (rwx) : ORIGIN = PER_SIZE, LENGTH = DMEM_SIZE
vectors (rw) : ORIGIN = 0xffe0, LENGTH = 0x20
text (rx) : ORIGIN = PMEM_BASE, LENGTH = PMEM_SIZE
data (rwx) : ORIGIN = PER_SIZE, LENGTH = DMEM_SIZE
vectors64 (rw) : ORIGIN = 0xff80, LENGTH = 0x40
vectors32 (rw) : ORIGIN = 0xffc0, LENGTH = 0x20
vectors (rw) : ORIGIN = 0xffe0, LENGTH = 0x20
}
SECTIONS
{
131,6 → 133,18
PROVIDE (__noinit_end = .) ;
_end = . ;
} > data
.vectors32 :
{
PROVIDE (__vectors32_start = .) ;
*(.vectors32*)
_vectors32_end = . ;
} > vectors32
.vectors64 :
{
PROVIDE (__vectors64_start = .) ;
*(.vectors64*)
_vectors64_end = . ;
} > vectors64
.vectors :
{
PROVIDE (__vectors_start = .) ;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.