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

Subversion Repositories dbg_interface

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /dbg_interface/trunk/bench/verilog
    from Rev 145 to Rev 158
    Reverse comparison

Rev 145 → Rev 158

/dbg_tb.v
0,0 → 1,2163
//////////////////////////////////////////////////////////////////////
//// ////
//// dbg_tb.v ////
//// ////
//// ////
//// This file is part of the SoC Debug Interface. ////
//// http://www.opencores.org/projects/DebugInterface/ ////
//// ////
//// Author(s): ////
//// Igor Mohor (igorm@opencores.org) ////
//// ////
//// ////
//// All additional information is avaliable in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 - 2004 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, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.44 2004/04/01 09:33:26 igorm
// Typo fixed.
//
// Revision 1.43 2004/03/31 14:34:13 igorm
// data_cnt_lim length changed to reduce number of warnings.
//
// Revision 1.42 2004/03/30 23:10:39 igorm
// CRC checking of incoming CRC added to all tasks.
//
// Revision 1.41 2004/03/28 20:27:40 igorm
// New release of the debug interface (3rd. release).
//
// Revision 1.40 2004/03/22 16:36:06 igorm
// Temp version before changing dbg interface.
//
// Revision 1.39 2004/03/15 16:17:07 igorm
// 'hz changed to 1'hz because Icarus complains.
//
// Revision 1.38 2004/01/30 10:24:02 mohor
// Defines WISHBONE_SUPPORTED and CPU_SUPPORTED added. By default both are
// turned on.
//
// Revision 1.37 2004/01/25 14:10:25 mohor
// Display for VATS added.
//
// Revision 1.36 2004/01/22 13:58:51 mohor
// Port signals are all set to zero after reset.
//
// Revision 1.35 2004/01/22 11:07:28 mohor
// test stall_test added.
//
// Revision 1.34 2004/01/20 14:24:08 mohor
// Define name changed.
//
// Revision 1.33 2004/01/20 14:05:26 mohor
// Data latching changed when testing WB.
//
// Revision 1.32 2004/01/20 10:23:21 mohor
// More debug data added.
//
// Revision 1.31 2004/01/20 09:07:44 mohor
// CRC generation iand verification in bench changed.
//
// Revision 1.30 2004/01/20 08:03:35 mohor
// IDCODE test improved.
//
// Revision 1.29 2004/01/19 13:13:18 mohor
// Define tap_defines.v added to test bench.
//
// Revision 1.28 2004/01/19 12:38:10 mohor
// Waiting for "ready" improved.
//
// Revision 1.27 2004/01/17 18:01:31 mohor
// New version.
//
// Revision 1.26 2004/01/17 17:01:25 mohor
// Almost finished.
//
// Revision 1.25 2004/01/16 14:51:24 mohor
// cpu registers added.
//
// Revision 1.24 2004/01/15 10:47:13 mohor
// Working.
//
// Revision 1.23 2004/01/14 22:59:01 mohor
// Temp version.
//
// Revision 1.22 2004/01/13 11:28:30 mohor
// tmp version.
//
// Revision 1.21 2004/01/10 07:50:41 mohor
// temp version.
//
// Revision 1.20 2004/01/09 12:49:23 mohor
// tmp version.
//
// Revision 1.19 2004/01/08 17:53:12 mohor
// tmp version.
//
// Revision 1.18 2004/01/07 11:59:48 mohor
// temp4 version.
//
// Revision 1.17 2004/01/06 17:14:59 mohor
// temp3 version.
//
// Revision 1.16 2004/01/05 12:16:50 mohor
// tmp2 version.
//
// Revision 1.15 2003/12/23 14:26:01 mohor
// New version of the debug interface. Not finished, yet.
//
// Revision 1.14 2003/10/23 16:16:30 mohor
// CRC logic changed.
//
// Revision 1.13 2003/08/28 13:54:33 simons
// Three more chains added for cpu debug access.
//
// Revision 1.12 2002/05/07 14:44:52 mohor
// mon_cntl_o signals that controls monitor mux added.
//
// Revision 1.11 2002/03/12 14:32:26 mohor
// Few outputs for boundary scan chain added.
//
// Revision 1.10 2002/03/08 15:27:08 mohor
// Structure changed. Hooks for jtag chain added.
//
// Revision 1.9 2001/10/19 11:39:20 mohor
// dbg_timescale.v changed to timescale.v This is done for the simulation of
// few different cores in a single project.
//
// Revision 1.8 2001/10/17 10:39:17 mohor
// bs_chain_o added.
//
// Revision 1.7 2001/10/16 10:10:18 mohor
// Signal names changed to lowercase.
//
// Revision 1.6 2001/10/15 09:52:50 mohor
// Wishbone interface added, few fixes for better performance,
// hooks for boundary scan testing added.
//
// Revision 1.5 2001/09/24 14:06:12 mohor
// Changes connected to the OpenRISC access (SPR read, SPR write).
//
// Revision 1.4 2001/09/20 10:10:29 mohor
// Working version. Few bugs fixed, comments added.
//
// Revision 1.3 2001/09/19 11:54:03 mohor
// Minor changes for simulation.
//
// Revision 1.2 2001/09/18 14:12:43 mohor
// Trace fixed. Some registers changed, trace simplified.
//
// Revision 1.1.1.1 2001/09/13 13:49:19 mohor
// Initial official release.
//
// Revision 1.3 2001/06/01 22:23:40 mohor
// This is a backup. It is not a fully working version. Not for use, yet.
//
// Revision 1.2 2001/05/18 13:10:05 mohor
// Headers changed. All additional information is now avaliable in the README.txt file.
//
// Revision 1.1.1.1 2001/05/18 06:35:15 mohor
// Initial release
//
//
 
 
`include "timescale.v"
`include "tap_defines.v"
`include "dbg_defines.v"
`include "dbg_wb_defines.v"
`include "dbg_cpu_defines.v"
 
`define DBG_TEXT(TEXT) $display("%0s", TEXT);
// `DBG_TEXT("Bla bla bla")
// $sformat(dbg_text, "\n\nbla 0x%0x 0x%0x\n\n", 32'h12345678, 16'h543);
// `DBG_TEXT(dbg_text)
 
// For common cpu routines
`ifdef DBG_CPU0_SUPPORTED
`define DBG_CPU_SUPPORTED
`else
`ifdef DBG_CPU1_SUPPORTED
`define DBG_CPU_SUPPORTED
`endif
`endif
 
// Test bench
module dbg_tb;
 
parameter TCLK = 50; // Clock half period (Clok period = 100 ns => 10 MHz)
 
reg [999:0] dbg_text;
reg tms_pad_i;
reg tck_pad_i;
reg trst_pad_i;
reg tdi_pad_i;
wire tdo_pad_o;
wire tdo_padoe_o;
 
wire shift_dr_o;
wire pause_dr_o;
wire update_dr_o;
wire capture_dr_o;
 
wire extest_select_o;
wire sample_preload_select_o;
wire mbist_select_o;
wire debug_select_o;
 
reg rst_i;
 
`ifdef DBG_WISHBONE_SUPPORTED
// WISHBONE common signals
reg wb_clk_i;
// WISHBONE master interface
wire [31:0] wb_adr_o;
wire [31:0] wb_dat_o;
wire [31:0] wb_dat_i;
wire wb_cyc_o;
wire wb_stb_o;
wire [3:0] wb_sel_o;
wire wb_we_o;
wire wb_ack_i;
wire wb_cab_o;
wire wb_err_i;
wire [2:0] wb_cti_o;
wire [1:0] wb_bte_o;
`endif
 
`ifdef DBG_CPU0_SUPPORTED
// CPU signals
wire cpu0_clk_i;
wire [31:0] cpu0_addr_o;
wire [31:0] cpu0_data_i;
wire [31:0] cpu0_data_o;
wire cpu0_bp_i;
wire cpu0_stall_o;
wire cpu0_stb_o;
wire cpu0_we_o;
wire cpu0_ack_i;
wire cpu0_rst_o;
`endif
 
`ifdef DBG_CPU1_SUPPORTED
// CPU signals
wire cpu1_clk_i;
wire [31:0] cpu1_addr_o;
wire [31:0] cpu1_data_i;
wire [31:0] cpu1_data_o;
wire cpu1_bp_i;
wire cpu1_stall_o;
wire cpu1_stb_o;
wire cpu1_we_o;
wire cpu1_ack_i;
wire cpu1_rst_o;
`endif
 
// Text used for easier debugging
reg [199:0] test_text;
reg [`DBG_WB_CMD_LEN -1:0] last_wb_cmd;
reg [`DBG_CPU_CMD_LEN -1:0] last_cpu_cmd;
reg [199:0] last_wb_cmd_text;
reg [199:0] last_cpu_cmd_text;
 
reg [31:0] wb_data [0:4095]; // Data that is written to (read from) wishbone is stored here.
 
 
 
wire tdo_o;
 
wire debug_tdi_i;
wire bs_chain_tdi_i;
wire mbist_tdi_i;
 
reg test_enabled;
 
reg [31:0] result;
reg [31:0] in_data_le, in_data_be;
reg [31:0] id;
 
wire crc_match_in;
reg [31:0] crc_in;
reg [31:0] crc_out;
reg [`DBG_TOP_STATUS_LEN -1:0] status;
reg [`DBG_WB_STATUS_LEN -1:0] status_wb;
reg [`DBG_CPU_STATUS_LEN -1:0] status_cpu;
 
reg [`DBG_WB_ACC_TYPE_LEN -1:0] read_acc_type;
reg [`DBG_WB_ADR_LEN -1:0] read_addr;
reg [`DBG_WB_LEN_LEN -1:0] read_length;
reg [`DBG_CPU_CTRL_LEN -1:0] read_ctrl_reg;
 
integer length_global;
wire tdo;
 
assign tdo = tdo_padoe_o? tdo_pad_o : 1'hz;
 
 
 
