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

Subversion Repositories openmsp430

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openmsp430/trunk/core/bench/verilog
    from Rev 111 to Rev 134
    Reverse comparison

Rev 111 → Rev 134

/dbg_uart_tasks.v
77,56 → 77,60
// is configured by the testbench.
// If not, the values from the openMSP430.inc file are taken over.
`ifdef DBG_UART_AUTO_SYNC
parameter UART_BAUD = 4000000;
parameter UART_CNT = ((20000000/UART_BAUD)-1);
parameter UART_BAUD = 4000000;
integer UART_PERIOD = 1000000000/UART_BAUD;
`else
parameter UART_CNT = `DBG_UART_CNT;
integer UART_PERIOD = `DBG_UART_CNT;
`endif
 
//----------------------------------------------------------------------------
// Receive UART frame from CPU Debug interface (8N1)
//----------------------------------------------------------------------------
 
task dbg_uart_rx;
output [7:0] dbg_rxbuf;
output [7:0] dbg_rxbuf;
reg [7:0] dbg_rxbuf;
reg [7:0] rxbuf;
integer rxcnt;
begin
@(negedge dbg_uart_txd);
dbg_rxbuf = 0;
rxbuf = 0;
repeat((UART_CNT+1)/2) @(posedge mclk);
for (rxcnt = 0; rxcnt < 8; rxcnt = rxcnt + 1)
begin
repeat(UART_CNT+1) @(posedge mclk);
rxbuf = {dbg_uart_txd, rxbuf[7:1]};
end
dbg_rxbuf = rxbuf;
end
reg [7:0] dbg_rxbuf;
reg [7:0] rxbuf;
integer rxcnt;
begin
#(1);
dbg_uart_rx_busy = 1'b1;
@(negedge dbg_uart_txd);
dbg_rxbuf = 0;
rxbuf = 0;
#(3*UART_PERIOD/2);
for (rxcnt = 0; rxcnt < 8; rxcnt = rxcnt + 1)
begin
rxbuf = {dbg_uart_txd, rxbuf[7:1]};
#(UART_PERIOD);
end
dbg_rxbuf = rxbuf;
dbg_uart_rx_busy = 1'b0;
end
endtask
 
task dbg_uart_rx16;
 
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
dbg_uart_rx(rxbuf_lo);
dbg_uart_rx(rxbuf_hi);
dbg_uart_buf = {rxbuf_hi, rxbuf_lo};
end
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
dbg_uart_rx(rxbuf_lo);
dbg_uart_rx(rxbuf_hi);
dbg_uart_buf = {rxbuf_hi, rxbuf_lo};
end
endtask
 
task dbg_uart_rx8;
 
reg [7:0] rxbuf;
begin
rxbuf = 8'h00;
dbg_uart_rx(rxbuf);
dbg_uart_buf = {8'h00, rxbuf};
end
reg [7:0] rxbuf;
begin
rxbuf = 8'h00;
dbg_uart_rx(rxbuf);
dbg_uart_buf = {8'h00, rxbuf};
end
endtask
 
//----------------------------------------------------------------------------
133,44 → 137,61
// Transmit UART frame to CPU Debug interface (8N1)
//----------------------------------------------------------------------------
task dbg_uart_tx;
input [7:0] txbuf;
 
reg [9:0] txbuf_full;
integer txcnt;
begin
dbg_uart_rxd = 1'b1;
txbuf_full = {1'b1, txbuf, 1'b0};
for (txcnt = 0; txcnt < 10; txcnt = txcnt + 1)
begin
repeat(UART_CNT+1) @(posedge mclk);
dbg_uart_rxd = txbuf_full[txcnt];
end
end
input [7:0] txbuf;
reg [9:0] txbuf_full;
integer txcnt;
begin
#(1);
dbg_uart_tx_busy = 1'b1;
dbg_uart_rxd_pre = 1'b1;
txbuf_full = {1'b1, txbuf, 1'b0};
for (txcnt = 0; txcnt < 10; txcnt = txcnt + 1)
begin
#(UART_PERIOD);
dbg_uart_rxd_pre = txbuf_full[txcnt];
end
dbg_uart_tx_busy = 1'b0;
end
endtask
 
task dbg_uart_tx16;
input [15:0] txbuf;
 
begin
dbg_uart_tx(txbuf[7:0]);
dbg_uart_tx(txbuf[15:8]);
end
input [15:0] txbuf;
begin
dbg_uart_tx(txbuf[7:0]);
dbg_uart_tx(txbuf[15:8]);
end
endtask
 
always @(posedge mclk or posedge dbg_rst)
if (dbg_rst)
begin
dbg_uart_rxd_sel <= 1'b0;
dbg_uart_rxd_dly <= 1'b1;
end
else if (dbg_en)
begin
dbg_uart_rxd_sel <= dbg_uart_rxd_meta ? $random : 1'b0;
dbg_uart_rxd_dly <= dbg_uart_rxd_pre;
end
 
assign dbg_uart_rxd = dbg_uart_rxd_sel ? dbg_uart_rxd_dly : dbg_uart_rxd_pre;
 
 
//----------------------------------------------------------------------------
// Write to Debug register
//----------------------------------------------------------------------------
task dbg_uart_wr;
input [7:0] dbg_reg;
input [15:0] dbg_data;
 
begin
dbg_uart_tx(DBG_WR | dbg_reg);
dbg_uart_tx(dbg_data[7:0]);
if (~dbg_reg[6])
dbg_uart_tx(dbg_data[15:8]);
end
input [7:0] dbg_reg;
input [15:0] dbg_data;
begin
dbg_uart_tx(DBG_WR | dbg_reg);
dbg_uart_tx(dbg_data[7:0]);
if (~dbg_reg[6])
dbg_uart_tx(dbg_data[15:8]);
end
endtask
 
 
178,18 → 199,30
// Read Debug register
//----------------------------------------------------------------------------
task dbg_uart_rd;
input [7:0] dbg_reg;
input [7:0] dbg_reg;
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
dbg_uart_tx(DBG_RD | dbg_reg);
dbg_uart_rx(rxbuf_lo);
if (~dbg_reg[6])
dbg_uart_rx(rxbuf_hi);
 
reg [7:0] rxbuf_lo;
reg [7:0] rxbuf_hi;
begin
rxbuf_lo = 8'h00;
rxbuf_hi = 8'h00;
dbg_uart_tx(DBG_RD | dbg_reg);
dbg_uart_rx(rxbuf_lo);
if (~dbg_reg[6])
dbg_uart_rx(rxbuf_hi);
 
dbg_uart_buf = {rxbuf_hi, rxbuf_lo};
dbg_uart_buf = {rxbuf_hi, rxbuf_lo};
end
endtask
 
//----------------------------------------------------------------------------
// Send synchronization frame
//----------------------------------------------------------------------------
task dbg_uart_sync;
begin
dbg_uart_tx(DBG_SYNC);
repeat(10) @(posedge mclk);
end
endtask
 
 
/tb_openMSP430.v
101,6 → 101,13
wire [15:0] per_dout_temp_8b;
wire [15:0] per_dout_temp_16b;
 
// Simple full duplex UART
wire [15:0] per_dout_uart;
wire irq_uart_rx;
wire irq_uart_tx;
wire uart_txd;
reg uart_rxd;
 
// Timer A
wire irq_ta0;
wire irq_ta1;
122,9 → 129,17
// Clock / Reset & Interrupts
reg dco_clk;
wire dco_enable;
wire dco_wkup;
reg dco_local_enable;
reg lfxt_clk;
wire lfxt_enable;
wire lfxt_wkup;
reg lfxt_local_enable;
wire mclk;
wire aclk;
wire aclk_en;
wire smclk;
wire smclk_en;
reg reset_n;
wire puc_rst;
133,13 → 148,25
wire [13:0] irq_acc;
wire [13:0] irq_in;
reg cpu_en;
reg [13:0] wkup;
wire [13:0] wkup_in;
// Scan (ASIC version only)
reg scan_enable;
reg scan_mode;
 
// Debug interface
reg dbg_en;
wire dbg_freeze;
wire dbg_uart_txd;
reg dbg_uart_rxd;
wire dbg_uart_rxd;
reg dbg_uart_rxd_sel;
reg dbg_uart_rxd_dly;
reg dbg_uart_rxd_pre;
reg dbg_uart_rxd_meta;
reg [15:0] dbg_uart_buf;
reg dbg_uart_rx_busy;
reg dbg_uart_tx_busy;
 
// Core testbench debuging signals
wire [8*32-1:0] i_state;
165,6 → 192,9
// Debug interface tasks
`include "dbg_uart_tasks.v"
 
