Line 29... |
Line 29... |
//
|
//
|
// *Author(s):
|
// *Author(s):
|
// - Olivier Girard, olgirard@gmail.com
|
// - Olivier Girard, olgirard@gmail.com
|
//
|
//
|
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
// $Rev: 200 $
|
// $Rev: 202 $
|
// $LastChangedBy: olivier.girard $
|
// $LastChangedBy: olivier.girard $
|
// $LastChangedDate: 2015-01-21 23:01:31 +0100 (Wed, 21 Jan 2015) $
|
// $LastChangedDate: 2015-07-01 23:13:32 +0200 (Wed, 01 Jul 2015) $
|
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
`include "timescale.v"
|
`include "timescale.v"
|
`ifdef OMSP_NO_INCLUDE
|
`ifdef OMSP_NO_INCLUDE
|
`else
|
`else
|
`include "openMSP430_defines.v"
|
`include "openMSP430_defines.v"
|
Line 66... |
Line 66... |
wire [15:0] per_din;
|
wire [15:0] per_din;
|
wire [15:0] per_dout;
|
wire [15:0] per_dout;
|
wire [1:0] per_we;
|
wire [1:0] per_we;
|
wire per_en;
|
wire per_en;
|
|
|
|
// Direct Memory Access interface
|
|
wire [15:0] dma_dout;
|
|
wire dma_ready;
|
|
wire dma_resp;
|
|
reg [15:1] dma_addr;
|
|
reg [15:0] dma_din;
|
|
reg dma_en;
|
|
reg dma_priority;
|
|
reg [1:0] dma_we;
|
|
reg dma_wkup;
|
|
|
// Digital I/O
|
// Digital I/O
|
wire irq_port1;
|
wire irq_port1;
|
wire irq_port2;
|
wire irq_port2;
|
wire [15:0] per_dout_dio;
|
wire [15:0] per_dout_dio;
|
wire [7:0] p1_dout;
|
wire [7:0] p1_dout;
|
Line 190... |
Line 201... |
wire [15:0] inst_pc;
|
wire [15:0] inst_pc;
|
wire [8*32-1:0] inst_short;
|
wire [8*32-1:0] inst_short;
|
|
|
// Testbench variables
|
// Testbench variables
|
integer tb_idx;
|
integer tb_idx;
|
|
integer tmp_seed;
|
integer error;
|
integer error;
|
reg stimulus_done;
|
reg stimulus_done;
|
|
|
|
|
//
|
//
|
Line 205... |
Line 217... |
|
|
// Debug interface tasks
|
// Debug interface tasks
|
`include "dbg_uart_tasks.v"
|
`include "dbg_uart_tasks.v"
|
`include "dbg_i2c_tasks.v"
|
`include "dbg_i2c_tasks.v"
|
|
|
|
// Direct Memory Access interface tasks
|
|
`include "dma_tasks.v"
|
|
|
// Verilog stimulus
|
// Verilog stimulus
|
`include "stimulus.v"
|
`include "stimulus.v"
|
|
|
|
|
//
|
//
|
Line 263... |
Line 278... |
reset_n = 1'b1;
|
reset_n = 1'b1;
|
end
|
end
|
|
|
initial
|
initial
|
begin
|
begin
|
|
tmp_seed = `SEED;
|
|
tmp_seed = $urandom(tmp_seed);
|
error = 0;
|
error = 0;
|
stimulus_done = 1;
|
stimulus_done = 1;
|
irq = {`IRQ_NR-2{1'b0}};
|
irq = {`IRQ_NR-2{1'b0}};
|
nmi = 1'b0;
|
nmi = 1'b0;
|
wkup = 14'h0000;
|
wkup = 14'h0000;
|
|
dma_addr = 15'h0000;
|
|
dma_din = 16'h0000;
|
|
dma_en = 1'b0;
|
|
dma_priority = 1'b0;
|
|
dma_we = 2'b00;
|
|
dma_wkup = 1'b0;
|
|
dma_tfx_cancel = 1'b0;
|
cpu_en = 1'b1;
|
cpu_en = 1'b1;
|
dbg_en = 1'b0;
|
dbg_en = 1'b0;
|
dbg_uart_rxd_sel = 1'b0;
|
dbg_uart_rxd_sel = 1'b0;
|
dbg_uart_rxd_dly = 1'b1;
|
dbg_uart_rxd_dly = 1'b1;
|
dbg_uart_rxd_pre = 1'b1;
|
dbg_uart_rxd_pre = 1'b1;
|
Line 358... |
Line 382... |
.dco_enable (dco_enable), // ASIC ONLY: Fast oscillator enable
|
.dco_enable (dco_enable), // ASIC ONLY: Fast oscillator enable
|
.dco_wkup (dco_wkup), // ASIC ONLY: Fast oscillator wake-up (asynchronous)
|
.dco_wkup (dco_wkup), // ASIC ONLY: Fast oscillator wake-up (asynchronous)
|
.dmem_addr (dmem_addr), // Data Memory address
|
.dmem_addr (dmem_addr), // Data Memory address
|
.dmem_cen (dmem_cen), // Data Memory chip enable (low active)
|
.dmem_cen (dmem_cen), // Data Memory chip enable (low active)
|
.dmem_din (dmem_din), // Data Memory data input
|
.dmem_din (dmem_din), // Data Memory data input
|
.dmem_wen (dmem_wen), // Data Memory write enable (low active)
|
.dmem_wen (dmem_wen), // Data Memory write byte enable (low active)
|
.irq_acc (irq_acc), // Interrupt request accepted (one-hot signal)
|
.irq_acc (irq_acc), // Interrupt request accepted (one-hot signal)
|
.lfxt_enable (lfxt_enable), // ASIC ONLY: Low frequency oscillator enable
|
.lfxt_enable (lfxt_enable), // ASIC ONLY: Low frequency oscillator enable
|
.lfxt_wkup (lfxt_wkup), // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
|
.lfxt_wkup (lfxt_wkup), // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
|
.mclk (mclk), // Main system clock
|
.mclk (mclk), // Main system clock
|
|
.dma_dout (dma_dout), // Direct Memory Access data output
|
|
.dma_ready (dma_ready), // Direct Memory Access is complete
|
|
.dma_resp (dma_resp), // Direct Memory Access response (0:Okay / 1:Error)
|
.per_addr (per_addr), // Peripheral address
|
.per_addr (per_addr), // Peripheral address
|
.per_din (per_din), // Peripheral data input
|
.per_din (per_din), // Peripheral data input
|
.per_we (per_we), // Peripheral write enable (high active)
|
|
.per_en (per_en), // Peripheral enable (high active)
|
.per_en (per_en), // Peripheral enable (high active)
|
|
.per_we (per_we), // Peripheral write byte enable (high active)
|
.pmem_addr (pmem_addr), // Program Memory address
|
.pmem_addr (pmem_addr), // Program Memory address
|
.pmem_cen (pmem_cen), // Program Memory chip enable (low active)
|
.pmem_cen (pmem_cen), // Program Memory chip enable (low active)
|
.pmem_din (pmem_din), // Program Memory data input (optional)
|
.pmem_din (pmem_din), // Program Memory data input (optional)
|
.pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
|
.pmem_wen (pmem_wen), // Program Memory write byte enable (low active) (optional)
|
.puc_rst (puc_rst), // Main system reset
|
.puc_rst (puc_rst), // Main system reset
|
.smclk (smclk), // ASIC ONLY: SMCLK
|
.smclk (smclk), // ASIC ONLY: SMCLK
|
.smclk_en (smclk_en), // FPGA ONLY: SMCLK enable
|
.smclk_en (smclk_en), // FPGA ONLY: SMCLK enable
|
|
|
// INPUTs
|
// INPUTs
|
Line 387... |
Line 414... |
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD (asynchronous)
|
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD (asynchronous)
|
.dco_clk (dco_clk), // Fast oscillator (fast clock)
|
.dco_clk (dco_clk), // Fast oscillator (fast clock)
|
.dmem_dout (dmem_dout), // Data Memory data output
|
.dmem_dout (dmem_dout), // Data Memory data output
|
.irq (irq_in), // Maskable interrupts
|
.irq (irq_in), // Maskable interrupts
|
.lfxt_clk (lfxt_clk), // Low frequency oscillator (typ 32kHz)
|
.lfxt_clk (lfxt_clk), // Low frequency oscillator (typ 32kHz)
|
|
.dma_addr (dma_addr), // Direct Memory Access address
|
|
.dma_din (dma_din), // Direct Memory Access data input
|
|
.dma_en (dma_en), // Direct Memory Access enable (high active)
|
|
.dma_priority (dma_priority), // Direct Memory Access priority (0:low / 1:high)
|
|
.dma_we (dma_we), // Direct Memory Access write byte enable (high active)
|
|
.dma_wkup (dma_wkup), // ASIC ONLY: DMA Sub-System Wake-up (asynchronous and non-glitchy)
|
.nmi (nmi), // Non-maskable interrupt (asynchronous)
|
.nmi (nmi), // Non-maskable interrupt (asynchronous)
|
.per_dout (per_dout), // Peripheral data output
|
.per_dout (per_dout), // Peripheral data output
|
.pmem_dout (pmem_dout), // Program Memory data output
|
.pmem_dout (pmem_dout), // Program Memory data output
|
.reset_n (reset_n), // Reset Pin (low active, asynchronous)
|
.reset_n (reset_n), // Reset Pin (low active, asynchronous)
|
.scan_enable (scan_enable), // ASIC ONLY: Scan enable (active during scan shifting)
|
.scan_enable (scan_enable), // ASIC ONLY: Scan enable (active during scan shifting)
|
Line 492... |
Line 525... |
.ta_cci2a (ta_cci2a), // Timer A compare 2 input A
|
.ta_cci2a (ta_cci2a), // Timer A compare 2 input A
|
.ta_cci2b (ta_cci2b), // Timer A compare 2 input B
|
.ta_cci2b (ta_cci2b), // Timer A compare 2 input B
|
.taclk (taclk) // TACLK external timer clock (SLOW)
|
.taclk (taclk) // TACLK external timer clock (SLOW)
|
);
|
);
|
|
|
|
|
//
|
//
|
// Peripheral templates
|
// Peripheral templates
|
//----------------------------------
|
//----------------------------------
|
|
|
template_periph_8b template_periph_8b_0 (
|
template_periph_8b template_periph_8b_0 (
|
Line 679... |
Line 711... |
`endif
|
`endif
|
$display(" ===============================================");
|
$display(" ===============================================");
|
$display("| SIMULATION FAILED |");
|
$display("| SIMULATION FAILED |");
|
$display("| (simulation Timeout) |");
|
$display("| (simulation Timeout) |");
|
$display(" ===============================================");
|
$display(" ===============================================");
|
|
$display("");
|
|
tb_extra_report;
|
$finish;
|
$finish;
|
`endif
|
`endif
|
end
|
end
|
|
|
initial // Normal end of test
|
initial // Normal end of test
|
begin
|
begin
|
@(negedge stimulus_done);
|
@(negedge stimulus_done);
|
wait(inst_pc=='hffff);
|
wait(inst_pc=='hffff);
|
|
|
$display(" ===============================================");
|
$display(" ===============================================");
|
if (error!=0)
|
if ((dma_rd_error!=0) || (dma_wr_error!=0))
|
|
begin
|
|
$display("| SIMULATION FAILED |");
|
|
$display("| (some DMA transfer failed) |");
|
|
end
|
|
else if (error!=0)
|
begin
|
begin
|
$display("| SIMULATION FAILED |");
|
$display("| SIMULATION FAILED |");
|
$display("| (some verilog stimulus checks failed) |");
|
$display("| (some verilog stimulus checks failed) |");
|
end
|
end
|
else if (~stimulus_done)
|
else if (~stimulus_done)
|
Line 704... |
Line 743... |
else
|
else
|
begin
|
begin
|
$display("| SIMULATION PASSED |");
|
$display("| SIMULATION PASSED |");
|
end
|
end
|
$display(" ===============================================");
|
$display(" ===============================================");
|
|
$display("");
|
|
tb_extra_report;
|
$finish;
|
$finish;
|
end
|
end
|
|
|
|
|
//
|
//
|
Line 720... |
Line 761... |
$display("ERROR: %s %t", error_string, $time);
|
$display("ERROR: %s %t", error_string, $time);
|
error = error+1;
|
error = error+1;
|
end
|
end
|
endtask
|
endtask
|
|
|
|
task tb_extra_report;
|
|
begin
|
|
$display("DMA REPORT: Total Accesses: %-d Total RD: %-d Total WR: %-d", dma_cnt_rd+dma_cnt_wr, dma_cnt_rd, dma_cnt_wr);
|
|
$display(" Total Errors: %-d Error RD: %-d Error WR: %-d", dma_rd_error+dma_wr_error, dma_rd_error, dma_wr_error);
|
|
if (!((`PMEM_SIZE>=4092) && (`DMEM_SIZE>=1024)))
|
|
begin
|
|
$display("");
|
|
$display("Note: DMA if verification disabled (PMEM must be 4kB or bigger, DMEM must be 1kB or bigger)");
|
|
end
|
|
$display("");
|
|
$display("SIMULATION SEED: %d", `SEED);
|
|
$display("");
|
|
end
|
|
endtask
|
|
|
|
task tb_skip_finish;
|
|
input [65*8-1:0] skip_string;
|
|
begin
|
|
$display(" ===============================================");
|
|
$display("| SIMULATION SKIPPED |");
|
|
$display("%s", skip_string);
|
|
$display(" ===============================================");
|
|
$display("");
|
|
tb_extra_report;
|
|
$finish;
|
|
end
|
|
endtask
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|