// Connecting TAP module
tap_top i_tap_top (
.tms_pad_i (tms_pad_i),
.tck_pad_i (tck_pad_i),
.trst_pad_i (!trst_pad_i),
.tdi_pad_i (tdi_pad_i),
.tdo_pad_o (tdo_pad_o),
.tdo_padoe_o (tdo_padoe_o),
// TAP states
.shift_dr_o (shift_dr_o),
.pause_dr_o (pause_dr_o),
.update_dr_o (update_dr_o),
.capture_dr_o (capture_dr_o),
// Select signals for boundary scan or mbist
.extest_select_o (extest_select_o),
.sample_preload_select_o(sample_preload_select_o),
.mbist_select_o (mbist_select_o),
.debug_select_o (debug_select_o),
 
// TDO signal that is connected to TDI of sub-modules.
.tdo_o (tdo_o),
 
// TDI signals from sub-modules
.debug_tdi_i (debug_tdi_i), // from debug module
.bs_chain_tdi_i (bs_chain_tdi_i), // from Boundary Scan Chain
.mbist_tdi_i (mbist_tdi_i) // from Mbist Chain
 
);
 
 
// Connecting debug top module
dbg_top i_dbg_top (
.tck_i (tck_pad_i),
.tdi_i (tdo_o),
.tdo_o (debug_tdi_i),
.rst_i (rst_i),
// TAP states
.shift_dr_i (shift_dr_o),
.pause_dr_i (pause_dr_o),
.update_dr_i (update_dr_o),
// Instructions
.debug_select_i (debug_select_o)
 
`ifdef DBG_WISHBONE_SUPPORTED
// WISHBONE common signals
,
.wb_clk_i (wb_clk_i),
// WISHBONE master interface
.wb_adr_o (wb_adr_o),
.wb_dat_o (wb_dat_o),
.wb_dat_i (wb_dat_i),
.wb_cyc_o (wb_cyc_o),
.wb_stb_o (wb_stb_o),
.wb_sel_o (wb_sel_o),
.wb_we_o (wb_we_o),
.wb_ack_i (wb_ack_i),
.wb_cab_o (wb_cab_o),
.wb_err_i (wb_err_i),
.wb_cti_o (wb_cti_o),
.wb_bte_o (wb_bte_o)
`endif
 
`ifdef DBG_CPU0_SUPPORTED
// CPU signals
,
.cpu0_clk_i (cpu0_clk_i),
.cpu0_addr_o (cpu0_addr_o),
.cpu0_data_i (cpu0_data_i),
.cpu0_data_o (cpu0_data_o),
.cpu0_bp_i (cpu0_bp_i),
.cpu0_stall_o (cpu0_stall_o),
.cpu0_stb_o (cpu0_stb_o),
.cpu0_we_o (cpu0_we_o),
.cpu0_ack_i (cpu0_ack_i),
.cpu0_rst_o (cpu0_rst_o)
`endif
 
`ifdef DBG_CPU1_SUPPORTED
// CPU signals
,
.cpu1_clk_i (cpu1_clk_i),
.cpu1_addr_o (cpu1_addr_o),
.cpu1_data_i (cpu1_data_i),
.cpu1_data_o (cpu1_data_o),
.cpu1_bp_i (cpu1_bp_i),
.cpu1_stall_o (cpu1_stall_o),
.cpu1_stb_o (cpu1_stb_o),
.cpu1_we_o (cpu1_we_o),
.cpu1_ack_i (cpu1_ack_i),
.cpu1_rst_o (cpu1_rst_o)
`endif
 
 
 
);
 
 
`ifdef DBG_WISHBONE_SUPPORTED
wb_slave_behavioral wb_slave
(
.CLK_I (wb_clk_i),
.RST_I (rst_i),
.ACK_O (wb_ack_i),
.ADR_I (wb_adr_o),
.CYC_I (wb_cyc_o),
.DAT_O (wb_dat_i),
.DAT_I (wb_dat_o),
.ERR_O (wb_err_i),
.RTY_O (), // NOT USED for now!
.SEL_I (wb_sel_o),
.STB_I (wb_stb_o),
.WE_I (wb_we_o),
.CAB_I (1'b0)
);
`endif
 
 
`ifdef DBG_CPU0_SUPPORTED
cpu_behavioral i_cpu0_behavioral
(
// CPU signals
.cpu_rst_i (rst_i),
.cpu_clk_o (cpu0_clk_i),
.cpu_addr_i (cpu0_addr_o),
.cpu_data_o (cpu0_data_i),
.cpu_data_i (cpu0_data_o),
.cpu_bp_o (cpu0_bp_i),
.cpu_stall_i (cpu0_stall_o),
.cpu_stb_i (cpu0_stb_o),
.cpu_we_i (cpu0_we_o),
.cpu_ack_o (cpu0_ack_i),
.cpu_rst_o (cpu0_rst_o)
);
`endif
 
 
 
`ifdef DBG_CPU1_SUPPORTED
cpu_behavioral i_cpu1_behavioral
(
// CPU signals
.cpu_rst_i (rst_i),
.cpu_clk_o (cpu1_clk_i),
.cpu_addr_i (cpu1_addr_o),
.cpu_data_o (cpu1_data_i),
.cpu_data_i (cpu1_data_o),
.cpu_bp_o (cpu1_bp_i),
.cpu_stall_i (cpu1_stall_o),
.cpu_stb_i (cpu1_stb_o),
.cpu_we_i (cpu1_we_o),
.cpu_ack_o (cpu1_ack_i),
.cpu_rst_o (cpu1_rst_o)
);
`endif
 
 
 
// Initial values
initial
begin
trst_pad_i = 1'b1;
tms_pad_i = 1'hz;
tck_pad_i = 1'hz;
tdi_pad_i = 1'hz;
 
#100;
trst_pad_i = 1'b0;
#100;
trst_pad_i = 1'b1;
end
 
initial
begin
test_enabled = 1'b0;
rst_i = 1'b0;
#1000;
rst_i = 1'b1;
#1000;
rst_i = 1'b0;
 
