Line 34... |
Line 34... |
//
|
//
|
// *Author(s):
|
// *Author(s):
|
// - Olivier Girard, olgirard@gmail.com
|
// - Olivier Girard, olgirard@gmail.com
|
//
|
//
|
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
// $Rev: 149 $
|
// $Rev: 154 $
|
// $LastChangedBy: olivier.girard $
|
// $LastChangedBy: olivier.girard $
|
// $LastChangedDate: 2012-07-19 22:21:12 +0200 (Thu, 19 Jul 2012) $
|
// $LastChangedDate: 2012-10-15 22:44:20 +0200 (Mon, 15 Oct 2012) $
|
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
`ifdef OMSP_NO_INCLUDE
|
`ifdef OMSP_NO_INCLUDE
|
`else
|
`else
|
`include "openMSP430_defines.v"
|
`include "openMSP430_defines.v"
|
`endif
|
`endif
|
|
|
module omsp_dbg (
|
module omsp_dbg (
|
|
|
// OUTPUTs
|
// OUTPUTs
|
|
dbg_cpu_reset, // Reset CPU from debug interface
|
dbg_freeze, // Freeze peripherals
|
dbg_freeze, // Freeze peripherals
|
dbg_halt_cmd, // Halt CPU command
|
dbg_halt_cmd, // Halt CPU command
|
|
dbg_i2c_sda_out, // Debug interface: I2C SDA OUT
|
dbg_mem_addr, // Debug address for rd/wr access
|
dbg_mem_addr, // Debug address for rd/wr access
|
dbg_mem_dout, // Debug unit data output
|
dbg_mem_dout, // Debug unit data output
|
dbg_mem_en, // Debug unit memory enable
|
dbg_mem_en, // Debug unit memory enable
|
dbg_mem_wr, // Debug unit memory write
|
dbg_mem_wr, // Debug unit memory write
|
dbg_reg_wr, // Debug unit CPU register write
|
dbg_reg_wr, // Debug unit CPU register write
|
dbg_cpu_reset, // Reset CPU from debug interface
|
|
dbg_uart_txd, // Debug interface: UART TXD
|
dbg_uart_txd, // Debug interface: UART TXD
|
|
|
// INPUTs
|
// INPUTs
|
cpu_en_s, // Enable CPU code execution (synchronous)
|
cpu_en_s, // Enable CPU code execution (synchronous)
|
cpu_id, // CPU ID
|
cpu_id, // CPU ID
|
|
cpu_nr_inst, // Current oMSP instance number
|
|
cpu_nr_total, // Total number of oMSP instances-1
|
dbg_clk, // Debug unit clock
|
dbg_clk, // Debug unit clock
|
dbg_en_s, // Debug interface enable (synchronous)
|
dbg_en_s, // Debug interface enable (synchronous)
|
dbg_halt_st, // Halt/Run status from CPU
|
dbg_halt_st, // Halt/Run status from CPU
|
|
dbg_i2c_addr, // Debug interface: I2C Address
|
|
dbg_i2c_broadcast, // Debug interface: I2C Broadcast Address (for multicore systems)
|
|
dbg_i2c_scl, // Debug interface: I2C SCL
|
|
dbg_i2c_sda_in, // Debug interface: I2C SDA IN
|
dbg_mem_din, // Debug unit Memory data input
|
dbg_mem_din, // Debug unit Memory data input
|
dbg_reg_din, // Debug unit CPU register data input
|
dbg_reg_din, // Debug unit CPU register data input
|
dbg_rst, // Debug unit reset
|
dbg_rst, // Debug unit reset
|
dbg_uart_rxd, // Debug interface: UART RXD (asynchronous)
|
dbg_uart_rxd, // Debug interface: UART RXD (asynchronous)
|
decode_noirq, // Frontend decode instruction
|
decode_noirq, // Frontend decode instruction
|
Line 81... |
Line 88... |
puc_pnd_set // PUC pending set for the serial debug interface
|
puc_pnd_set // PUC pending set for the serial debug interface
|
);
|
);
|
|
|
// OUTPUTs
|
// OUTPUTs
|
//=========
|
//=========
|
|
output dbg_cpu_reset; // Reset CPU from debug interface
|
output dbg_freeze; // Freeze peripherals
|
output dbg_freeze; // Freeze peripherals
|
output dbg_halt_cmd; // Halt CPU command
|
output dbg_halt_cmd; // Halt CPU command
|
|
output dbg_i2c_sda_out; // Debug interface: I2C SDA OUT
|
output [15:0] dbg_mem_addr; // Debug address for rd/wr access
|
output [15:0] dbg_mem_addr; // Debug address for rd/wr access
|
output [15:0] dbg_mem_dout; // Debug unit data output
|
output [15:0] dbg_mem_dout; // Debug unit data output
|
output dbg_mem_en; // Debug unit memory enable
|
output dbg_mem_en; // Debug unit memory enable
|
output [1:0] dbg_mem_wr; // Debug unit memory write
|
output [1:0] dbg_mem_wr; // Debug unit memory write
|
output dbg_reg_wr; // Debug unit CPU register write
|
output dbg_reg_wr; // Debug unit CPU register write
|
output dbg_cpu_reset; // Reset CPU from debug interface
|
|
output dbg_uart_txd; // Debug interface: UART TXD
|
output dbg_uart_txd; // Debug interface: UART TXD
|
|
|
// INPUTs
|
// INPUTs
|
//=========
|
//=========
|
input cpu_en_s; // Enable CPU code execution (synchronous)
|
input cpu_en_s; // Enable CPU code execution (synchronous)
|
input [31:0] cpu_id; // CPU ID
|
input [31:0] cpu_id; // CPU ID
|
|
input [7:0] cpu_nr_inst; // Current oMSP instance number
|
|
input [7:0] cpu_nr_total; // Total number of oMSP instances-1
|
input dbg_clk; // Debug unit clock
|
input dbg_clk; // Debug unit clock
|
input dbg_en_s; // Debug interface enable (synchronous)
|
input dbg_en_s; // Debug interface enable (synchronous)
|
input dbg_halt_st; // Halt/Run status from CPU
|
input dbg_halt_st; // Halt/Run status from CPU
|
|
input [6:0] dbg_i2c_addr; // Debug interface: I2C Address
|
|
input [6:0] dbg_i2c_broadcast; // Debug interface: I2C Broadcast Address (for multicore systems)
|
|
input dbg_i2c_scl; // Debug interface: I2C SCL
|
|
input dbg_i2c_sda_in; // Debug interface: I2C SDA IN
|
input [15:0] dbg_mem_din; // Debug unit Memory data input
|
input [15:0] dbg_mem_din; // Debug unit Memory data input
|
input [15:0] dbg_reg_din; // Debug unit CPU register data input
|
input [15:0] dbg_reg_din; // Debug unit CPU register data input
|
input dbg_rst; // Debug unit reset
|
input dbg_rst; // Debug unit reset
|
input dbg_uart_rxd; // Debug interface: UART RXD (asynchronous)
|
input dbg_uart_rxd; // Debug interface: UART RXD (asynchronous)
|
input decode_noirq; // Frontend decode instruction
|
input decode_noirq; // Frontend decode instruction
|
Line 146... |
Line 160... |
wire brk3_halt;
|
wire brk3_halt;
|
wire brk3_pnd;
|
wire brk3_pnd;
|
wire [15:0] brk3_dout;
|
wire [15:0] brk3_dout;
|
|
|
// Number of registers
|
// Number of registers
|
parameter NR_REG = 24;
|
parameter NR_REG = 25;
|
|
|
// Register addresses
|
// Register addresses
|
parameter CPU_ID_LO = 6'h00;
|
parameter CPU_ID_LO = 6'h00;
|
parameter CPU_ID_HI = 6'h01;
|
parameter CPU_ID_HI = 6'h01;
|
parameter CPU_CTL = 6'h02;
|
parameter CPU_CTL = 6'h02;
|
Line 181... |
Line 195... |
parameter BRK3_CTL = 6'h14;
|
parameter BRK3_CTL = 6'h14;
|
parameter BRK3_STAT = 6'h15;
|
parameter BRK3_STAT = 6'h15;
|
parameter BRK3_ADDR0 = 6'h16;
|
parameter BRK3_ADDR0 = 6'h16;
|
parameter BRK3_ADDR1 = 6'h17;
|
parameter BRK3_ADDR1 = 6'h17;
|
`endif
|
`endif
|
|
parameter CPU_NR = 6'h18;
|
|
|
// Register one-hot decoder
|
// Register one-hot decoder
|
parameter BASE_D = {{NR_REG-1{1'b0}}, 1'b1};
|
parameter BASE_D = {{NR_REG-1{1'b0}}, 1'b1};
|
parameter CPU_ID_LO_D = (BASE_D << CPU_ID_LO);
|
parameter CPU_ID_LO_D = (BASE_D << CPU_ID_LO);
|
parameter CPU_ID_HI_D = (BASE_D << CPU_ID_HI);
|
parameter CPU_ID_HI_D = (BASE_D << CPU_ID_HI);
|
Line 216... |
Line 231... |
parameter BRK3_CTL_D = (BASE_D << BRK3_CTL);
|
parameter BRK3_CTL_D = (BASE_D << BRK3_CTL);
|
parameter BRK3_STAT_D = (BASE_D << BRK3_STAT);
|
parameter BRK3_STAT_D = (BASE_D << BRK3_STAT);
|
parameter BRK3_ADDR0_D = (BASE_D << BRK3_ADDR0);
|
parameter BRK3_ADDR0_D = (BASE_D << BRK3_ADDR0);
|
parameter BRK3_ADDR1_D = (BASE_D << BRK3_ADDR1);
|
parameter BRK3_ADDR1_D = (BASE_D << BRK3_ADDR1);
|
`endif
|
`endif
|
|
parameter CPU_NR_D = (BASE_D << CPU_NR);
|
|
|
|
|
//============================================================================
|
//============================================================================
|
// 2) REGISTER DECODER
|
// 2) REGISTER DECODER
|
//============================================================================
|
//============================================================================
|
Line 261... |
Line 277... |
BRK3_CTL : reg_dec = BRK3_CTL_D;
|
BRK3_CTL : reg_dec = BRK3_CTL_D;
|
BRK3_STAT : reg_dec = BRK3_STAT_D;
|
BRK3_STAT : reg_dec = BRK3_STAT_D;
|
BRK3_ADDR0: reg_dec = BRK3_ADDR0_D;
|
BRK3_ADDR0: reg_dec = BRK3_ADDR0_D;
|
BRK3_ADDR1: reg_dec = BRK3_ADDR1_D;
|
BRK3_ADDR1: reg_dec = BRK3_ADDR1_D;
|
`endif
|
`endif
|
|
CPU_NR : reg_dec = CPU_NR_D;
|
// pragma coverage off
|
// pragma coverage off
|
default: reg_dec = {NR_REG{1'b0}};
|
default: reg_dec = {NR_REG{1'b0}};
|
// pragma coverage on
|
// pragma coverage on
|
endcase
|
endcase
|
|
|
Line 294... |
Line 311... |
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
|
|
// This register is assigned in the SFR module
|
// This register is assigned in the SFR module
|
|
|
|
|
|
// CPU_NR Register
|
|
//-----------------
|
|
// -------------------------------------------------------------------
|
|
// | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0 |
|
|
// |---------------------------------+---------------------------------|
|
|
// | CPU_TOTAL_NR | CPU_INST_NR |
|
|
// -------------------------------------------------------------------
|
|
|
|
wire [15:0] cpu_nr = {cpu_nr_total, cpu_nr_inst};
|
|
|
|
|
// CPU_CTL Register
|
// CPU_CTL Register
|
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
// 7 6 5 4 3 2 1 0
|
// 7 6 5 4 3 2 1 0
|
// Reserved CPU_RST RST_BRK_EN FRZ_BRK_EN SW_BRK_EN ISTEP RUN HALT
|
// Reserved CPU_RST RST_BRK_EN FRZ_BRK_EN SW_BRK_EN ISTEP RUN HALT
|
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
Line 612... |
Line 640... |
wire [15:0] cpu_stat_rd = {8'h00, cpu_stat_full} & {16{reg_rd[CPU_STAT]}};
|
wire [15:0] cpu_stat_rd = {8'h00, cpu_stat_full} & {16{reg_rd[CPU_STAT]}};
|
wire [15:0] mem_ctl_rd = {8'h00, mem_ctl_full} & {16{reg_rd[MEM_CTL]}};
|
wire [15:0] mem_ctl_rd = {8'h00, mem_ctl_full} & {16{reg_rd[MEM_CTL]}};
|
wire [15:0] mem_data_rd = mem_data & {16{reg_rd[MEM_DATA]}};
|
wire [15:0] mem_data_rd = mem_data & {16{reg_rd[MEM_DATA]}};
|
wire [15:0] mem_addr_rd = mem_addr & {16{reg_rd[MEM_ADDR]}};
|
wire [15:0] mem_addr_rd = mem_addr & {16{reg_rd[MEM_ADDR]}};
|
wire [15:0] mem_cnt_rd = mem_cnt & {16{reg_rd[MEM_CNT]}};
|
wire [15:0] mem_cnt_rd = mem_cnt & {16{reg_rd[MEM_CNT]}};
|
|
wire [15:0] cpu_nr_rd = cpu_nr & {16{reg_rd[CPU_NR]}};
|
|
|
wire [15:0] dbg_dout = cpu_id_lo_rd |
|
wire [15:0] dbg_dout = cpu_id_lo_rd |
|
cpu_id_hi_rd |
|
cpu_id_hi_rd |
|
cpu_ctl_rd |
|
cpu_ctl_rd |
|
cpu_stat_rd |
|
cpu_stat_rd |
|
Line 624... |
Line 653... |
mem_addr_rd |
|
mem_addr_rd |
|
mem_cnt_rd |
|
mem_cnt_rd |
|
brk0_dout |
|
brk0_dout |
|
brk1_dout |
|
brk1_dout |
|
brk2_dout |
|
brk2_dout |
|
brk3_dout;
|
brk3_dout |
|
|
cpu_nr_rd;
|
|
|
// Tell UART/JTAG interface that the data is ready to be read
|
// Tell UART/I2C interface that the data is ready to be read
|
always @ (posedge dbg_clk or posedge dbg_rst)
|
always @ (posedge dbg_clk or posedge dbg_rst)
|
if (dbg_rst) dbg_rd_rdy <= 1'b0;
|
if (dbg_rst) dbg_rd_rdy <= 1'b0;
|
else if (mem_burst | mem_burst_rd) dbg_rd_rdy <= (dbg_reg_rd | dbg_mem_rd_dly);
|
else if (mem_burst | mem_burst_rd) dbg_rd_rdy <= (dbg_reg_rd | dbg_mem_rd_dly);
|
else dbg_rd_rdy <= dbg_rd;
|
else dbg_rd_rdy <= dbg_rd;
|
|
|
Line 701... |
Line 731... |
always @(posedge dbg_clk or posedge dbg_rst)
|
always @(posedge dbg_clk or posedge dbg_rst)
|
if (dbg_rst) mem_burst <= 1'b0;
|
if (dbg_rst) mem_burst <= 1'b0;
|
else if (mem_burst_start) mem_burst <= 1'b1;
|
else if (mem_burst_start) mem_burst <= 1'b1;
|
else if (mem_burst_end) mem_burst <= 1'b0;
|
else if (mem_burst_end) mem_burst <= 1'b0;
|
|
|
// Control signals for UART/JTAG interface
|
// Control signals for UART/I2C interface
|
assign mem_burst_rd = (mem_burst_start & ~mem_ctl[1]);
|
assign mem_burst_rd = (mem_burst_start & ~mem_ctl[1]);
|
assign mem_burst_wr = (mem_burst_start & mem_ctl[1]);
|
assign mem_burst_wr = (mem_burst_start & mem_ctl[1]);
|
|
|
// Trigger CPU Register or memory access during a burst
|
// Trigger CPU Register or memory access during a burst
|
reg mem_startb;
|
reg mem_startb;
|
Line 801... |
Line 831... |
.mem_burst_wr (mem_burst_wr), // Start RX burst
|
.mem_burst_wr (mem_burst_wr), // Start RX burst
|
.mem_bw (mem_bw) // Burst byte width
|
.mem_bw (mem_bw) // Burst byte width
|
);
|
);
|
|
|
`else
|
`else
|
|
assign dbg_uart_txd = 1'b1;
|
|
`ifdef DBG_I2C
|
|
`else
|
assign dbg_addr = 6'h00;
|
assign dbg_addr = 6'h00;
|
assign dbg_din = 16'h0000;
|
assign dbg_din = 16'h0000;
|
assign dbg_rd = 1'b0;
|
assign dbg_rd = 1'b0;
|
assign dbg_uart_txd = 1'b0;
|
|
assign dbg_wr = 1'b0;
|
assign dbg_wr = 1'b0;
|
`endif
|
`endif
|
|
`endif
|
|
|
//=============================================================================
|
//=============================================================================
|
// 10) JTAG COMMUNICATION
|
// 10) I2C COMMUNICATION
|
//=============================================================================
|
//=============================================================================
|
`ifdef DBG_JTAG
|
`ifdef DBG_I2C
|
JTAG INTERFACE IS NOT SUPPORTED YET
|
omsp_dbg_i2c dbg_i2c_0 (
|
|
|
|
// OUTPUTs
|
|
.dbg_addr (dbg_addr), // Debug register address
|
|
.dbg_din (dbg_din), // Debug register data input
|
|
.dbg_i2c_sda_out (dbg_i2c_sda_out), // Debug interface: I2C SDA OUT
|
|
.dbg_rd (dbg_rd), // Debug register data read
|
|
.dbg_wr (dbg_wr), // Debug register data write
|
|
|
|
// INPUTs
|
|
.dbg_clk (dbg_clk), // Debug unit clock
|
|
.dbg_dout (dbg_dout), // Debug register data output
|
|
.dbg_i2c_addr (dbg_i2c_addr), // Debug interface: I2C Address
|
|
.dbg_i2c_broadcast (dbg_i2c_broadcast), // Debug interface: I2C Broadcast Address (for multicore systems)
|
|
.dbg_i2c_scl (dbg_i2c_scl), // Debug interface: I2C SCL
|
|
.dbg_i2c_sda_in (dbg_i2c_sda_in), // Debug interface: I2C SDA IN
|
|
.dbg_rd_rdy (dbg_rd_rdy), // Debug register data is ready for read
|
|
.dbg_rst (dbg_rst), // Debug unit reset
|
|
.mem_burst (mem_burst), // Burst on going
|
|
.mem_burst_end (mem_burst_end), // End TX/RX burst
|
|
.mem_burst_rd (mem_burst_rd), // Start TX burst
|
|
.mem_burst_wr (mem_burst_wr), // Start RX burst
|
|
.mem_bw (mem_bw) // Burst byte width
|
|
);
|
|
|
`else
|
`else
|
|
assign dbg_i2c_sda_out = 1'b1;
|
`endif
|
`endif
|
|
|
endmodule // dbg
|
endmodule // omsp_dbg
|
|
|
`ifdef OMSP_NO_INCLUDE
|
`ifdef OMSP_NO_INCLUDE
|
`else
|
`else
|
`include "openMSP430_undefines.v"
|
`include "openMSP430_undefines.v"
|
`endif
|
`endif
|