// Simple uart tasks
//`include "uart_tasks.v"
 
// Verilog stimulus
`include "stimulus.v"
 
182,13 → 212,28
//------------------------------
initial
begin
dco_clk = 1'b0;
forever #25 dco_clk <= ~dco_clk; // 20 MHz
dco_clk = 1'b0;
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;
end
end
 
initial
begin
lfxt_clk = 1'b0;
forever #763 lfxt_clk <= ~lfxt_clk; // 655 kHz
lfxt_clk = 1'b0;
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;
end
end
 
initial
202,28 → 247,37
 
initial
begin
error = 0;
stimulus_done = 1;
irq = 14'b0000;
nmi = 1'b0;
cpu_en = 1'b1;
dbg_en = 1'b0;
dbg_uart_rxd = 1'b1;
dbg_uart_buf = 16'h0000;
p1_din = 8'h00;
p2_din = 8'h00;
p3_din = 8'h00;
p4_din = 8'h00;
p5_din = 8'h00;
p6_din = 8'h00;
inclk = 1'b0;
taclk = 1'b0;
ta_cci0a = 1'b0;
ta_cci0b = 1'b0;
ta_cci1a = 1'b0;
ta_cci1b = 1'b0;
ta_cci2a = 1'b0;
ta_cci2b = 1'b0;
error = 0;
stimulus_done = 1;
irq = 14'h0000;
nmi = 1'b0;
wkup = 14'h0000;
cpu_en = 1'b1;
dbg_en = 1'b0;
dbg_uart_rxd_sel = 1'b0;
dbg_uart_rxd_dly = 1'b1;
dbg_uart_rxd_pre = 1'b1;
dbg_uart_rxd_meta= 1'b0;
dbg_uart_buf = 16'h0000;
dbg_uart_rx_busy = 1'b0;
dbg_uart_tx_busy = 1'b0;
p1_din = 8'h00;
p2_din = 8'h00;
p3_din = 8'h00;
p4_din = 8'h00;
p5_din = 8'h00;
p6_din = 8'h00;
inclk = 1'b0;
taclk = 1'b0;
ta_cci0a = 1'b0;
ta_cci0b = 1'b0;
ta_cci1a = 1'b0;
ta_cci1b = 1'b0;
ta_cci2a = 1'b0;
ta_cci2b = 1'b0;
uart_rxd = 1'b1;
scan_enable = 1'b0;
scan_mode = 1'b0;
end
 
270,14 → 324,19
openMSP430 dut (
 
// OUTPUTs
.aclk_en (aclk_en), // ACLK enable
.aclk (aclk), // ASIC ONLY: ACLK
.aclk_en (aclk_en), // FPGA ONLY: ACLK enable
.dbg_freeze (dbg_freeze), // Freeze peripherals
.dbg_uart_txd (dbg_uart_txd), // Debug interface: UART TXD
.dco_enable (dco_enable), // ASIC ONLY: Fast oscillator enable
.dco_wkup (dco_wkup), // ASIC ONLY: Fast oscillator wake-up (asynchronous)
.dmem_addr (dmem_addr), // Data Memory address
.dmem_cen (dmem_cen), // Data Memory chip enable (low active)
.dmem_din (dmem_din), // Data Memory data input
.dmem_wen (dmem_wen), // Data Memory write enable (low active)
.irq_acc (irq_acc), // Interrupt request accepted (one-hot signal)
.lfxt_enable (lfxt_enable), // ASIC ONLY: Low frequency oscillator enable
.lfxt_wkup (lfxt_wkup), // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
.mclk (mclk), // Main system clock
.per_addr (per_addr), // Peripheral address
.per_din (per_din), // Peripheral data input
288,12 → 347,13
.pmem_din (pmem_din), // Program Memory data input (optional)
.pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
.puc_rst (puc_rst), // Main system reset
.smclk_en (smclk_en), // SMCLK enable
.smclk (smclk), // ASIC ONLY: SMCLK
.smclk_en (smclk_en), // FPGA ONLY: SMCLK enable
 
// INPUTs
.cpu_en (cpu_en), // Enable CPU code execution
.dbg_en (dbg_en), // Debug interface enable
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD
.cpu_en (cpu_en), // Enable CPU code execution (asynchronous)
.dbg_en (dbg_en), // Debug interface enable (asynchronous)
.dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD (asynchronous)
.dco_clk (dco_clk), // Fast oscillator (fast clock)
.dmem_dout (dmem_dout), // Data Memory data output
.irq (irq_in), // Maskable interrupts
301,7 → 361,10
.nmi (nmi), // Non-maskable interrupt (asynchronous)
.per_dout (per_dout), // Peripheral data output
.pmem_dout (pmem_dout), // Program Memory data output
.reset_n (reset_n) // Reset Pin (low active)
.reset_n (reset_n), // Reset Pin (low active, asynchronous)
.scan_enable (scan_enable), // ASIC ONLY: Scan enable (active during scan shifting)
.scan_mode (scan_mode), // ASIC ONLY: Scan mode
.wkup (|wkup_in) // ASIC ONLY: System Wake-up (asynchronous)
);
 
//
401,6 → 464,35
);
//
// Simple full duplex UART (8N1 protocol)
//----------------------------------------
`ifdef READY_FOR_PRIMETIME
omsp_uart #(.BASE_ADDR(15'h0080)) uart_0 (
 