// Initial values for wishbone slave model
`ifdef DBG_WISHBONE_SUPPORTED
// wb_slave.cycle_response(`ACK_RESPONSE, 9'h55, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
wb_slave.cycle_response(`ACK_RESPONSE, 9'h35, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
`endif
#1 test_enabled<=#1 1'b1;
end
 
`ifdef DBG_WISHBONE_SUPPORTED
initial
begin
wb_clk_i = 1'b0;
forever #5 wb_clk_i = ~wb_clk_i;
end
`endif
 
always @ (posedge test_enabled)
begin
$display("//////////////////////////////////////////////////////////////////");
$display("// //");
$display("// (%0t) dbg_tb starting //", $time);
$display("// //");
$display("//////////////////////////////////////////////////////////////////");
 
$display("TEST: DBG_TEST");
 
 
initialize_memory(32'h12340000, 32'h00100000); // Initialize 0x100000 bytes starting from address 0x12340000
 
reset_tap;
 
#500;
goto_run_test_idle;
 
// `ifdef DBG_CPU0_SUPPORTED
// // Test stall signal
// stall_test_cpu0;
// `endif
 
// Testing read and write to internal registers
#10000;
id_test;
 
set_instruction(`DEBUG);
#10000;
 
 
 
 
 
 
 
 
 
#100000;
`ifdef DBG_WISHBONE_SUPPORTED
module_select(`DBG_TOP_WISHBONE_DEBUG_MODULE, 1'b0); // {module_id, gen_crc_err}
 
#10000;
debug_wishbone(`DBG_WB_READ32, 1'b0, 32'h12345678, 16'h3, 1'b0, "read32 1"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_WRITE8, 1'b0, 32'h23456788, 16'h7, 1'b0, "write32 1"); // {command, ready, addr, length, gen_crc_err, text}
debug_wishbone(`DBG_WB_WRITE32, 1'b0, 32'h23456788, 16'h7, 1'b0, "write32 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
test_text = "debug_wishbone_rd_comm";
debug_wishbone_rd_comm(read_acc_type, read_addr, read_length);
$display("debug_wishbone_rd_comm returns: acc_type = 0x%0x, addr = 0x%0x, length = 0x%0x", read_acc_type, read_addr, read_length);
debug_wishbone_go(1'b0, 1'b0);
debug_wishbone_rd_comm(read_acc_type, read_addr, read_length);
$display("debug_wishbone_rd_comm returns: acc_type = 0x%0x, addr = 0x%0x, length = 0x%0x", read_acc_type, read_addr, read_length);
 
debug_wishbone_go(1'b0, 1'b0);
 
#100000;
// debug_wishbone(`DBG_WB_READ32, 1'b0, 32'h12345224, 16'h7, 1'b0, "read32 1"); // {command, ready, addr, length, gen_crc_err, text}
debug_wishbone(`DBG_WB_READ8, 1'b0, 32'h12345223, 16'h8, 1'b0, "read8 1"); // {command, ready, addr, length, gen_crc_err, text}
#100000;
debug_wishbone_go(1'b0, 1'b0);
 
 
/*
// debug_wishbone(`DBG_WB_READ8, 1'b0, 32'h12345678, 16'h4, 1'b0, "abc 1"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ8, 1'b0, 32'h12345679, 16'h4, 1'b0, "abc 2"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ8, 1'b0, 32'h1234567a, 16'h4, 1'b0, "abc 3"); // {command, ready, addr, length, gen_crc_err, text}
//
// debug_wishbone(`DBG_WB_READ16, 1'b0, 32'h12345678, 16'h4, 1'b0, "abc 4"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ16, 1'b0, 32'h1234567a, 16'h4, 1'b0, "abc 5"); // {command, ready, addr, length, gen_crc_err, text}
//
debug_wishbone(`DBG_WB_READ32, 1'b0, 32'h12345678, 16'h4, 1'b0, "read32 1"); // {command, ready, addr, length, gen_crc_err, text}
//
// debug_wishbone(`DBG_WB_READ16, 1'b0, 32'h12345679, 16'h4, 1'b0, "abc 6"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
 
debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12345678, 16'h4, 1'b0, "read32 2"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
wb_slave.cycle_response(`ACK_RESPONSE, 9'h55, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12346668, 16'h4, 1'b0, "read32 3"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
wb_slave.cycle_response(`ERR_RESPONSE, 9'h03, 8'h2); // (`ERR_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12346668, 16'h4, 1'b0, "read32 4"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`WB_STATUS, 1'b0, 32'h0, 16'h0, 1'b0, "status 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`WB_STATUS, 1'b0, 32'h0, 16'h0, 1'b0, "status 2"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
wb_slave.cycle_response(`ACK_RESPONSE, 9'h012, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12347778, 16'hc, 1'b0, "read32 5"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`DBG_WB_WRITE32, 1'b0, 32'h12346668, 16'h8, 1'b0, "wr32 len8"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`DBG_WB_WRITE16, 1'b0, 32'h12344446, 16'h8, 1'b0, "wr16 len8"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`DBG_WB_WRITE8, 1'b0, 32'h1234010e, 16'h8, 1'b0, "wr8 len8"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 1'b0, "go 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12340100, 16'hc, 1'b0, "read32 6"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ32, 1'b1, 32'h12340100, 16'hfffc, 1'b0, "read32 6"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
// debug_wishbone(`DBG_WB_READ16, 1'b1, 32'h12340102, 16'he, 1'b0, "read16 7"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ16, 1'b1, 32'h12340102, 16'hfffe, 1'b0, "read16 7"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
// debug_wishbone(`DBG_WB_READ8, 1'b1, 32'h12348804, 16'h6, 1'b0, "read8 8"); // {command, ready, addr, length, gen_crc_err, text}
// debug_wishbone(`DBG_WB_READ8, 1'b1, 32'h12348804, 16'hfffc, 1'b0, "read8 8"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 1'b0, "go 2"); // {command, ready, addr, length, gen_crc_err, text}
*/
`endif // DBG_WISHBONE_SUPPORTED
 
`ifdef DBG_CPU0_SUPPORTED
#10000;
module_select(`DBG_TOP_CPU0_DEBUG_MODULE, 1'b0); // {module_id, gen_crc_err}
 
 
 
 
// Select cpu0
 
#10000;
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu write 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu read 1"); // {command, ready, addr, length, gen_crc_err, text}
// Read register
#10000;
 
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h32323232, 16'h3, 1'b0, "cpu write 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h77665544, 16'h3, 1'b0, "cpu read 1"); // {command, ready, addr, length, gen_crc_err, text}
// Read register
#10000;
 
// Reset cpu on
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b10, "rst cpu on"); // {data, text}
#10000;
 
// Reset cpu off
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b00, "rst cpu off"); // {data, text}
#10000;
 
// Stall cpu
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b01, "stall on"); // {data, text}
#10000;
 
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b00, "stall off"); // {data, text}
#10000;
 
// Stall cpu0
debug_cpu_rd_ctrl(read_ctrl_reg, "read ctrl");
$display("debug_cpu_rd_ctrl returns: read_ctrl_reg = 0x%0x", read_ctrl_reg);
#10000;
 
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu read 2"); // {command, ready, addr, length, gen_crc_err, text}
// write to cpu 32-bit
#10000;
 
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h32323232, 16'hf, 1'b0, "cpu write 2"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
 
// read from cpu 32-bit
#10000;
 
#10000;
 
`endif // DBG_CPU0_SUPPORTED
 
 
`ifdef DBG_CPU1_SUPPORTED
#10000;
module_select(`DBG_TOP_CPU1_DEBUG_MODULE, 1'b0); // {module_id, gen_crc_err}
 
 
 
 
// Select cpu1
 
#10000;
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu write 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu read 1"); // {command, ready, addr, length, gen_crc_err, text}
// Read register
#10000;
 
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h32323232, 16'h3, 1'b0, "cpu write 1"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h77665544, 16'h3, 1'b0, "cpu read 1"); // {command, ready, addr, length, gen_crc_err, text}
// Read register
#10000;
 
// Reset cpu on
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b10, "rst cpu on"); // {data, text}
#10000;
 
// Reset cpu off
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b00, "rst cpu off"); // {data, text}
#10000;
 
// Stall cpu
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b01, "stall on"); // {data, text}
#10000;
 
debug_cpu_wr_ctrl(`DBG_CPU_CTRL_LEN'b00, "stall off"); // {data, text}
#10000;
 
// Stall cpu1
debug_cpu_rd_ctrl(read_ctrl_reg, "read ctrl");
$display("debug_cpu_rd_ctrl returns: read_ctrl_reg = 0x%0x", read_ctrl_reg);
#10000;
 
debug_cpu(`DBG_CPU_READ, 1'b0, 32'h23456788, 16'h3, 1'b0, "cpu read 2"); // {command, ready, addr, length, gen_crc_err, text}
// write to cpu 32-bit
#10000;
 
debug_cpu(`DBG_CPU_WRITE, 1'b0, 32'h32323232, 16'hf, 1'b0, "cpu write 2"); // {command, ready, addr, length, gen_crc_err, text}
 
#10000;
 
// read from cpu 32-bit
#10000;
 
#10000;
 
`endif // DBG_CPU1_SUPPORTED
 
 
 
 
 
 
 
 
 
#5000 gen_clk(1); // One extra TCLK for debugging purposes
$display("STATUS: passed");
$display("\n\nSimulation end.");
#1000 $stop;
 
end
 
 
`ifdef DBG_CPU0_SUPPORTED
task stall_test_cpu0;
integer i;
 
begin
test_text = "stall_test_cpu0";
$display("\n\n(%0t) stall_test_cpu0 started", $time);
 
// Set bp_i active for 1 clock cycle and check is stall is set or not
check_stall_cpu0(0); // Should not be set at the beginning
@ (posedge cpu0_clk_i);
#1 dbg_tb.i_cpu0_behavioral.cpu_bp_o = 1'b1;
#1 check_stall_cpu0(1); // set?
@ (posedge cpu0_clk_i);
#1 dbg_tb.i_cpu0_behavioral.cpu_bp_o = 1'b0;
#1 check_stall_cpu0(1); // set?
 
gen_clk(1);
#1 check_stall_cpu0(1); // set?
 
// Unstall with register
set_instruction(`DEBUG);
module_select(`DBG_TOP_CPU0_DEBUG_MODULE, 1'b0); // {module_id, gen_crc_err}
#1 check_stall_cpu0(1); // set?
// igor !!! debug_cpu(`CPU_WRITE_REG, `CPU_OP_ADR, 32'h0, 1'b0, result, "clr unstall"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(1); // set?
debug_cpu(`DBG_CPU_WR_COMM, 32'h0, 32'h0, 1'b0, result, "go cpu"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(0); // reset?
 
// Set stall with register
// igor !!! debug_cpu(`CPU_WRITE_REG, `CPU_OP_ADR, 32'h0, 1'b0, result, "clr stall"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(0); // reset?
debug_cpu(`DBG_CPU_WR_COMM, 32'h0, 32'h1, 1'b0, result, "go cpu"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(1); // set?
 
// Unstall with register
// igor !!! debug_cpu(`CPU_WRITE_REG, `CPU_OP_ADR, 32'h0, 1'b0, result, "clr unstall"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(1); // set?
debug_cpu(`DBG_CPU_WR_COMM, 32'h0, 32'h0, 1'b0, result, "go cpu"); // {command, addr, data, gen_crc_err, result, text}
#1 check_stall_cpu0(0); // reset?
 
$display("\n\n(%0t) stall_test_cpu0 passed\n\n", $time);
end
endtask // stall_test_cpu0
 
 
task check_stall_cpu0;
input should_be_set;
begin
if (should_be_set && (!cpu0_stall_o))
begin
$display ("\t\t(%0t) ERROR: cpu0_stall_o is not set but should be.", $time);
$stop;
end
if ((!should_be_set) && cpu0_stall_o)
begin
$display ("\t\t(%0t) ERROR: cpu0_stall_o set but shouldn't be.", $time);
$stop;
end
end
endtask // check_stall_cpu0
`endif // DBG_CPU0_SUPPORTED
 
 
task initialize_memory;
input [31:0] start_addr;
input [31:0] length;
integer i;
reg [31:0] addr;
begin
for (i=0; i<length; i=i+4) // This data will be return from wb slave
begin
addr = start_addr + i;
`ifdef DBG_WISHBONE_SUPPORTED
wb_slave.wr_mem(addr, {addr[7:0], addr[7:0]+2'd1, addr[7:0]+2'd2, addr[7:0]+2'd3}, 4'hf); // adr, data, sel
`endif
end
for (i=0; i<4096; i=i+1) // This data will be written to wb slave
begin
wb_data[i] <= {i[7:0], i[7:0]+2'd1, i[7:0]+2'd2, i[7:0]+2'd3};
end
end
endtask
 
 
task id_test;
begin
test_text = "id_test";
$display("\n\n(%0t) TEST: id_test", $time);
 
set_instruction(`IDCODE);
read_id_code(id);
 
`ifdef DBG_MORE_INFO
$display("\tRead ID = 0x%0x", id);
$display("\tExpected ID = 0x%0x", `IDCODE_VALUE);
`endif
 
if (id==`IDCODE_VALUE)
$display("(%0t) STATUS: passed\n", $time);
else
$display("(%0t) STATUS: failed (Read ID = 0x%0x, Expected ID = 0x%0x\n", $time, id, `IDCODE_VALUE);
end
endtask // id_test
 
 
// Generation of the TCLK signal
task gen_clk;
input [7:0] num;
integer i;
begin
for(i=0; i<num; i=i+1)
begin
#TCLK tck_pad_i<=1;
#TCLK tck_pad_i<=0;
end
end
endtask
 
 
// TAP reset
task reset_tap;
begin
$display("(%0t) Task reset_tap", $time);
tms_pad_i<=#1 1'b1;
gen_clk(5);
end
endtask
 
 
// Goes to RunTestIdle state
task goto_run_test_idle;
begin
$display("(%0t) Task goto_run_test_idle", $time);
tms_pad_i<=#1 1'b0;
gen_clk(1);
end
endtask
 
 
 
// sets the instruction to the IR register and goes to the RunTestIdle state
task set_instruction;
input [3:0] instr;
integer i;
begin
case (instr)
`ifdef DBG_MORE_INFO
`EXTEST : $display("(%0t) Task set_instruction (EXTEST)", $time);
`SAMPLE_PRELOAD : $display("(%0t) Task set_instruction (SAMPLE_PRELOAD)", $time);
`IDCODE : $display("(%0t) Task set_instruction (IDCODE)", $time);
`DEBUG : $display("(%0t) Task set_instruction (DEBUG)", $time);
`MBIST : $display("(%0t) Task set_instruction (MBIST)", $time);
`BYPASS : $display("(%0t) Task set_instruction (BYPASS)", $time);
`else
`EXTEST : ;
`SAMPLE_PRELOAD : ;
`IDCODE : ;
`DEBUG : ;
`MBIST : ;
`BYPASS : ;
`endif
default
begin
$display("(*E) (%0t) Task set_instruction: Unsupported instruction !!!", $time);
$stop;
end
endcase
 
tms_pad_i<=#1 1;
gen_clk(2);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftIR
 
for(i=0; i<`IR_LENGTH-1; i=i+1)
begin
tdi_pad_i<=#1 instr[i];
gen_clk(1);
end
tdi_pad_i<=#1 instr[i]; // last shift
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 1'hz; // tri-state
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
end
endtask
 
 
// Reads the ID code
task read_id_code;
output [31:0] code;
reg [31:0] code;
begin
`ifdef DBG_MORE_INFO
$display("(%0t) Task read_id_code", $time);
`endif
tms_pad_i<=#1 1;
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftDR
 
tdi_pad_i<=#1 0;
gen_clk(31);
 
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
 
code = in_data_le;
 
tdi_pad_i<=#1 1'hz; // tri-state
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
end
endtask
 
 
// sets the selected module and goes to the RunTestIdle state
task module_select;
input [`DBG_TOP_MODULE_ID_LENGTH -1:0] data;
input gen_crc_err;
integer i;
 
begin
case (data)
`DBG_TOP_CPU0_DEBUG_MODULE : $display("(%0t) Task module_select (DBG_TOP_CPU0_DEBUG_MODULE, gen_crc_err=%0d)", $time, gen_crc_err);
`DBG_TOP_CPU1_DEBUG_MODULE : $display("(%0t) Task module_select (DBG_TOP_CPU1_DEBUG_MODULE, gen_crc_err=%0d)", $time, gen_crc_err);
`DBG_TOP_WISHBONE_DEBUG_MODULE : $display("(%0t) Task module_select (DBG_TOP_WISHBONE_DEBUG_MODULE, gen_crc_err=%0d)", $time, gen_crc_err);
default : $display("(%0t) Task module_select (ERROR!!! Unknown module selected)", $time);
endcase
 
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
status = {`DBG_TOP_STATUS_LEN{1'b0}}; // Initialize status to all 0's
crc_out = {`DBG_TOP_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
tdi_pad_i<=#1 1'b1; // module_select bit
calculate_crc(1'b1);
gen_clk(1);
 
for(i=`DBG_TOP_MODULE_ID_LENGTH -1; i>=0; i=i-1) // Shifting module ID
begin
tdi_pad_i<=#1 data[i];
calculate_crc(data[i]);
gen_clk(1);
end
 
for(i=`DBG_TOP_CRC_LEN -1; i>=0; i=i-1)
begin
if (gen_crc_err & (i==0)) // Generate crc error at last crc bit
tdi_pad_i<=#1 ~crc_out[i]; // error crc
else
tdi_pad_i<=#1 crc_out[i]; // ok crc
 
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz; // tri-state
 
crc_in = {`DBG_TOP_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_TOP_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating 1 clock to read out a status bit.
status[i] = tdo;
end
 
for(i=0; i<`DBG_TOP_CRC_LEN -1; i=i+1)
gen_clk(1);
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
 
if (|status)
begin
$write("(*E) (%0t) Module select error: ", $time);
casex (status)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Non-existing module selected !!!\n\n", $time);
4'bxx1x : $display("Status[1] should be 1'b0 !!!\n\n", $time);
4'bxxx1 : $display("Status[0] should be 1'b0 !!!\n\n", $time);
endcase
$stop;
end
end
endtask // module_select
 
 
 
 
`ifdef DBG_WISHBONE_SUPPORTED
task debug_wishbone;
input [`DBG_WB_CMD_LEN -1:0] command;
input ready;
input [`DBG_WB_ADR_LEN -1:0] addr;
input [`DBG_WB_LEN_LEN -1:0] length;
input gen_crc_err;
input [99:0] text;
integer i;
begin
$write("(%0t) Task debug_wishbone: ", $time);
 
test_text = text;
 
case (command)
`DBG_WB_READ8 :
begin
$display("wb_read8 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_READ8, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_READ8; last_wb_cmd_text = "DBG_WB_READ8";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
`DBG_WB_READ16 :
begin
$display("wb_read16 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_READ16, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_READ16; last_wb_cmd_text = "DBG_WB_READ16";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
`DBG_WB_READ32 :
begin
$display("wb_read32 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_READ32, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_READ32; last_wb_cmd_text = "DBG_WB_READ32";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
`DBG_WB_WRITE8 :
begin
$display("wb_write8 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_WRITE8, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_WRITE8; last_wb_cmd_text = "DBG_WB_WRITE8";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
`DBG_WB_WRITE16 :
begin
$display("wb_write16 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_WRITE16, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_WRITE16; last_wb_cmd_text = "DBG_WB_WRITE16";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
`DBG_WB_WRITE32 :
begin
$display("wb_write32 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_wishbone_wr_comm(`DBG_WB_WRITE32, addr, length, gen_crc_err);
last_wb_cmd = `DBG_WB_WRITE32; last_wb_cmd_text = "DBG_WB_WRITE32";
#10000;
length_global = length + 1;
debug_wishbone_go(ready, gen_crc_err);
end
default:
begin
$display("(*E) debug_wishbone : Unsupported instruction !!!");
$stop;
end
endcase
end
endtask // debug_wishbone
 
 
 
 
 
 
task debug_wishbone_wr_comm;
input [`DBG_WB_ACC_TYPE_LEN -1:0] acc_type;
input [`DBG_WB_ADR_LEN -1:0] addr;
input [`DBG_WB_LEN_LEN -1:0] length;
input gen_crc_err;
integer i;
reg [`DBG_WB_CMD_LEN -1:0] command;
begin
$display("(%0t) Task debug_wishbone_wr_comm: ", $time);
 
command = `DBG_WB_WR_COMM;
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_WB_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
for(i=`DBG_WB_ACC_TYPE_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 acc_type[i]; // command
calculate_crc(acc_type[i]);
gen_clk(1);
end
 
for(i=`DBG_WB_ADR_LEN -1; i>=0; i=i-1) // address
begin
tdi_pad_i<=#1 addr[i];
calculate_crc(addr[i]);
gen_clk(1);
end
for(i=`DBG_WB_LEN_LEN -1; i>=0; i=i-1) // length
begin
tdi_pad_i<=#1 length[i];
calculate_crc(length[i]);
gen_clk(1);
end
 
for(i=`DBG_WB_CRC_LEN -1; i>=0; i=i-1)
begin
if (gen_crc_err & (i==0)) // Generate crc error at last crc bit
tdi_pad_i<=#1 ~crc_out[i]; // error crc
else
tdi_pad_i<=#1 crc_out[i]; // ok crc
 
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz;
 
crc_in = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_WB_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_wb[i] = tdo;
end
 
if (|status_wb)
begin
$write("(*E) (%0t) debug_wishbone_wr_comm error: ", $time);
casex (status_wb)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("WISHBONE error !!!\n\n", $time);
4'bxxx1 : $display("Overrun/Underrun !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_WB_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_wishbone_wr_comm
 
 
 
 
 
task debug_wishbone_rd_comm;
output [`DBG_WB_ACC_TYPE_LEN -1:0] acc_type;
output [`DBG_WB_ADR_LEN -1:0] addr;
output [`DBG_WB_LEN_LEN -1:0] length;
integer i;
reg [`DBG_WB_CMD_LEN -1:0] command;
begin
$display("(%0t) Task debug_wishbone_rd_comm: ", $time);
 
command = `DBG_WB_RD_COMM;
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_WB_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
for(i=`DBG_WB_CRC_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 crc_out[i];
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz;
 
crc_in = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_WB_ACC_TYPE_LEN -1; i>=0; i=i-1)
begin
gen_clk(1);
acc_type[i] = tdo;
end
 
for(i=`DBG_WB_ADR_LEN -1; i>=0; i=i-1) // address
begin
gen_clk(1);
addr[i] = tdo;
end
for(i=`DBG_WB_LEN_LEN -1; i>=0; i=i-1) // length
begin
gen_clk(1);
length[i] = tdo;
end
 
for(i=`DBG_WB_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_wb[i] = tdo;
end
 
if (|status_wb)
begin
$write("(*E) (%0t) debug_wishbone_rd_comm: ", $time);
casex (status_wb)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("Unknown command !!!\n\n", $time);
4'bxxx1 : $display("Unknown command !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_WB_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_wishbone_rd_comm
 
 
 
 
 
task debug_wishbone_go;
input wait_for_wb_ready;
input gen_crc_err;
integer i;
reg [4:0] bit_pointer;
integer word_pointer;
reg [31:0] tmp_data;
reg [`DBG_WB_CMD_LEN -1:0] command;
 
begin
$display("(%0t) Task debug_wishbone_go (previous command was %0s): ", $time, last_wb_cmd_text);
command = `DBG_WB_GO;
word_pointer = 0;
 
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_WB_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
 
if ((last_wb_cmd == `DBG_WB_WRITE8) | (last_wb_cmd == `DBG_WB_WRITE16) | (last_wb_cmd == `DBG_WB_WRITE32)) // When WB_WRITEx was previously activated, data needs to be shifted.
begin
for (i=0; i<((length_global) << 3); i=i+1)
begin
tmp_data = wb_data[word_pointer];
if ((!(i%32)) && (i>0))
begin
word_pointer = word_pointer + 1;
end
bit_pointer = 31-i[4:0];
tdi_pad_i<=#1 tmp_data[bit_pointer];
calculate_crc(tmp_data[bit_pointer]);
gen_clk(1);
 
end
end
 
for(i=`DBG_WB_CRC_LEN -1; i>=1; i=i-1)
begin
tdi_pad_i<=#1 crc_out[i];
gen_clk(1);
end
 
if (gen_crc_err) // Generate crc error at last crc bit
tdi_pad_i<=#1 ~crc_out[0]; // error crc
else
tdi_pad_i<=#1 crc_out[0]; // ok crc
 
if (wait_for_wb_ready)
begin
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr. Last CRC is shifted on this clk
tms_pad_i<=#1 1'b0;
gen_clk(1); // to pause_dr
 
#2; // wait a bit for tdo to activate
while (tdo) // waiting for wb to send "ready"
begin
gen_clk(1); // staying in pause_dr
end
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit2_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to shift_dr
end
else
begin
gen_clk(1); // Last CRC is shifted on this clk
end
 
 
tdi_pad_i<=#1 1'hz;
crc_in = {`DBG_WB_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
if ((last_wb_cmd == `DBG_WB_READ8) | (last_wb_cmd == `DBG_WB_READ16) | (last_wb_cmd == `DBG_WB_READ32)) // When WB_READx was previously activated, data needs to be shifted.
begin
$display("\t\tGenerating %0d clocks to read %0d data bytes.", length_global<<3, length_global);
word_pointer = 0; // Reset pointer
for (i=0; i<(length_global<<3); i=i+1)
begin
gen_clk(1);
if (i[4:0] == 31) // Latching data
begin
wb_data[word_pointer] = in_data_be;
$display("\t\tin_data_be = 0x%x", in_data_be);
word_pointer = word_pointer + 1;
end
end
end
 
 
for(i=`DBG_WB_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_wb[i] = tdo;
end
 
if (|status_wb)
begin
$write("(*E) (%0t) debug_wishbone_go error: ", $time);
casex (status_wb)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("WISHBONE error !!!\n\n", $time);
4'bxxx1 : $display("Overrun/Underrun !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_WB_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_wishbone_go
 
 
`endif // DBG_WISHBONE_SUPPORTED
 
 
`ifdef DBG_CPU_SUPPORTED
task debug_cpu;
input [`DBG_CPU_CMD_LEN -1:0] command;
input ready;
input [`DBG_CPU_ADR_LEN -1:0] addr;
input [`DBG_CPU_LEN_LEN -1:0] length;
input gen_crc_err;
input [99:0] text;
integer i;
begin
$write("(%0t) Task debug_cpu: ", $time);
 
test_text = text;
 
case (command)
`DBG_CPU_READ :
begin
$display("cpu_read (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_cpu_wr_comm(`DBG_CPU_READ, addr, length, gen_crc_err);
last_cpu_cmd = `DBG_CPU_READ; last_cpu_cmd_text = "DBG_CPU_READ";
length_global = length + 1;
#10000;
debug_cpu_go(ready, gen_crc_err);
end
`DBG_CPU_WRITE :
begin
$display("cpu_write (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
debug_cpu_wr_comm(`DBG_CPU_WRITE, addr, length, gen_crc_err);
last_cpu_cmd = `DBG_CPU_WRITE; last_cpu_cmd_text = "DBG_CPU_WRITE";
#10000;
length_global = length + 1;
debug_cpu_go(ready, gen_crc_err);
end
default:
begin
$display("(*E) debug_cpu : Unsupported instruction !!!");
$stop;
end
endcase
end
endtask // debug_cpu
 
 
 
task debug_cpu_wr_comm;
input [`DBG_CPU_ACC_TYPE_LEN -1:0] acc_type;
input [`DBG_CPU_ADR_LEN -1:0] addr;
input [`DBG_CPU_LEN_LEN -1:0] length;
input gen_crc_err;
integer i;
reg [`DBG_CPU_CMD_LEN -1:0] command;
begin
$display("(%0t) Task debug_cpu_wr_comm: ", $time);
 
command = `DBG_CPU_WR_COMM;
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_CPU_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_ACC_TYPE_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 acc_type[i]; // command
calculate_crc(acc_type[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_ADR_LEN -1; i>=0; i=i-1) // address
begin
tdi_pad_i<=#1 addr[i];
calculate_crc(addr[i]);
gen_clk(1);
end
for(i=`DBG_CPU_LEN_LEN -1; i>=0; i=i-1) // length
begin
tdi_pad_i<=#1 length[i];
calculate_crc(length[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_CRC_LEN -1; i>=0; i=i-1)
begin
if (gen_crc_err & (i==0)) // Generate crc error at last crc bit
tdi_pad_i<=#1 ~crc_out[i]; // error crc
else
tdi_pad_i<=#1 crc_out[i]; // ok crc
 
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz;
 
crc_in = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_CPU_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_cpu[i] = tdo;
end
 
if (|status_cpu)
begin
$write("(*E) (%0t) debug_cpu_wr_comm error: ", $time);
casex (status_cpu)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("??? error !!!\n\n", $time);
4'bxxx1 : $display("Overrun/Underrun !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_CPU_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_cpu_wr_comm
 
 
 
task debug_cpu_wr_ctrl;
input [`DBG_CPU_CTRL_LEN -1:0] data;
input [99:0] text;
integer i;
reg [`DBG_CPU_CMD_LEN -1:0] command;
begin
test_text = text;
 
$display("(%0t) Task debug_cpu_wr_ctrl (data=0x%0x (%0s))", $time, data, text);
 
command = `DBG_CPU_WR_CTRL;
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_CPU_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_CTRL_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 data[i]; // data (used cotrol bits
calculate_crc(data[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_DR_LEN - `DBG_CPU_CTRL_LEN -1; i>=0; i=i-1) // unused control bits
begin
tdi_pad_i<=#1 1'b0;
calculate_crc(1'b0);
gen_clk(1);
end
 
for(i=`DBG_CPU_CRC_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 crc_out[i]; // ok crc
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz;
 
crc_in = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_CPU_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_cpu[i] = tdo;
end
 
if (|status_cpu)
begin
$write("(*E) (%0t) debug_cpu_wr_ctrl error: ", $time);
casex (status_cpu)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("??? error !!!\n\n", $time);
4'bxx1x : $display("??? error !!!\n\n", $time);
4'bxxx1 : $display("??? error !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_CPU_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_cpu_wr_ctrl
 
 
 
task debug_cpu_rd_ctrl;
output [`DBG_CPU_CTRL_LEN -1:0] data;
input [99:0] text;
integer i;
reg [`DBG_CPU_CMD_LEN -1:0] command;
begin
test_text = text;
$display("(%0t) Task debug_cpu_rd_ctrl: ", $time);
 
command = `DBG_CPU_RD_CTRL;
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_CPU_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
for(i=`DBG_CPU_CRC_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 crc_out[i];
gen_clk(1);
end
 
tdi_pad_i<=#1 1'hz;
 
crc_in = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
for(i=`DBG_CPU_CTRL_LEN -1; i>=0; i=i-1) // data (used control bits)
begin
gen_clk(1);
data[i] = tdo;
end
for(i=`DBG_CPU_DR_LEN - `DBG_CPU_CTRL_LEN -1; i>=0; i=i-1) // unused control bits
begin
gen_clk(1);
end
 
for(i=`DBG_CPU_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_cpu[i] = tdo;
end
 
if (|status_cpu)
begin
$write("(*E) (%0t) debug_cpu_rd_ctrl: ", $time);
casex (status_cpu)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("Unknown command !!!\n\n", $time);
4'bxxx1 : $display("Unknown command !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_CPU_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_cpu_rd_ctrl
 
 
 
task debug_cpu_go;
input wait_for_cpu_ready;
input gen_crc_err;
integer i;
reg [4:0] bit_pointer;
integer word_pointer;
reg [31:0] tmp_data;
reg [`DBG_CPU_CMD_LEN -1:0] command;
 
begin
$display("(%0t) Task debug_cpu_go (previous command was %0s): ", $time, last_cpu_cmd_text);
command = `DBG_CPU_GO;
word_pointer = 0;
 
tms_pad_i<=#1 1'b1;
gen_clk(1);
tms_pad_i<=#1 1'b0;
gen_clk(2); // we are in shiftDR
 
crc_out = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize outgoing CRC to all ff
 
tdi_pad_i<=#1 1'b0; // module_select bit = 0
calculate_crc(1'b0);
gen_clk(1);
 
for(i=`DBG_CPU_CMD_LEN -1; i>=0; i=i-1)
begin
tdi_pad_i<=#1 command[i]; // command
calculate_crc(command[i]);
gen_clk(1);
end
 
 
if (last_cpu_cmd == `DBG_CPU_WRITE) // When DBG_CPU_WRITE was previously activated, data needs to be shifted.
begin
for (i=0; i<((length_global) << 3); i=i+1)
begin
tmp_data = wb_data[word_pointer];
if ((!(i%32)) && (i>0))
begin
word_pointer = word_pointer + 1;
end
bit_pointer = 31-i[4:0];
tdi_pad_i<=#1 tmp_data[bit_pointer];
calculate_crc(tmp_data[bit_pointer]);
gen_clk(1);
 
end
end
 
for(i=`DBG_CPU_CRC_LEN -1; i>=1; i=i-1)
begin
tdi_pad_i<=#1 crc_out[i];
gen_clk(1);
end
 
if (gen_crc_err) // Generate crc error at last crc bit
tdi_pad_i<=#1 ~crc_out[0]; // error crc
else
tdi_pad_i<=#1 crc_out[0]; // ok crc
 
if (wait_for_cpu_ready)
begin
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr. Last CRC is shifted on this clk
tms_pad_i<=#1 1'b0;
gen_clk(1); // to pause_dr
 
#2; // wait a bit for tdo to activate
while (tdo) // waiting for wb to send "ready"
begin
gen_clk(1); // staying in pause_dr
end
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit2_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to shift_dr
end
else
begin
gen_clk(1); // Last CRC is shifted on this clk
end
 
 
tdi_pad_i<=#1 1'hz;
crc_in = {`DBG_CPU_CRC_LEN{1'b1}}; // Initialize incoming CRC to all ff
 
if (last_cpu_cmd == `DBG_CPU_READ) // When DBG_CPU_READ was previously activated, data needs to be shifted.
begin
$display("\t\tGenerating %0d clocks to read %0d data bytes.", length_global<<3, length_global);
word_pointer = 0; // Reset pointer
for (i=0; i<(length_global<<3); i=i+1)
begin
gen_clk(1);
if (i[4:0] == 31) // Latching data
begin
wb_data[word_pointer] = in_data_be;
$display("\t\tin_data_be = 0x%x", in_data_be);
word_pointer = word_pointer + 1;
end
end
end
 
 
for(i=`DBG_CPU_STATUS_LEN -1; i>=0; i=i-1)
begin
gen_clk(1); // Generating clock to read out a status bit.
status_cpu[i] = tdo;
end
 
if (|status_cpu)
begin
$write("(*E) (%0t) debug_cpu_go error: ", $time);
casex (status_cpu)
4'b1xxx : $display("CRC error !!!\n\n", $time);
4'bx1xx : $display("Unknown command !!!\n\n", $time);
4'bxx1x : $display("??? error !!!\n\n", $time);
4'bxxx1 : $display("Overrun/Underrun !!!\n\n", $time);
endcase
$stop;
end
 
 
for(i=0; i<`DBG_CPU_CRC_LEN -1; i=i+1) // Getting in the CRC
begin
gen_clk(1);
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to exit1_dr
 
if (~crc_match_in)
begin
$display("(%0t) Incoming CRC failed !!!", $time);
$stop;
end
 
tms_pad_i<=#1 1'b1;
gen_clk(1); // to update_dr
tms_pad_i<=#1 1'b0;
gen_clk(1); // to run_test_idle
end
endtask // debug_cpu_go
`endif // DBG_CPU_SUPPORTED
 
 
 
always @ (posedge tck_pad_i)
begin
in_data_be[31:1] <= #1 in_data_be[30:0];
in_data_be[0] <= #1 tdo;
 
in_data_le[31] <= #1 tdo;
in_data_le[30:0] <= #1 in_data_le[31:1];
end
 
 
 
// Calculating outgoing CRC
task calculate_crc;
input data;
begin
crc_out[0] <= #1 data ^ crc_out[31];
crc_out[1] <= #1 data ^ crc_out[0] ^ crc_out[31];
crc_out[2] <= #1 data ^ crc_out[1] ^ crc_out[31];
crc_out[3] <= #1 crc_out[2];
crc_out[4] <= #1 data ^ crc_out[3] ^ crc_out[31];
crc_out[5] <= #1 data ^ crc_out[4] ^ crc_out[31];
crc_out[6] <= #1 crc_out[5];
crc_out[7] <= #1 data ^ crc_out[6] ^ crc_out[31];
crc_out[8] <= #1 data ^ crc_out[7] ^ crc_out[31];
crc_out[9] <= #1 crc_out[8];
crc_out[10] <= #1 data ^ crc_out[9] ^ crc_out[31];
crc_out[11] <= #1 data ^ crc_out[10] ^ crc_out[31];
crc_out[12] <= #1 data ^ crc_out[11] ^ crc_out[31];
crc_out[13] <= #1 crc_out[12];
crc_out[14] <= #1 crc_out[13];
crc_out[15] <= #1 crc_out[14];
crc_out[16] <= #1 data ^ crc_out[15] ^ crc_out[31];
crc_out[17] <= #1 crc_out[16];
crc_out[18] <= #1 crc_out[17];
crc_out[19] <= #1 crc_out[18];
crc_out[20] <= #1 crc_out[19];
crc_out[21] <= #1 crc_out[20];
crc_out[22] <= #1 data ^ crc_out[21] ^ crc_out[31];
crc_out[23] <= #1 data ^ crc_out[22] ^ crc_out[31];
crc_out[24] <= #1 crc_out[23];
crc_out[25] <= #1 crc_out[24];
crc_out[26] <= #1 data ^ crc_out[25] ^ crc_out[31];
crc_out[27] <= #1 crc_out[26];
crc_out[28] <= #1 crc_out[27];
crc_out[29] <= #1 crc_out[28];
crc_out[30] <= #1 crc_out[29];
crc_out[31] <= #1 crc_out[30];
end
endtask // calculate_crc
 
 
// Calculating and checking input CRC
always @(posedge tck_pad_i)
begin
crc_in[0] <= #1 tdo ^ crc_in[31];
crc_in[1] <= #1 tdo ^ crc_in[0] ^ crc_in[31];
crc_in[2] <= #1 tdo ^ crc_in[1] ^ crc_in[31];
crc_in[3] <= #1 crc_in[2];
crc_in[4] <= #1 tdo ^ crc_in[3] ^ crc_in[31];
crc_in[5] <= #1 tdo ^ crc_in[4] ^ crc_in[31];
crc_in[6] <= #1 crc_in[5];
crc_in[7] <= #1 tdo ^ crc_in[6] ^ crc_in[31];
crc_in[8] <= #1 tdo ^ crc_in[7] ^ crc_in[31];
crc_in[9] <= #1 crc_in[8];
crc_in[10] <= #1 tdo ^ crc_in[9] ^ crc_in[31];
crc_in[11] <= #1 tdo ^ crc_in[10] ^ crc_in[31];
crc_in[12] <= #1 tdo ^ crc_in[11] ^ crc_in[31];
crc_in[13] <= #1 crc_in[12];
crc_in[14] <= #1 crc_in[13];
crc_in[15] <= #1 crc_in[14];
crc_in[16] <= #1 tdo ^ crc_in[15] ^ crc_in[31];
crc_in[17] <= #1 crc_in[16];
crc_in[18] <= #1 crc_in[17];
crc_in[19] <= #1 crc_in[18];
crc_in[20] <= #1 crc_in[19];
crc_in[21] <= #1 crc_in[20];
crc_in[22] <= #1 tdo ^ crc_in[21] ^ crc_in[31];
crc_in[23] <= #1 tdo ^ crc_in[22] ^ crc_in[31];
crc_in[24] <= #1 crc_in[23];
crc_in[25] <= #1 crc_in[24];
crc_in[26] <= #1 tdo ^ crc_in[25] ^ crc_in[31];
crc_in[27] <= #1 crc_in[26];
crc_in[28] <= #1 crc_in[27];
crc_in[29] <= #1 crc_in[28];
crc_in[30] <= #1 crc_in[29];
crc_in[31] <= #1 crc_in[30];
end
 
assign crc_match_in = crc_in == 32'h0;
 
 
 
/**********************************************************************************
* *
* Printing the information to the screen *
* *
**********************************************************************************/
 
`ifdef DBG_MORE_INFO
always @ (posedge tck_pad_i)
begin
if(dbg_tb.i_tap_top.update_ir)
case(dbg_tb.i_tap_top.jtag_ir[`IR_LENGTH-1:0])
`EXTEST : $display("\tInstruction EXTEST entered");
`SAMPLE_PRELOAD : $display("\tInstruction SAMPLE_PRELOAD entered");
`IDCODE : $display("\tInstruction IDCODE entered");
`MBIST : $display("\tInstruction MBIST entered");
`DEBUG : $display("\tInstruction DEBUG entered");
`BYPASS : $display("\tInstruction BYPASS entered");
default : $display("\n\tInstruction not valid. Instruction BYPASS activated !!!");
endcase
end
`endif
 
 
// We never use following states: exit2_ir, exit2_dr, pause_ir or pause_dr
always @ (posedge tck_pad_i)
begin
if(dbg_tb.i_tap_top.pause_ir | dbg_tb.i_tap_top.exit2_ir)
begin
$display("\n(%0t) ERROR: State pause_ir or exit2_ir detected.", $time);
$display("(%0t) Simulation stopped !!!", $time);
$stop;
end
end
 
 
 
 
endmodule // dbg_tb
 
 
/wb_slave_behavioral.v
0,0 → 1,410
//////////////////////////////////////////////////////////////////////
//// ////
//// wb_slave_behavioral.v ////
//// ////
//// ////
//// This file is part of the SoC Debug Interface. ////
//// http://www.opencores.org/projects/DebugInterface/ ////
//// ////
//// Author(s): ////
//// Tadej Markovic, tadej@opencores.org ////
//// ////
//// ////
//// All additional information is avaliable in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 - 2004 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, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.2 2004/01/15 10:47:13 mohor
// Working.
//
// Revision 1.1 2003/12/23 14:26:01 mohor
// New version of the debug interface. Not finished, yet.
//
//
//
//
 
`include "timescale.v"
`include "wb_model_defines.v"
module wb_slave_behavioral
(
CLK_I,
RST_I,
ACK_O,
ADR_I,
CYC_I,
DAT_O,
DAT_I,
ERR_O,
RTY_O,
SEL_I,
STB_I,
WE_I,
CAB_I
);
 
/*------------------------------------------------------------------------------------------------------
WISHBONE signals
------------------------------------------------------------------------------------------------------*/
input CLK_I;
input RST_I;
output ACK_O;
input `WB_ADDR_TYPE ADR_I;
input CYC_I;
output `WB_DATA_TYPE DAT_O;
input `WB_DATA_TYPE DAT_I;
output ERR_O;
output RTY_O;
input `WB_SEL_TYPE SEL_I;
input STB_I;
input WE_I;
input CAB_I;
 
reg `WB_DATA_TYPE DAT_O;
 
/*------------------------------------------------------------------------------------------------------
Asynchronous dual-port RAM signals for storing and fetching the data
------------------------------------------------------------------------------------------------------*/
//reg `WB_DATA_TYPE wb_memory [0:16777215]; // WB memory - 24 addresses connected - 2 LSB not used
reg `WB_DATA_TYPE wb_memory [0:1048575]; // WB memory - 20 addresses connected - 2 LSB not used
reg `WB_DATA_TYPE mem_wr_data_out;
reg `WB_DATA_TYPE mem_rd_data_in;
 
/*------------------------------------------------------------------------------------------------------
Maximum values for WAIT and RETRY counters and which response !!!
------------------------------------------------------------------------------------------------------*/
reg [2:0] a_e_r_resp; // tells with which cycle_termination_signal must wb_slave respond !
reg [8:0] wait_cyc;
reg [7:0] max_retry;
 
// assign registers to default state while in reset
// always@(RST_I)
// begin
// if (RST_I)
// begin
// a_e_r_resp <= 3'b000; // do not respond
// wait_cyc <= 8'b0; // no wait cycles
// max_retry <= 8'h0; // no retries
// end
// end //reset
 
task cycle_response;
input [2:0] ack_err_rty_resp; // acknowledge, error or retry response input flags
input [8:0] wait_cycles; // if wait cycles before each data termination cycle (ack, err or rty)
input [7:0] retry_cycles; // noumber of retry cycles before acknowledge cycle
begin
// assign values
a_e_r_resp <= #1 ack_err_rty_resp;
wait_cyc <= #1 wait_cycles;
max_retry <= #1 retry_cycles;
end
endtask // cycle_response
 
/*------------------------------------------------------------------------------------------------------
Tasks for writing and reading to and from memory !!!
------------------------------------------------------------------------------------------------------*/
reg `WB_ADDR_TYPE task_wr_adr_i;
reg `WB_ADDR_TYPE task_rd_adr_i;
reg `WB_DATA_TYPE task_dat_i;
reg `WB_DATA_TYPE task_dat_o;
reg `WB_SEL_TYPE task_sel_i;
reg task_wr_data;
reg task_data_written;
reg `WB_DATA_TYPE task_mem_wr_data;
 
// write to memory
task wr_mem;
input `WB_ADDR_TYPE adr_i;
input `WB_DATA_TYPE dat_i;
input `WB_SEL_TYPE sel_i;
begin
task_data_written = 0;
task_wr_adr_i = adr_i;
task_dat_i = dat_i;
task_sel_i = sel_i;
task_wr_data = 1;
wait(task_data_written);
task_wr_data = 0;
end
endtask
 
// read from memory
task rd_mem;
input `WB_ADDR_TYPE adr_i;
output `WB_DATA_TYPE dat_o;
input `WB_SEL_TYPE sel_i;
begin
task_rd_adr_i = adr_i;
task_sel_i = sel_i;
#1;
dat_o = task_dat_o;
end
endtask
 
/*------------------------------------------------------------------------------------------------------
Internal signals and logic
------------------------------------------------------------------------------------------------------*/
reg calc_ack;
reg calc_err;
reg calc_rty;
 
reg [7:0] retry_cnt;
reg [7:0] retry_num;
reg retry_expired;
 
// Retry counter
always@(posedge RST_I or posedge CLK_I)
begin
if (RST_I)
retry_cnt <= #1 8'h00;
else
begin
if (calc_ack || calc_err)
retry_cnt <= #1 8'h00;
else if (calc_rty)
retry_cnt <= #1 retry_num;
end
end
 
always@(retry_cnt or max_retry)
begin
if (retry_cnt < max_retry)
begin
retry_num = retry_cnt + 1'b1;
retry_expired = 1'b0;
end
else
begin
retry_num = retry_cnt;
retry_expired = 1'b1;
end
end
 
reg [8:0] wait_cnt;
reg [8:0] wait_num;
reg wait_expired;
 
// Wait counter
always@(posedge RST_I or posedge CLK_I)
begin
if (RST_I)
wait_cnt <= #1 9'h0;
else
begin
if (wait_expired || ~STB_I)
wait_cnt <= #1 9'h0;
else
wait_cnt <= #1 wait_num;
end
end
 
always@(wait_cnt or wait_cyc or STB_I or a_e_r_resp or retry_expired)
begin
if ((wait_cyc > 0) && (STB_I))
begin
if (wait_cnt < wait_cyc)
begin
wait_num = wait_cnt + 1'b1;
wait_expired = 1'b0;
calc_ack = 1'b0;
calc_err = 1'b0;
calc_rty = 1'b0;
end
else
begin
wait_num = wait_cnt;
wait_expired = 1'b1;
if (a_e_r_resp == 3'b100)
begin
calc_ack = 1'b1;
calc_err = 1'b0;
calc_rty = 1'b0;
end
else
if (a_e_r_resp == 3'b010)
begin
calc_ack = 1'b0;
calc_err = 1'b1;
calc_rty = 1'b0;
end
else
if (a_e_r_resp == 3'b001)
begin
calc_err = 1'b0;
if (retry_expired)
begin
calc_ack = 1'b1;
calc_rty = 1'b0;
end
else
begin
calc_ack = 1'b0;
calc_rty = 1'b1;
end
end
else
begin
calc_ack = 1'b0;
calc_err = 1'b0;
calc_rty = 1'b0;
end
end
end
else
if ((wait_cyc == 0) && (STB_I))
begin
wait_num = 9'h0;
wait_expired = 1'b1;
if (a_e_r_resp == 3'b100)
begin
calc_ack = 1'b1;
calc_err = 1'b0;
calc_rty = 1'b0;
end
else if (a_e_r_resp == 3'b010)
begin
calc_ack = 1'b0;
calc_err = 1'b1;
calc_rty = 1'b0;
end
else if (a_e_r_resp == 3'b001)
begin
calc_err = 1'b0;
if (retry_expired)
begin
calc_ack = 1'b1;
calc_rty = 1'b0;
end
else
begin
calc_ack = 1'b0;
calc_rty = 1'b1;
end
end
else
begin
calc_ack = 1'b0;
calc_err = 1'b0;
calc_rty = 1'b0;
end
end
else
begin
wait_num = 9'h0;
wait_expired = 1'b0;
calc_ack = 1'b0;
calc_err = 1'b0;
calc_rty = 1'b0;
end
end
 
wire rd_sel = (CYC_I && STB_I && ~WE_I);
wire wr_sel = (CYC_I && STB_I && WE_I);
 
// Generate cycle termination signals
assign ACK_O = calc_ack && STB_I;
assign ERR_O = calc_err && STB_I;
assign RTY_O = calc_rty && STB_I;
 
// Assign address to asynchronous memory
always@(RST_I or ADR_I)
begin
if (RST_I) // this is added because at start of test bench we need address change in order to get data!
begin
#1 mem_rd_data_in = `WB_DATA_WIDTH'hxxxx_xxxx;
end
else
begin
// #1 mem_rd_data_in = wb_memory[ADR_I[25:2]];
#1 mem_rd_data_in = wb_memory[ADR_I[21:2]];
end
end
 
// Data input/output interface
always@(rd_sel or mem_rd_data_in or RST_I)
begin
if (RST_I)
DAT_O <=#1 `WB_DATA_WIDTH'hxxxx_xxxx; // assign outputs to unknown state while in reset
else if (rd_sel)
DAT_O <=#1 mem_rd_data_in;
else
DAT_O <=#1 `WB_DATA_WIDTH'hxxxx_xxxx;
end
 
 
always@(RST_I or task_rd_adr_i)
begin
if (RST_I)
task_dat_o = `WB_DATA_WIDTH'hxxxx_xxxx;
else
task_dat_o = wb_memory[task_rd_adr_i[21:2]];
end
always@(CLK_I or wr_sel or task_wr_data or ADR_I or task_wr_adr_i or
mem_wr_data_out or DAT_I or task_mem_wr_data or task_dat_i or
SEL_I or task_sel_i)
begin
if (task_wr_data)
begin
task_mem_wr_data = wb_memory[task_wr_adr_i[21:2]];
 
if (task_sel_i[3])
task_mem_wr_data[31:24] = task_dat_i[31:24];
if (task_sel_i[2])
task_mem_wr_data[23:16] = task_dat_i[23:16];
if (task_sel_i[1])
task_mem_wr_data[15: 8] = task_dat_i[15: 8];
if (task_sel_i[0])
task_mem_wr_data[ 7: 0] = task_dat_i[ 7: 0];
 
wb_memory[task_wr_adr_i[21:2]] = task_mem_wr_data; // write data
task_data_written = 1;
end
else if (wr_sel && CLK_I)
begin
// mem_wr_data_out = wb_memory[ADR_I[25:2]]; // if no SEL_I is active, old value will be written
mem_wr_data_out = wb_memory[ADR_I[21:2]]; // if no SEL_I is active, old value will be written
 
if (SEL_I[3])
mem_wr_data_out[31:24] = DAT_I[31:24];
if (SEL_I[2])
mem_wr_data_out[23:16] = DAT_I[23:16];
if (SEL_I[1])
mem_wr_data_out[15: 8] = DAT_I[15: 8];
if (SEL_I[0])
mem_wr_data_out[ 7: 0] = DAT_I[ 7: 0];
 
// wb_memory[ADR_I[25:2]] <= mem_wr_data_out; // write data
wb_memory[ADR_I[21:2]] = mem_wr_data_out; // write data
end
end
 
endmodule
/cpu_behavioral.v
0,0 → 1,142
//////////////////////////////////////////////////////////////////////
//// ////
//// cpu_behavioral.v ////
//// ////
//// ////
//// This file is part of the SoC Debug Interface. ////
//// http://www.opencores.org/projects/DebugInterface/ ////
//// ////
//// Author(s): ////
//// Igor Mohor (igorm@opencores.org) ////
//// ////
//// ////
//// All additional information is avaliable in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 - 2004 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, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.3 2004/01/22 11:07:28 mohor
// test stall_test added.
//
// Revision 1.2 2004/01/17 18:01:31 mohor
// New version.
//
// Revision 1.1 2004/01/17 17:01:25 mohor
// Almost finished.
//
//
//
//
//
`include "timescale.v"
`include "dbg_cpu_defines.v"
 
 
 
module cpu_behavioral
(
// CPU signals
cpu_rst_i,
cpu_clk_o,
cpu_addr_i,
cpu_data_o,
cpu_data_i,
cpu_bp_o,
cpu_stall_i,
cpu_stb_i,
cpu_we_i,
cpu_ack_o,
cpu_rst_o
);
 
 
// CPU signals
input cpu_rst_i;
output cpu_clk_o;
input [31:0] cpu_addr_i;
output [31:0] cpu_data_o;
input [31:0] cpu_data_i;
output cpu_bp_o;
input cpu_stall_i;
input cpu_stb_i;
input cpu_we_i;
output cpu_ack_o;
output cpu_rst_o;
 
reg cpu_clk_o;
reg [31:0] cpu_data_o;
reg cpu_bp_o;
reg cpu_ack_o;
reg cpu_ack_q;
wire cpu_ack;
initial
begin
cpu_clk_o = 1'b0;
forever #5 cpu_clk_o = ~cpu_clk_o;
end
 
 
initial
begin
cpu_bp_o = 1'b0;
end
 
assign #200 cpu_ack = cpu_stall_i & cpu_stb_i;
 
 
 
always @ (posedge cpu_clk_o or posedge cpu_rst_i)
begin
if (cpu_rst_i)
begin
cpu_ack_o <= #1 1'b0;
cpu_ack_q <= #1 1'b0;
end
else
begin
cpu_ack_o <= #1 cpu_ack;
cpu_ack_q <= #1 cpu_ack_o;
end
end
 
always @ (posedge cpu_clk_o or posedge cpu_rst_i)
begin
if (cpu_rst_i)
cpu_data_o <= #1 32'h12345678;
else if (cpu_ack_o && (!cpu_ack_q))
cpu_data_o <= #1 cpu_data_o + 32'h11111111;
end
 
 
 
 
endmodule
 
/wb_model_defines.v
0,0 → 1,151
//////////////////////////////////////////////////////////////////////
//// ////
//// wb_model_defines.v ////
//// ////
//// ////
//// This file is part of the SoC Debug Interface. ////
//// http://www.opencores.org/projects/DebugInterface/ ////
//// ////
//// Author(s): ////
//// - Miha Dolenc (mihad@opencores.org) ////
//// ////
//// ////
//// All additional information is avaliable in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 - 2004 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, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.1 2003/12/23 14:26:01 mohor
// New version of the debug interface. Not finished, yet.
//
//
//
 
// WISHBONE frequency in GHz
`define WB_FREQ 0.100
 
// memory frequency in GHz
`define MEM_FREQ 0.100
 
// setup and hold time definitions for WISHBONE - used in BFMs for signal generation
`define Tsetup 4
`define Thold 1
 
// how many clock cycles should model wait for design's response - integer 32 bit value
`define WAIT_FOR_RESPONSE 1023
 
// maximum number of transactions allowed in single call to block or cab transfer routines
`define MAX_BLK_SIZE 1024
 
// maximum retry terminations allowed for WISHBONE master to repeat an access
`define WB_TB_MAX_RTY 0
 
 
// some common types and defines
`define WB_ADDR_WIDTH 32
`define WB_DATA_WIDTH 32
`define WB_SEL_WIDTH `WB_DATA_WIDTH/8
`define WB_TAG_WIDTH 5
`define WB_ADDR_TYPE [(`WB_ADDR_WIDTH - 1):0]
`define WB_DATA_TYPE [(`WB_DATA_WIDTH - 1):0]
`define WB_SEL_TYPE [(`WB_SEL_WIDTH - 1):0]
`define WB_TAG_TYPE [(`WB_TAG_WIDTH - 1):0]
 
// read cycle stimulus - consists of:
// - address field - which address read will be performed from
// - sel field - what byte select value should be
// - tag field - what tag values should be put on the bus
`define READ_STIM_TYPE [(`WB_ADDR_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH - 1):0]
`define READ_STIM_LENGTH (`WB_ADDR_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH)
`define READ_ADDRESS [(`WB_ADDR_WIDTH - 1):0]
`define READ_SEL [(`WB_ADDR_WIDTH + `WB_SEL_WIDTH - 1):`WB_ADDR_WIDTH]
`define READ_TAG_STIM [(`WB_ADDR_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH - 1):(`WB_ADDR_WIDTH + `WB_SEL_WIDTH)]
 
// read cycle return type consists of:
// - read data field
// - tag field received from WISHBONE
// - wishbone slave response fields - ACK, ERR and RTY
// - test bench error indicator (when testcase has not used wb master model properly)
// - how much data was actually transfered
`define READ_RETURN_TYPE [(32 + 4 + `WB_DATA_WIDTH + `WB_TAG_WIDTH - 1):0]
`define READ_DATA [(32 + `WB_DATA_WIDTH + 4 - 1):32 + 4]
`define READ_TAG_RET [(32 + 4 + `WB_DATA_WIDTH + `WB_TAG_WIDTH - 1):(`WB_DATA_WIDTH + 32 + 4)]
`define READ_RETURN_LENGTH (32 + 4 + `WB_DATA_WIDTH + `WB_TAG_WIDTH - 1)
 
// write cycle stimulus type consists of
// - address field
// - data field
// - sel field
// - tag field
`define WRITE_STIM_TYPE [(`WB_ADDR_WIDTH + `WB_DATA_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH - 1):0]
`define WRITE_ADDRESS [(`WB_ADDR_WIDTH - 1):0]
`define WRITE_DATA [(`WB_ADDR_WIDTH + `WB_DATA_WIDTH - 1):`WB_ADDR_WIDTH]
`define WRITE_SEL [(`WB_ADDR_WIDTH + `WB_DATA_WIDTH + `WB_SEL_WIDTH - 1):(`WB_ADDR_WIDTH + `WB_DATA_WIDTH)]
`define WRITE_TAG_STIM [(`WB_ADDR_WIDTH + `WB_DATA_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH - 1):(`WB_ADDR_WIDTH + `WB_DATA_WIDTH + `WB_SEL_WIDTH)]
 
// length of WRITE_STIMULUS
`define WRITE_STIM_LENGTH (`WB_ADDR_WIDTH + `WB_DATA_WIDTH + `WB_SEL_WIDTH + `WB_TAG_WIDTH)
 
// write cycle return type consists of:
// - test bench error indicator (when testcase has not used wb master model properly)
// - wishbone slave response fields - ACK, ERR and RTY
// - tag field received from WISHBONE
// - how much data was actually transfered
`define WRITE_RETURN_TYPE [(32 + 4 + `WB_TAG_WIDTH - 1):0]
`define WRITE_TAG_RET [(32 + 4 + `WB_TAG_WIDTH - 1):32 + 4]
 
// this four fields are common to both read and write routines return values
`define TB_ERROR_BIT [0]
`define CYC_ACK [1]
`define CYC_RTY [2]
`define CYC_ERR [3]
`define CYC_RESPONSE [3:1]
`define CYC_ACTUAL_TRANSFER [35:4]
 
// block transfer flags
`define WB_TRANSFER_FLAGS [41:0]
// consists of:
// - number of transfer cycles to perform
// - flag that enables retry termination handling - if disabled, block transfer routines will return on any termination other than acknowledge
// - flag indicating CAB transfer is to be performed - ignored by all single transfer routines
// - number of initial wait states to insert
// - number of subsequent wait states to insert
`define WB_TRANSFER_SIZE [41:10]
`define WB_TRANSFER_AUTO_RTY [8]
`define WB_TRANSFER_CAB [9]
`define INIT_WAITS [3:0]
`define SUBSEQ_WAITS [7:4]
 
// wb slave response
`define ACK_RESPONSE 3'b100
`define ERR_RESPONSE 3'b010
`define RTY_RESPONSE 3'b001
`define NO_RESPONSE 3'b000
/timescale.v
0,0 → 1,56
//////////////////////////////////////////////////////////////////////
//// ////
//// timescale.v ////
//// ////
//// ////
//// This file is part of the SoC Debug Interface. ////
//// http://www.opencores.org/projects/DebugInterface/ ////
//// ////
//// Author(s): ////
//// Igor Mohor (igorm@opencores.org) ////
//// ////
//// ////
//// All additional information is avaliable in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 - 2004 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, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.3 2004/01/17 17:01:25 mohor
// Almost finished.
//
// Revision 1.2 2003/12/23 14:26:01 mohor
// New version of the debug interface. Not finished, yet.
//
//
//
//
`timescale 1ns/10ps
 
timescale.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property

powered by: WebSVN 2.1.0

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