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

Subversion Repositories openmsp430

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 191 to Rev 192
    Reverse comparison

Rev 191 → Rev 192

/openmsp430/trunk/core/bench/verilog/tb_openMSP430.v
144,9 → 144,9
reg reset_n;
wire puc_rst;
reg nmi;
reg [13:0] irq;
wire [13:0] irq_acc;
wire [13:0] irq_in;
reg [`IRQ_NR-3:0] irq;
wire [`IRQ_NR-3:0] irq_acc;
wire [`IRQ_NR-3:0] irq_in;
reg cpu_en;
reg [13:0] wkup;
wire [13:0] wkup_in;
237,10 → 237,10
dco_local_enable = 1'b0;
forever
begin
#25; // 20 MHz
dco_local_enable = (dco_enable===1) ? dco_enable : (dco_wkup===1);
if (dco_local_enable)
dco_clk = ~dco_clk;
#25; // 20 MHz
dco_local_enable = (dco_enable===1) ? dco_enable : (dco_wkup===1);
if (dco_local_enable)
dco_clk = ~dco_clk;
end
end
 
250,10 → 250,10
lfxt_local_enable = 1'b0;
forever
begin
#763; // 655 kHz
lfxt_local_enable = (lfxt_enable===1) ? lfxt_enable : (lfxt_wkup===1);
if (lfxt_local_enable)
lfxt_clk = ~lfxt_clk;
#763; // 655 kHz
lfxt_local_enable = (lfxt_enable===1) ? lfxt_enable : (lfxt_wkup===1);
if (lfxt_local_enable)
lfxt_clk = ~lfxt_clk;
end
end
 
270,7 → 270,7
begin
error = 0;
stimulus_done = 1;
irq = 14'h0000;
irq = {`IRQ_NR-2{1'b0}};
nmi = 1'b0;
wkup = 14'h0000;
cpu_en = 1'b1;
444,7 → 444,7
.p6_dout_en (p6_dout_en), // Port 6 data output enable
.p6_sel (p6_sel), // Port 6 function select
.per_dout (per_dout_dio), // Peripheral data output
// INPUTs
.mclk (mclk), // Main system clock
.p1_din (p1_din), // Port 1 data input
481,7 → 481,7
.aclk_en (aclk_en), // ACLK enable (from CPU)
.dbg_freeze (dbg_freeze), // Freeze Timer A counter
.inclk (inclk), // INCLK external timer clock (SLOW)
.irq_ta0_acc (irq_acc[9]), // Interrupt request TACCR0 accepted
.irq_ta0_acc (irq_acc[`IRQ_NR-7]),// Interrupt request TACCR0 accepted
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
578,35 → 578,35
// Map peripheral interrupts & wakeups
//----------------------------------------
 
assign irq_in = irq | {1'b0, // Vector 13 (0xFFFA)
1'b0, // Vector 12 (0xFFF8)
1'b0, // Vector 11 (0xFFF6)
1'b0, // Vector 10 (0xFFF4) - Watchdog -
irq_ta0, // Vector 9 (0xFFF2)
irq_ta1, // Vector 8 (0xFFF0)
irq_uart_rx, // Vector 7 (0xFFEE)
irq_uart_tx, // Vector 6 (0xFFEC)
1'b0, // Vector 5 (0xFFEA)
1'b0, // Vector 4 (0xFFE8)
irq_port2, // Vector 3 (0xFFE6)
irq_port1, // Vector 2 (0xFFE4)
1'b0, // Vector 1 (0xFFE2)
1'b0}; // Vector 0 (0xFFE0)
assign irq_in = irq | {1'b0, // Vector 13 (0xFFFA)
1'b0, // Vector 12 (0xFFF8)
1'b0, // Vector 11 (0xFFF6)
1'b0, // Vector 10 (0xFFF4) - Watchdog -
irq_ta0, // Vector 9 (0xFFF2)
irq_ta1, // Vector 8 (0xFFF0)
irq_uart_rx, // Vector 7 (0xFFEE)
irq_uart_tx, // Vector 6 (0xFFEC)
1'b0, // Vector 5 (0xFFEA)
1'b0, // Vector 4 (0xFFE8)
irq_port2, // Vector 3 (0xFFE6)
irq_port1, // Vector 2 (0xFFE4)
1'b0, // Vector 1 (0xFFE2)
{`IRQ_NR-15{1'b0}}}; // Vector 0 (0xFFE0)
 
assign wkup_in = wkup | {1'b0, // Vector 13 (0xFFFA)
1'b0, // Vector 12 (0xFFF8)
1'b0, // Vector 11 (0xFFF6)
1'b0, // Vector 10 (0xFFF4) - Watchdog -
1'b0, // Vector 9 (0xFFF2)
1'b0, // Vector 8 (0xFFF0)
1'b0, // Vector 7 (0xFFEE)
1'b0, // Vector 6 (0xFFEC)
1'b0, // Vector 5 (0xFFEA)
1'b0, // Vector 4 (0xFFE8)
1'b0, // Vector 3 (0xFFE6)
1'b0, // Vector 2 (0xFFE4)
1'b0, // Vector 1 (0xFFE2)
1'b0}; // Vector 0 (0xFFE0)
assign wkup_in = wkup | {1'b0, // Vector 13 (0xFFFA)
1'b0, // Vector 12 (0xFFF8)
1'b0, // Vector 11 (0xFFF6)
1'b0, // Vector 10 (0xFFF4) - Watchdog -
1'b0, // Vector 9 (0xFFF2)
1'b0, // Vector 8 (0xFFF0)
1'b0, // Vector 7 (0xFFEE)
1'b0, // Vector 6 (0xFFEC)
1'b0, // Vector 5 (0xFFEA)
1'b0, // Vector 4 (0xFFE8)
1'b0, // Vector 3 (0xFFE6)
1'b0, // Vector 2 (0xFFE4)
1'b0, // Vector 1 (0xFFE2)
1'b0}; // Vector 0 (0xFFE0)
 
 
//
626,7 → 626,7
.data_out_en (1'b0), // Output enable
.data_out (1'b0) // Output
);
io_cell sda_slave_inst (
.pad (dbg_sda), // I/O pad
.data_in (dbg_sda_slave_in), // Input
642,7 → 642,7
.data_out_en (!dbg_scl_master), // Output enable
.data_out (1'b0) // Output
);
io_cell sda_master_inst (
.pad (dbg_sda), // I/O pad
.data_in (dbg_sda_master_in), // Input
726,17 → 726,17
$display(" ===============================================");
if (error!=0)
begin
$display("| SIMULATION FAILED |");
$display("| (some verilog stimulus checks failed) |");
$display("| SIMULATION FAILED |");
$display("| (some verilog stimulus checks failed) |");
end
else if (~stimulus_done)
begin
$display("| SIMULATION FAILED |");
$display("| (the verilog stimulus didn't complete) |");
$display("| SIMULATION FAILED |");
$display("| (the verilog stimulus didn't complete) |");
end
else
begin
$display("| SIMULATION PASSED |");
$display("| SIMULATION PASSED |");
end
$display(" ===============================================");
$finish;
750,8 → 750,8
task tb_error;
input [65*8:0] error_string;
begin
$display("ERROR: %s %t", error_string, $time);
error = error+1;
$display("ERROR: %s %t", error_string, $time);
error = error+1;
end
endtask
 
/openmsp430/trunk/core/rtl/verilog/omsp_frontend.v
48,101 → 48,101
module omsp_frontend (
 
// OUTPUTs
dbg_halt_st, // Halt/Run status from CPU
decode_noirq, // Frontend decode instruction
e_state, // Execution state
exec_done, // Execution completed
inst_ad, // Decoded Inst: destination addressing mode
inst_as, // Decoded Inst: source addressing mode
inst_alu, // ALU control signals
inst_bw, // Decoded Inst: byte width
inst_dest, // Decoded Inst: destination (one hot)
inst_dext, // Decoded Inst: destination extended instruction word
inst_irq_rst, // Decoded Inst: Reset interrupt
inst_jmp, // Decoded Inst: Conditional jump
inst_mov, // Decoded Inst: mov instruction
inst_sext, // Decoded Inst: source extended instruction word
inst_so, // Decoded Inst: Single-operand arithmetic
inst_src, // Decoded Inst: source (one hot)
inst_type, // Decoded Instruction type
irq_acc, // Interrupt request accepted (one-hot signal)
mab, // Frontend Memory address bus
mb_en, // Frontend Memory bus enable
mclk_enable, // Main System Clock enable
mclk_wkup, // Main System Clock wake-up (asynchronous)
nmi_acc, // Non-Maskable interrupt request accepted
pc, // Program counter
pc_nxt, // Next PC value (for CALL & IRQ)
dbg_halt_st, // Halt/Run status from CPU
decode_noirq, // Frontend decode instruction
e_state, // Execution state
exec_done, // Execution completed
inst_ad, // Decoded Inst: destination addressing mode
inst_as, // Decoded Inst: source addressing mode
inst_alu, // ALU control signals
inst_bw, // Decoded Inst: byte width
inst_dest, // Decoded Inst: destination (one hot)
inst_dext, // Decoded Inst: destination extended instruction word
inst_irq_rst, // Decoded Inst: Reset interrupt
inst_jmp, // Decoded Inst: Conditional jump
inst_mov, // Decoded Inst: mov instruction
inst_sext, // Decoded Inst: source extended instruction word
inst_so, // Decoded Inst: Single-operand arithmetic
inst_src, // Decoded Inst: source (one hot)
inst_type, // Decoded Instruction type
irq_acc, // Interrupt request accepted (one-hot signal)
mab, // Frontend Memory address bus
mb_en, // Frontend Memory bus enable
mclk_enable, // Main System Clock enable
mclk_wkup, // Main System Clock wake-up (asynchronous)
nmi_acc, // Non-Maskable interrupt request accepted
pc, // Program counter
pc_nxt, // Next PC value (for CALL & IRQ)
 
// INPUTs
cpu_en_s, // Enable CPU code execution (synchronous)
cpuoff, // Turns off the CPU
dbg_halt_cmd, // Halt CPU command
dbg_reg_sel, // Debug selected register for rd/wr access
fe_pmem_wait, // Frontend wait for Instruction fetch
gie, // General interrupt enable
irq, // Maskable interrupts
mclk, // Main system clock
mdb_in, // Frontend Memory data bus input
nmi_pnd, // Non-maskable interrupt pending
nmi_wkup, // NMI Wakeup
pc_sw, // Program counter software value
pc_sw_wr, // Program counter software write
puc_rst, // Main system reset
scan_enable, // Scan enable (active during scan shifting)
wdt_irq, // Watchdog-timer interrupt
wdt_wkup, // Watchdog Wakeup
wkup // System Wake-up (asynchronous)
cpu_en_s, // Enable CPU code execution (synchronous)
cpuoff, // Turns off the CPU
dbg_halt_cmd, // Halt CPU command
dbg_reg_sel, // Debug selected register for rd/wr access
fe_pmem_wait, // Frontend wait for Instruction fetch
gie, // General interrupt enable
irq, // Maskable interrupts
mclk, // Main system clock
mdb_in, // Frontend Memory data bus input
nmi_pnd, // Non-maskable interrupt pending
nmi_wkup, // NMI Wakeup
pc_sw, // Program counter software value
pc_sw_wr, // Program counter software write
puc_rst, // Main system reset
scan_enable, // Scan enable (active during scan shifting)
wdt_irq, // Watchdog-timer interrupt
wdt_wkup, // Watchdog Wakeup
wkup // System Wake-up (asynchronous)
);
 
// OUTPUTs
//=========
output dbg_halt_st; // Halt/Run status from CPU
output decode_noirq; // Frontend decode instruction
output [3:0] e_state; // Execution state
output exec_done; // Execution completed
output [7:0] inst_ad; // Decoded Inst: destination addressing mode
output [7:0] inst_as; // Decoded Inst: source addressing mode
output [11:0] inst_alu; // ALU control signals
output inst_bw; // Decoded Inst: byte width
output [15:0] inst_dest; // Decoded Inst: destination (one hot)
output [15:0] inst_dext; // Decoded Inst: destination extended instruction word
output inst_irq_rst; // Decoded Inst: Reset interrupt
output [7:0] inst_jmp; // Decoded Inst: Conditional jump
output inst_mov; // Decoded Inst: mov instruction
output [15:0] inst_sext; // Decoded Inst: source extended instruction word
output [7:0] inst_so; // Decoded Inst: Single-operand arithmetic
output [15:0] inst_src; // Decoded Inst: source (one hot)
output [2:0] inst_type; // Decoded Instruction type
output [13:0] irq_acc; // Interrupt request accepted (one-hot signal)
output [15:0] mab; // Frontend Memory address bus
output mb_en; // Frontend Memory bus enable
output mclk_enable; // Main System Clock enable
output mclk_wkup; // Main System Clock wake-up (asynchronous)
output nmi_acc; // Non-Maskable interrupt request accepted
output [15:0] pc; // Program counter
output [15:0] pc_nxt; // Next PC value (for CALL & IRQ)
output dbg_halt_st; // Halt/Run status from CPU
output decode_noirq; // Frontend decode instruction
output [3:0] e_state; // Execution state
output exec_done; // Execution completed
output [7:0] inst_ad; // Decoded Inst: destination addressing mode
output [7:0] inst_as; // Decoded Inst: source addressing mode
output [11:0] inst_alu; // ALU control signals
output inst_bw; // Decoded Inst: byte width
output [15:0] inst_dest; // Decoded Inst: destination (one hot)
output [15:0] inst_dext; // Decoded Inst: destination extended instruction word
output inst_irq_rst; // Decoded Inst: Reset interrupt
output [7:0] inst_jmp; // Decoded Inst: Conditional jump
output inst_mov; // Decoded Inst: mov instruction
output [15:0] inst_sext; // Decoded Inst: source extended instruction word
output [7:0] inst_so; // Decoded Inst: Single-operand arithmetic
output [15:0] inst_src; // Decoded Inst: source (one hot)
output [2:0] inst_type; // Decoded Instruction type
output [`IRQ_NR-3:0] irq_acc; // Interrupt request accepted (one-hot signal)
output [15:0] mab; // Frontend Memory address bus
output mb_en; // Frontend Memory bus enable
output mclk_enable; // Main System Clock enable
output mclk_wkup; // Main System Clock wake-up (asynchronous)
output nmi_acc; // Non-Maskable interrupt request accepted
output [15:0] pc; // Program counter
output [15:0] pc_nxt; // Next PC value (for CALL & IRQ)
 
// INPUTs
//=========
input cpu_en_s; // Enable CPU code execution (synchronous)
input cpuoff; // Turns off the CPU
input dbg_halt_cmd; // Halt CPU command
input [3:0] dbg_reg_sel; // Debug selected register for rd/wr access
input fe_pmem_wait; // Frontend wait for Instruction fetch
input gie; // General interrupt enable
input [13:0] irq; // Maskable interrupts
input mclk; // Main system clock
input [15:0] mdb_in; // Frontend Memory data bus input
input nmi_pnd; // Non-maskable interrupt pending
input nmi_wkup; // NMI Wakeup
input [15:0] pc_sw; // Program counter software value
input pc_sw_wr; // Program counter software write
input puc_rst; // Main system reset
input scan_enable; // Scan enable (active during scan shifting)
input wdt_irq; // Watchdog-timer interrupt
input wdt_wkup; // Watchdog Wakeup
input wkup; // System Wake-up (asynchronous)
input cpu_en_s; // Enable CPU code execution (synchronous)
input cpuoff; // Turns off the CPU
input dbg_halt_cmd; // Halt CPU command
input [3:0] dbg_reg_sel; // Debug selected register for rd/wr access
input fe_pmem_wait; // Frontend wait for Instruction fetch
input gie; // General interrupt enable
input [`IRQ_NR-3:0] irq; // Maskable interrupts
input mclk; // Main system clock
input [15:0] mdb_in; // Frontend Memory data bus input
input nmi_pnd; // Non-maskable interrupt pending
input nmi_wkup; // NMI Wakeup
input [15:0] pc_sw; // Program counter software value
input pc_sw_wr; // Program counter software write
input puc_rst; // Main system reset
input scan_enable; // Scan enable (active during scan shifting)
input wdt_irq; // Watchdog-timer interrupt
input wdt_wkup; // Watchdog Wakeup
input wkup; // System Wake-up (asynchronous)
 
 
//=============================================================================
149,6 → 149,15
// 1) UTILITY FUNCTIONS
//=============================================================================
 
// 64 bits one-hot decoder
function [63:0] one_hot64;
input [5:0] binary;
begin
one_hot64 = 64'h0000_0000_0000_0000;
one_hot64[binary] = 1'b1;
end
endfunction
 
// 16 bits one-hot decoder
function [15:0] one_hot16;
input [3:0] binary;
157,7 → 166,7
one_hot16[binary] = 1'b1;
end
endfunction
 
// 8 bits one-hot decoder
function [7:0] one_hot8;
input [2:0] binary;
166,6 → 175,17
one_hot8[binary] = 1'b1;
end
endfunction
 
// Get IRQ number
function [5:0] get_irq_num;
input [62:0] irq_all;
integer ii;
begin
get_irq_num = 6'h3f;
for (ii = 62; ii >= 0; ii = ii - 1)
if (&get_irq_num & irq_all[ii]) get_irq_num = ii[5:0];
end
endfunction
 
//=============================================================================
286,36 → 306,38
wire mclk_irq_num = mclk;
`endif
 
// Select interrupt vector
reg [3:0] irq_num;
// Combine all IRQs
`ifdef IRQ_16
wire [62:0] irq_all = {nmi_pnd, irq, 48'h0000_0000_0000} |
`else
`ifdef IRQ_32
wire [62:0] irq_all = {nmi_pnd, irq, 32'h0000} |
`else
`ifdef IRQ_64
wire [62:0] irq_all = {nmi_pnd, irq} |
`endif
`endif
`endif
{1'b0, 3'h0, wdt_irq, {58{1'b0}}};
 
// Select highest priority IRQ
reg [5:0] irq_num;
always @(posedge mclk_irq_num or posedge puc_rst)
if (puc_rst) irq_num <= 4'hf;
if (puc_rst) irq_num <= 6'h3f;
`ifdef CLOCK_GATING
else irq_num <= nmi_pnd ? 4'he :
else
`else
else if (irq_detect) irq_num <= nmi_pnd ? 4'he :
else if (irq_detect)
`endif
irq[13] ? 4'hd :
irq[12] ? 4'hc :
irq[11] ? 4'hb :
(irq[10] | wdt_irq) ? 4'ha :
irq[9] ? 4'h9 :
irq[8] ? 4'h8 :
irq[7] ? 4'h7 :
irq[6] ? 4'h6 :
irq[5] ? 4'h5 :
irq[4] ? 4'h4 :
irq[3] ? 4'h3 :
irq[2] ? 4'h2 :
irq[1] ? 4'h1 :
irq[0] ? 4'h0 : 4'hf;
irq_num <= get_irq_num(irq_all);
 
wire [15:0] irq_addr = {11'h7ff, irq_num, 1'b0};
// Generate selected IRQ vector address
wire [15:0] irq_addr = {9'h1ff, irq_num, 1'b0};
 
// Interrupt request accepted
wire [15:0] irq_acc_all = one_hot16(irq_num) & {16{(i_state==I_IRQ_FETCH)}};
wire [13:0] irq_acc = irq_acc_all[13:0];
wire nmi_acc = irq_acc_all[14];
wire [63:0] irq_acc_all = one_hot64(irq_num) & {64{(i_state==I_IRQ_FETCH)}};
wire [`IRQ_NR-3:0] irq_acc = irq_acc_all[61:64-`IRQ_NR];
wire nmi_acc = irq_acc_all[62];
 
//
// 4.2) SYSTEM WAKEUP
/openmsp430/trunk/core/rtl/verilog/omsp_alu.v
97,7 → 97,7
 
reg [4:0] Z_;
begin
Z_ = {1'b0,X}+{1'b0,Y}+{4'b0,C_};
Z_ = {1'b0,X}+{1'b0,Y}+{4'b0000,C_};
if (Z_<5'd10) bcd_add = Z_;
else bcd_add = Z_+5'd6;
end
/openmsp430/trunk/core/rtl/verilog/openMSP430_defines.v
139,6 → 139,17
 
 
//-------------------------------------------------------
// Number of available IRQs
//-------------------------------------------------------
// Indicates the number of interrupt vectors supported
// (16, 32 or 64).
//-------------------------------------------------------
//`define IRQ_16
//`define IRQ_32
`define IRQ_64
 
 
//-------------------------------------------------------
// Input synchronizers
//-------------------------------------------------------
// In some cases, the asynchronous input ports might
630,6 → 641,19
`define DMEM_MSB `DMEM_AWIDTH-1
`define PER_MSB `PER_AWIDTH-1
 
// Number of available IRQs
`ifdef IRQ_16
`define IRQ_NR 16
`endif
`ifdef IRQ_32
`define IRQ_NR 32
`define IRQ_NR_GE_32
`endif
`ifdef IRQ_64
`define IRQ_NR 64
`define IRQ_NR_GE_32
`endif
 
//
// STATES, REGISTER FIELDS, ...
//======================================
851,6 → 875,20
//======================================
// CONFIGURATION CHECKS
//======================================
 
`ifdef IRQ_16
`ifdef IRQ_32
CONFIGURATION ERROR: ONLY ONE OF THE IRQ NUMBER OPTION CAN BE SELECTED
`endif
`ifdef IRQ_64
CONFIGURATION ERROR: ONLY ONE OF THE IRQ NUMBER OPTION CAN BE SELECTED
`endif
`endif
`ifdef IRQ_32
`ifdef IRQ_64
CONFIGURATION ERROR: ONLY ONE OF THE IRQ NUMBER OPTION CAN BE SELECTED
`endif
`endif
`ifdef LFXT_DOMAIN
`else
`ifdef MCLK_MUX
/openmsp430/trunk/core/rtl/verilog/openMSP430.v
114,7 → 114,7
output dmem_cen; // Data Memory chip enable (low active)
output [15:0] dmem_din; // Data Memory data input
output [1:0] dmem_wen; // Data Memory write enable (low active)
output [13:0] irq_acc; // Interrupt request accepted (one-hot signal)
output [`IRQ_NR-3:0] irq_acc; // Interrupt request accepted (one-hot signal)
output lfxt_enable; // ASIC ONLY: Low frequency oscillator enable
output lfxt_wkup; // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
output mclk; // Main system clock
142,7 → 142,7
input dbg_uart_rxd; // Debug interface: UART RXD (asynchronous)
input dco_clk; // Fast oscillator (fast clock)
input [15:0] dmem_dout; // Data Memory data output
input [13:0] irq; // Maskable interrupts
input [`IRQ_NR-3:0] irq; // Maskable interrupts (14, 30 or 62)
input lfxt_clk; // Low frequency oscillator (typ 32kHz)
input nmi; // Non-maskable interrupt (asynchronous and non-glitchy)
input [15:0] per_dout; // Peripheral data output
261,7 → 261,7
.puc_rst (puc_rst), // Main system reset
.smclk (smclk), // SMCLK
.smclk_en (smclk_en), // SMCLK enable
// INPUTs
.cpu_en (cpu_en), // Enable CPU code execution (asynchronous)
.cpuoff (cpuoff), // Turns off the CPU
317,7 → 317,7
.nmi_acc (nmi_acc), // Non-Maskable interrupt request accepted
.pc (pc), // Program counter
.pc_nxt (pc_nxt), // Next PC value (for CALL & IRQ)
// INPUTs
.cpu_en_s (cpu_en_s), // Enable CPU code execution (synchronous)
.cpuoff (cpuoff), // Turns off the CPU
411,7 → 411,7
.pmem_cen (pmem_cen), // Program Memory chip enable (low active)
.pmem_din (pmem_din), // Program Memory data input (optional)
.pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
// INPUTs
.dbg_halt_st (dbg_halt_st), // Halt/Run status from CPU
.dbg_mem_addr (dbg_mem_addr), // Debug address for rd/wr access
446,7 → 446,7
.wdtie (wdtie), // Watchdog-timer interrupt enable
.wdtifg_sw_clr(wdtifg_sw_clr), // Watchdog-timer interrupt flag software clear
.wdtifg_sw_set(wdtifg_sw_set), // Watchdog-timer interrupt flag software set
// INPUTs
.cpu_nr_inst (cpu_nr_inst), // Current oMSP instance number
.cpu_nr_total (cpu_nr_total), // Total number of oMSP instances-1
471,32 → 471,32
omsp_watchdog watchdog_0 (
 
// OUTPUTs
.per_dout (per_dout_wdog), // Peripheral data output
.wdt_irq (wdt_irq), // Watchdog-timer interrupt
.wdt_reset (wdt_reset), // Watchdog-timer reset
.wdt_wkup (wdt_wkup), // Watchdog Wakeup
.wdtifg (wdtifg), // Watchdog-timer interrupt flag
.wdtnmies (wdtnmies), // Watchdog-timer NMI edge selection
.per_dout (per_dout_wdog), // Peripheral data output
.wdt_irq (wdt_irq), // Watchdog-timer interrupt
.wdt_reset (wdt_reset), // Watchdog-timer reset
.wdt_wkup (wdt_wkup), // Watchdog Wakeup
.wdtifg (wdtifg), // Watchdog-timer interrupt flag
.wdtnmies (wdtnmies), // Watchdog-timer NMI edge selection
// INPUTs
.aclk (aclk), // ACLK
.aclk_en (aclk_en), // ACLK enable
.dbg_freeze (dbg_freeze), // Freeze Watchdog counter
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
.per_en (per_en), // Peripheral enable (high active)
.per_we (per_we), // Peripheral write enable (high active)
.por (por), // Power-on reset
.puc_rst (puc_rst), // Main system reset
.scan_enable (scan_enable), // Scan enable (active during scan shifting)
.scan_mode (scan_mode), // Scan mode
.smclk (smclk), // SMCLK
.smclk_en (smclk_en), // SMCLK enable
.wdtie (wdtie), // Watchdog-timer interrupt enable
.wdtifg_irq_clr (irq_acc[10]), // Clear Watchdog-timer interrupt flag
.wdtifg_sw_clr (wdtifg_sw_clr), // Watchdog-timer interrupt flag software clear
.wdtifg_sw_set (wdtifg_sw_set) // Watchdog-timer interrupt flag software set
.aclk (aclk), // ACLK
.aclk_en (aclk_en), // ACLK enable
.dbg_freeze (dbg_freeze), // Freeze Watchdog counter
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
.per_en (per_en), // Peripheral enable (high active)
.per_we (per_we), // Peripheral write enable (high active)
.por (por), // Power-on reset
.puc_rst (puc_rst), // Main system reset
.scan_enable (scan_enable), // Scan enable (active during scan shifting)
.scan_mode (scan_mode), // Scan mode
.smclk (smclk), // SMCLK
.smclk_en (smclk_en), // SMCLK enable
.wdtie (wdtie), // Watchdog-timer interrupt enable
.wdtifg_irq_clr (irq_acc[`IRQ_NR-6]), // Clear Watchdog-timer interrupt flag
.wdtifg_sw_clr (wdtifg_sw_clr), // Watchdog-timer interrupt flag software clear
.wdtifg_sw_set (wdtifg_sw_set) // Watchdog-timer interrupt flag software set
);
`else
assign per_dout_wdog = 16'h0000;
516,7 → 516,7
 
// OUTPUTs
.per_dout (per_dout_mpy), // Peripheral data output
// INPUTs
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
559,7 → 559,7
.dbg_mem_wr (dbg_mem_wr), // Debug unit memory write
.dbg_reg_wr (dbg_reg_wr), // Debug unit CPU register write
.dbg_uart_txd (dbg_uart_txd), // Debug interface: UART TXD
// INPUTs
.cpu_en_s (cpu_en_s), // Enable CPU code execution (synchronous)
.cpu_id (cpu_id), // CPU ID
/openmsp430/trunk/core/rtl/verilog/openMSP430_undefines.v
166,6 → 166,17
`undef NMI
`endif
 
// Number of available IRQs
`ifdef IRQ_16
`undef IRQ_16
`endif
`ifdef IRQ_32
`undef IRQ_32
`endif
`ifdef IRQ_64
`undef IRQ_64
`endif
 
// Input synchronizers
`ifdef SYNC_NMI
`undef SYNC_NMI
382,6 → 393,14
`undef PER_MSB
`endif
 
// Number of available IRQs
`ifdef IRQ_NR
`undef IRQ_NR
`endif
`ifdef IRQ_NR_GE_32
`undef IRQ_NR_GE_32
`endif
 
// Instructions type
`ifdef INST_SO
`undef INST_SO
/openmsp430/trunk/core/sim/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
/openmsp430/trunk/core/sim/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
 
/openmsp430/trunk/core/sim/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
/openmsp430/trunk/core/sim/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
/openmsp430/trunk/core/sim/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);
 
/openmsp430/trunk/core/sim/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;
 
/openmsp430/trunk/core/sim/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 =====");
/openmsp430/trunk/core/sim/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
 
/openmsp430/trunk/core/sim/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 =====");
/openmsp430/trunk/core/sim/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
 
/openmsp430/trunk/core/sim/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
 
/openmsp430/trunk/core/sim/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.