// OUTPUTs
.irq_uart_rx (irq_uart_rx), // UART receive interrupt
.irq_uart_tx (irq_uart_tx), // UART transmit interrupt
.per_dout (per_dout_uart), // Peripheral data output
.uart_txd (uart_txd), // UART Data Transmit (TXD)
 
// INPUTs
.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)
.puc_rst (puc_rst), // Main system reset
.smclk_en (smclk_en), // SMCLK enable (from CPU)
.uart_rxd (uart_rxd) // UART Data Receive (RXD)
);
`else
assign irq_uart_rx = 1'b0;
assign irq_uart_tx = 1'b0;
assign per_dout_uart = 16'h0000;
assign uart_txd = 1'b0;
`endif
 
//
// Peripheral templates
//----------------------------------
 
442,30 → 534,46
 
assign per_dout = per_dout_dio |
per_dout_timerA |
per_dout_uart |
per_dout_temp_8b |
per_dout_temp_16b;
 
 
//
// Map peripheral interrupts
// 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)
1'b0, // Vector 7 (0xFFEE)
1'b0, // 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)
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)
 
 
//
// Debug utility signals
//----------------------------------------
516,11 → 624,15
begin
`ifdef NO_TIMEOUT
`else
`ifdef VERY_LONG_TIMEOUT
#500000000;
`else
`ifdef LONG_TIMEOUT
#5000000;
`else
#500000;
`endif
`endif
$display(" ===============================================");
$display("| SIMULATION FAILED |");
$display("| (simulation Timeout) |");
/msp_debug.v
149,9 → 149,9
 
