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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [rtl/] [verilog/] [omsp_dbg.v] - Diff between revs 149 and 154

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 149 Rev 154
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

powered by: WebSVN 2.1.0

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