always @(e_state_bin)
case(e_state_bin)
4'h0 : e_state = "IRQ_0";
4'h2 : e_state = "IRQ_0";
4'h1 : e_state = "IRQ_1";
4'h2 : e_state = "IRQ_2";
4'h0 : e_state = "IRQ_2";
4'h3 : e_state = "IRQ_3";
4'h4 : e_state = "IRQ_4";
4'h5 : e_state = "SRC_AD";
/registers.v
148,5 → 148,37
wire [15:0] irq_vect_00 = pmem_0.mem[(1<<(`PMEM_MSB+1))-16]; // IRQ 0
 
// Interrupt detection
wire nmi_detect = dut.frontend_0.inst_nmi;
wire irq_detect = dut.frontend_0.irq_detect;
wire nmi_detect = dut.frontend_0.nmi_pnd;
wire irq_detect = dut.frontend_0.irq_detect;
 
// Debug interface
wire dbg_clk = dut.clock_module_0.dbg_clk;
wire dbg_rst = dut.clock_module_0.dbg_rst;
 
 
// CPU ID
//======================
 
wire [2:0] dbg_cpu_version = `CPU_VERSION;
`ifdef ASIC
wire dbg_cpu_asic = 1'b1;
`else
wire dbg_cpu_asic = 1'b0;
`endif
wire [4:0] dbg_user_version = `USER_VERSION;
wire [6:0] dbg_per_space = (`PER_SIZE >> 9);
`ifdef MULTIPLIER
wire dbg_mpy_info = 1'b1;
`else
wire dbg_mpy_info = 1'b0;
`endif
wire [8:0] dbg_dmem_size = (`DMEM_SIZE >> 7);
wire [5:0] dbg_pmem_size = (`PMEM_SIZE >> 10);
 
wire [31:0] dbg_cpu_id = {dbg_pmem_size,
dbg_dmem_size,
dbg_mpy_info,
dbg_per_space,
dbg_user_version,
dbg_cpu_asic,
dbg_cpu_version};

powered by: WebSVN 2.1.0

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