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
    /
    from Rev 89 to Rev 90
    Reverse comparison

Rev 89 → Rev 90

/trunk/bench/verilog/dbg_tb.v
43,6 → 43,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.18 2004/01/07 11:59:48 mohor
// temp4 version.
//
// Revision 1.17 2004/01/06 17:14:59 mohor
// temp3 version.
//
332,7 → 335,7
// debug_wishbone(`WB_READ16, 1'b0, 32'h12345678, 16'h4, 32'h86156251, result, "abc 4"); // {command, ready, addr, length, crc, result, text}
// debug_wishbone(`WB_READ16, 1'b0, 32'h1234567a, 16'h4, 32'h85a43b5f, result, "abc 5"); // {command, ready, addr, length, crc, result, text}
//
debug_wishbone(`WB_READ32, 1'b0, 32'h12345678, 16'h4, 32'hc9420a40, result, "abc"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b0, 32'h12345678, 16'h4, 32'hc9420a40, result, "read32 1"); // {command, ready, addr, length, crc, result, text}
//
// debug_wishbone(`WB_READ16, 1'b0, 32'h12345679, 16'h4, 32'h87cdced6, result, "abc 6"); // {command, ready, addr, length, crc, result, text}
 
339,15 → 342,15
#10000;
// xxx(4'b1001, 32'he579b242);
 
debug_wishbone(`WB_READ32, 1'b1, 32'h12345678, 16'h4, 32'hc9420a40, result, "pac 1"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b1, 32'h12345678, 16'h4, 32'hc9420a40, result, "read32 2"); // {command, ready, addr, length, crc, result, text}
 
#10000;
wb_slave.cycle_response(`ACK_RESPONSE, 8'h55, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`WB_READ32, 1'b1, 32'h12346668, 16'h4, 32'hc935a962, result, "pac 2"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b1, 32'h12346668, 16'h4, 32'hc935a962, result, "read32 3"); // {command, ready, addr, length, crc, result, text}
 
#10000;
wb_slave.cycle_response(`ERR_RESPONSE, 8'h03, 8'h2); // (`ERR_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`WB_READ32, 1'b1, 32'h12346668, 16'h4, 32'hc935a962, result, "pac 3"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b1, 32'h12346668, 16'h4, 32'hc935a962, result, "read32 4"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_STATUS, 1'b0, 32'h0, 16'h0, 32'hc7b0424d, result, "status 1"); // {command, ready, addr, length, crc, result, text}
357,29 → 360,35
 
#10000;
wb_slave.cycle_response(`ACK_RESPONSE, 8'h4a, 8'h2); // (`ACK_RESPONSE, wbs_waits, wbs_retries);
debug_wishbone(`WB_READ32, 1'b1, 32'h12347778, 16'hc, 32'hd9ce3bbe, result, "rst_status"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b1, 32'h12347778, 16'hc, 32'hd9ce3bbe, result, "read32 5"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_WRITE32, 1'b0, 32'h12346668, 16'h8, 32'hc5a58ff5, result, "write 32 bit len8"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_WRITE32, 1'b0, 32'h12346668, 16'h8, 32'hc5a58ff5, result, "wr32 len8"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_WRITE16, 1'b0, 32'h12344446, 16'h8, 32'hed029606, result, "write 16 bit len8"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_WRITE16, 1'b0, 32'h12344446, 16'h8, 32'hed029606, result, "wr16 len8"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_WRITE8, 1'b0, 32'h12344446, 16'h8, 32'h3cfb2e35, result, "write 8 bit len8"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_WRITE8, 1'b0, 32'h12344446, 16'h8, 32'h3cfb2e35, result, "wr8 len8"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 32'h4c3fb42a, result, "go 1"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 32'h5e9dd377, result, "go 1"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_READ32, 1'b1, 32'h12340100, 16'hc, 32'h8bbeb90d, result, "read32 len c"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ32, 1'b1, 32'h12340100, 16'hc, 32'h8bbeb90d, result, "read32 6"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 32'hd4b43491, result, "go read32"); // {command, ready, addr, length, crc, result, text}
debug_wishbone(`WB_READ16, 1'b1, 32'h12340102, 16'he, 32'hcedab37c, result, "read16 7"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_READ8, 1'b1, 32'h1234010e, 16'h6, 32'h308c30d3, result, "read8 8"); // {command, ready, addr, length, crc, result, text}
 
#10000;
debug_wishbone(`WB_GO, 1'b0, 32'h0, 16'h0, 32'hd4b43491, result, "go 2"); // {command, ready, addr, length, crc, result, text}
 
 
 
 
/*
// Testing read and write to CPU0 registers
#10000;
468,7 → 477,7
tdi_pad_i<=#1 instr[i]; // last shift
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 'hz; // tri-state
tdi_pad_i<=#1 'hz; // tri-state
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
769,8 → 778,9
task debug_wishbone_go;
input [2:0] command;
input [31:0] crc;
integer i, j;
integer i;
reg [4:0] pointer;
begin
$display("(%0t) Task debug_wishbone_go (previous command was %0s): ", $time, last_wb_cmd_text);
 
791,15 → 801,17
 
if ((last_wb_cmd == `WB_WRITE8) | (last_wb_cmd == `WB_WRITE16) | (last_wb_cmd == `WB_WRITE32)) // When WB_WRITEx was previously activated, data needs to be shifted.
begin
for (i=0; i<(dbg_tb.i_dbg_top.i_dbg_wb.len << 3); i=i+32)
for (i=0; i<(dbg_tb.i_dbg_top.i_dbg_wb.len << 3); i=i+1)
begin
$display("wb_data = 0x%x", wb_data);
for (j=31; j>=0; j=j-1)
if (!(i%32))
begin
tdi_pad_i<=#1 wb_data[j];
gen_clk(1);
wb_data = wb_data + 32'h11111111;
$display("\t\twb_data = 0x%x", wb_data);
end
wb_data = wb_data + 32'h11111111;
pointer = 31-i[4:0];
tdi_pad_i<=#1 wb_data[pointer];
gen_clk(1);
 
end
end
 
810,6 → 822,20
gen_clk(1);
end
 
 
 
 
if ((last_wb_cmd == `WB_READ8) | (last_wb_cmd == `WB_READ16) | (last_wb_cmd == `WB_READ32)) // When WB_WRITEx was previously activated, data needs to be shifted.
begin
$display("\t\tGenerating %0d clocks to read %0d data bytes.", dbg_tb.i_dbg_top.i_dbg_wb.len << 3, dbg_tb.i_dbg_top.i_dbg_wb.len);
for (i=0; i<(dbg_tb.i_dbg_top.i_dbg_wb.len << 3); i=i+1)
begin
tdi_pad_i<=#1 1'hz;
gen_clk(1);
end
end
 
 
gen_clk(`STATUS_LEN); // Generating 4 clocks to read out status.
 
for(i=0; i<`CRC_LEN -1; i=i+1) // Getting in the CRC
839,241 → 865,9
 
 
 
// Reads the CPU register and latches the data so it is ready for reading
task ReadCPURegister;
input [31:0] Address;
input [7:0] crc;
integer i;
begin
$display("(%0t) Task ReadCPURegister", $time);
tms_pad_i<=#1 1;
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftDR
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 Address[i]; // Shifting address
gen_clk(1);
end
 
tdi_pad_i<=#1 0; // shifting RW bit = read
gen_clk(1);
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 0; // Shifting data. Data is not important in read cycle.
gen_clk(1);
end
 
// for(i=0; i<`CRC_LEN -1; i=i+1)
for(i=0; i<`CRC_LEN; i=i+1) // crc is 9 bit long
begin
tdi_pad_i<=#1 crc[i]; // Shifting CRC.
gen_clk(1);
end
 
// tdi_pad_i<=#1 crc[i]; // Shifting last bit of CRC.
tdi_pad_i<=#1 1'b0; // crc[i]; // Shifting last bit of CRC.
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 'hz; // Tristate TDI.
gen_clk(1);
 
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
end
endtask
 
 
// Write the CPU register
task WriteCPURegister;
input [31:0] data;
input [31:0] Address;
input [`CRC_LEN -1:0] crc;
integer i;
begin
$display("(%0t) Task WriteCPURegister", $time);
tms_pad_i<=#1 1;
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftDR
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 Address[i]; // Shifting address
gen_clk(1);
end
 
tdi_pad_i<=#1 1; // shifting RW bit = write
gen_clk(1);
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 data[i]; // Shifting data
gen_clk(1);
end
 
// for(i=0; i<`CRC_LEN -1; i=i+1)
for(i=0; i<`CRC_LEN; i=i+1) // crc is 9 bit long
begin
tdi_pad_i<=#1 crc[i]; // Shifting CRC
gen_clk(1);
end
 
// tdi_pad_i<=#1 crc[i]; // shifting last bit of CRC
tdi_pad_i<=#1 1'b0; // crc[i]; // shifting last bit of CRC
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 'hz; // tristate TDI
gen_clk(1);
 
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
 
gen_clk(10); // Generating few clock cycles needed for the write operation to accomplish
end
endtask
 
 
// Reads the register and latches the data so it is ready for reading
task ReadRegister;
input [4:0] Address;
input [7:0] crc;
integer i;
begin
$display("(%0t) Task ReadRegister", $time);
tms_pad_i<=#1 1;
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftDR
 
for(i=0; i<5; i=i+1)
begin
tdi_pad_i<=#1 Address[i]; // Shifting address
gen_clk(1);
end
 
tdi_pad_i<=#1 0; // shifting RW bit = read
gen_clk(1);
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 0; // Shifting data. Data is not important in read cycle.
gen_clk(1);
end
 
// for(i=0; i<`CRC_LEN -1; i=i+1)
for(i=0; i<`CRC_LEN; i=i+1) // crc is 9 bit long
begin
tdi_pad_i<=#1 crc[i]; // Shifting CRC. CRC is not important in read cycle.
gen_clk(1);
end
 
// tdi_pad_i<=#1 crc[i]; // Shifting last bit of CRC.
tdi_pad_i<=#1 1'b0; // crc[i]; // Shifting last bit of CRC.
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 'hz; // Tri state TDI
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
 
gen_clk(10); // Generating few clock cycles needed for the read operation to accomplish
end
endtask
 
// Write the register
task WriteRegister;
input [31:0] data;
input [4:0] Address;
input [`CRC_LEN -1:0] crc;
integer i;
begin
$display("(%0t) Task WriteRegister", $time);
tms_pad_i<=#1 1;
gen_clk(1);
tms_pad_i<=#1 0;
gen_clk(2); // we are in shiftDR
 
for(i=0; i<5; i=i+1)
begin
tdi_pad_i<=#1 Address[i]; // Shifting address
gen_clk(1);
end
 
tdi_pad_i<=#1 1; // shifting RW bit = write
gen_clk(1);
 
for(i=0; i<32; i=i+1)
begin
tdi_pad_i<=#1 data[i]; // Shifting data
gen_clk(1);
end
// for(i=0; i<`CRC_LEN -1; i=i+1)
for(i=0; i<`CRC_LEN; i=i+1) // crc is 9 bit long
begin
tdi_pad_i<=#1 crc[i]; // Shifting CRC
gen_clk(1);
end
 
// tdi_pad_i<=#1 crc[i]; // Shifting last bit of CRC
tdi_pad_i<=#1 1'b0; // crc[i]; // Shifting last bit of CRC
tms_pad_i<=#1 1; // going out of shiftIR
gen_clk(1);
tdi_pad_i<=#1 'hz; // Tri state TDI
gen_clk(1);
 
tms_pad_i<=#1 0;
gen_clk(1); // we are in RunTestIdle
 
gen_clk(5); // Extra clocks needed for operations to finish
 
end
endtask
 
/*
task EnableWishboneSlave;
begin
$display("(%0t) Task EnableWishboneSlave", $time);
while(1)
begin
@ (posedge Mclk);
if(wb_stb_i & wb_cyc_i) // WB access
// wait (wb_stb_i & wb_cyc_i) // WB access
begin
@ (posedge Mclk);
@ (posedge Mclk);
@ (posedge Mclk);
#1 wb_ack_o = 1;
if(~wb_we_i) // read
wb_dat_o = 32'hbeefdead;
wb_dat_o = {wb_adr_i[3:0], wb_adr_i[7:4], wb_adr_i[11:8], wb_adr_i[15:12],
wb_adr_i[19:16], wb_adr_i[23:20], wb_adr_i[27:24], wb_adr_i[31:28]};
if(wb_we_i & wb_stb_i & wb_cyc_i) // write
$display("\nWISHBONE write data=%0h, Addr=%0h", wb_dat_i, wb_adr_i);
if(~wb_we_i & wb_stb_i & wb_cyc_i) // read
$display("\nWISHBONE read data=%0h, Addr=%0h", wb_dat_o, wb_adr_i);
end
@ (posedge Mclk);
#1 wb_ack_o = 0;
wb_dat_o = 32'h0;
end
 
end
endtask
*/
 
 
 
 
 
/**********************************************************************************
* *
* Printing the information to the screen *
1095,87 → 889,7
end
 
 
// Print selected chain
/*
always @ (posedge tck_pad_i)
begin
if(dbg_tb.i_tap_top.chain_select & dbg_tb.i_dbg_top.update_dr_q)
case(dbg_tb.i_dbg_top.Chain[`CHAIN_ID_LENGTH-1:0])
`GLOBAL_BS_CHAIN : $write("\nChain GLOBAL_BS_CHAIN");
`CPU_DEBUG_CHAIN_0 : $write("\nChain CPU_DEBUG_CHAIN_0");
`CPU_DEBUG_CHAIN_1 : $write("\nChain CPU_DEBUG_CHAIN_1");
`CPU_DEBUG_CHAIN_2 : $write("\nChain CPU_DEBUG_CHAIN_2");
`CPU_DEBUG_CHAIN_3 : $write("\nChain CPU_DEBUG_CHAIN_3");
`CPU_TEST_CHAIN : $write("\nChain CPU_TEST_CHAIN");
`TRACE_TEST_CHAIN : $write("\nChain TRACE_TEST_CHAIN");
`REGISTER_SCAN_CHAIN : $write("\nChain REGISTER_SCAN_CHAIN");
`WISHBONE_SCAN_CHAIN : $write("\nChain WISHBONE_SCAN_CHAIN");
endcase
end
*/
 
// print CPU registers read/write
/*
always @ (posedge Mclk)
begin
if(dbg_tb.i_dbg_top.CPUAccess0 & ~dbg_tb.i_dbg_top.CPUAccess_q & dbg_tb.i_dbg_top.RW)
$write("\n\t\tWrite to CPU Register (addr=0x%h, data=0x%h)", dbg_tb.i_dbg_top.ADDR[31:0], dbg_tb.i_dbg_top.DataOut[31:0]);
else
if(dbg_tb.i_dbg_top.CPUAccess_q & ~dbg_tb.i_dbg_top.CPUAccess_q2 & ~dbg_tb.i_dbg_top.RW)
$write("\n\t\tRead from CPU Register (addr=0x%h, data=0x%h)", dbg_tb.i_dbg_top.ADDR[31:0], dbg_tb.i_dbg_top.cpu_data_i[31:0]);
end
*/
 
// print registers read/write
/*
always @ (posedge Mclk)
begin
if(dbg_tb.i_dbg_top.RegAccess_q & ~dbg_tb.i_dbg_top.RegAccess_q2)
begin
if(dbg_tb.i_dbg_top.RW)
$write("\n\t\tWrite to Register (addr=0x%h, data=0x%h)", dbg_tb.i_dbg_top.ADDR[4:0], dbg_tb.i_dbg_top.DataOut[31:0]);
else
$write("\n\t\tRead from Register (addr=0x%h, data=0x%h). This data will be shifted out on next read request.", dbg_tb.i_dbg_top.ADDR[4:0], dbg_tb.i_dbg_top.RegDataIn[31:0]);
end
end
*/
 
// print CRC error
/*
`ifdef TRACE_ENABLED
wire CRCErrorReport = ~(dbg_tb.i_dbg_top.CrcMatch & (dbg_tb.i_dbg_top.chain_select | dbg_tb.i_dbg_top.debug_select & register_scan_chain | dbg_tb.i_dbg_top.debug_select & (cpu_debug_scan_chain0 | cpu_debug_scan_chain1 | cpu_debug_scan_chain2 | cpu_debug_scan_chain3) | dbg_tb.i_dbg_top.debug_select & dbg_tb.i_dbg_top.TraceTestScanChain | dbg_tb.i_dbg_top.debug_select & wishbone_scan_chain));
`else // TRACE_ENABLED not enabled
wire CRCErrorReport = ~(dbg_tb.i_dbg_top.CrcMatch & (dbg_tb.i_tap_top.chain_select | dbg_tb.i_tap_top.debug_select & register_scan_chain | dbg_tb.i_tap_top.debug_select & (cpu_debug_scan_chain0 | cpu_debug_scan_chain1 | cpu_debug_scan_chain2 | cpu_debug_scan_chain3) | dbg_tb.i_tap_top.debug_select & wishbone_scan_chain));
`endif
*/
 
/*
// print crc
always @ (posedge P_TCK)
begin
if(dbg_tb.i_tap_top.update_dr & ~dbg_tb.i_tap_top.idcode_select)
begin
if(dbg_tb.i_tap_top.chain_select)
$write("\t\tCrcIn=0x%h, CrcOut=0x%h", dbg_tb.i_dbg_top.JTAG_DR_IN[11:4], dbg_tb.i_dbg_top.CalculatedCrcOut[`CRC_LEN -1:0]);
else
if(register_scan_chain & ~dbg_tb.i_tap_top.chain_select)
$write("\t\tCrcIn=0x%h, CrcOut=0x%h", dbg_tb.i_dbg_top.JTAG_DR_IN[45:38], dbg_tb.i_dbg_top.CalculatedCrcOut[`CRC_LEN -1:0]);
else
if((cpu_debug_scan_chain0 | cpu_debug_scan_chain1 | cpu_debug_scan_chain2 | cpu_debug_scan_chain3) & ~dbg_tb.i_tap_top.chain_select)
$write("\t\tCrcIn=0x%h, CrcOut=0x%h", dbg_tb.i_dbg_top.JTAG_DR_IN[72:65], dbg_tb.i_dbg_top.CalculatedCrcOut[`CRC_LEN -1:0]);
if(wishbone_scan_chain & ~dbg_tb.i_tap_top.chain_select)
$write("\t\tCrcIn=0x%h, CrcOut=0x%h", dbg_tb.i_dbg_top.JTAG_DR_IN[72:65], dbg_tb.i_dbg_top.CalculatedCrcOut[`CRC_LEN -1:0]);
 
if(CRCErrorReport)
begin
$write("\n\t\t\t\tCrc Error when receiving data (read or write) !!! CrcIn should be: 0x%h\n", dbg_tb.i_dbg_top.CalculatedCrcIn);
#1000 $stop;
end
$display("\n");
end
end
*/
 
// Print shifted IDCode
reg [31:0] tmp_data;
always @ (posedge tck_pad_i)
1274,10 → 988,51
begin
$display("\t\tCRC ERROR !!!");
$display("\t\tCRC needed (%0s) = 0x%0x , shifted_in = 0x%0x", test_text, tmp_crc, shifted_in_crc);
$stop;
end
end
 
 
 
// Detecting errors in counters
always @ (dbg_tb.i_dbg_top.i_dbg_wb.cmd_cnt or
dbg_tb.i_dbg_top.i_dbg_wb.cmd_cnt_end or
dbg_tb.i_dbg_top.i_dbg_wb.addr_len_cnt or
dbg_tb.i_dbg_top.i_dbg_wb.addr_len_cnt_end or
dbg_tb.i_dbg_top.i_dbg_wb.data_cnt or
dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_end or
dbg_tb.i_dbg_top.i_dbg_wb.cmd_cnt_en or
dbg_tb.i_dbg_top.i_dbg_wb.addr_len_cnt_en or
dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_en or
dbg_tb.i_dbg_top.i_dbg_wb.crc_cnt_en or
dbg_tb.i_dbg_top.i_dbg_wb.status_cnt1
//dbg_tb.i_dbg_top.i_dbg_wb.status_cnt2 or
//dbg_tb.i_dbg_top.i_dbg_wb.status_cnt3 or
//dbg_tb.i_dbg_top.i_dbg_wb.status_cnt4
// dbg_tb.i_dbg_top.i_dbg_wb. or
)
begin
if ((~dbg_tb.i_dbg_top.i_dbg_wb.cmd_cnt_end) & (
dbg_tb.i_dbg_top.i_dbg_wb.addr_len_cnt_en |
dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_en |
dbg_tb.i_dbg_top.i_dbg_wb.crc_cnt_en |
dbg_tb.i_dbg_top.i_dbg_wb.status_cnt1
)
)
begin
$display("\n\n\t\t(%0t) ERROR in counters !!!", $time);
#10000;
$stop;
end
 
 
 
end
 
 
 
 
 
endmodule // dbg_tb
 
 
/trunk/rtl/verilog/dbg_wb_defines.v
43,6 → 43,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.2 2004/01/06 17:15:19 mohor
// temp3 version.
//
// Revision 1.1 2003/12/23 15:09:04 mohor
// New directory structure. New version of the debug interface.
//
63,13 → 66,9
 
// Length of status
`define STATUS_LEN 4
`define STATUS_CNT 3
 
 
 
 
 
 
// Enable TRACE
//`define TRACE_ENABLED // Uncomment this define to activate the trace
 
/trunk/rtl/verilog/dbg_wb.v
43,6 → 43,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.6 2004/01/07 11:58:56 mohor
// temp4 version.
//
// Revision 1.5 2004/01/06 17:15:19 mohor
// temp3 version.
//
132,29 → 135,32
reg [31:0] wb_dat_o;
reg [3:0] wb_sel_o;
 
reg [3:0] wb_sel_old;
reg tdo_o;
 
reg [50:0] dr;
wire enable;
wire cmd_cnt_en;
reg [1:0] cmd_cnt;
wire cmd_cnt_end;
reg cmd_cnt_end_q;
wire addr_len_cnt_en;
reg [5:0] addr_len_cnt;
reg [5:0] addr_len_cnt_limit;
wire addr_len_cnt_end;
wire crc_cnt_en;
reg [5:0] crc_cnt;
wire crc_cnt_end;
reg crc_cnt_end_q;
wire data_cnt_en;
reg [18:0] data_cnt;
reg [18:0] data_cnt_limit;
wire data_cnt_end;
reg data_cnt_end_q;
reg status_reset_en;
 
reg crc_match_reg;
 
reg [`STATUS_CNT -1:0] status_cnt;
// reg [31:0] data_tck;
 
 
reg [2:0] cmd, cmd_old;
reg [31:0] adr;
reg [15:0] len;
167,36 → 173,66
reg start_wb_wr;
reg start_wb_wr_q;
 
reg cmd_write;
reg cmd_read;
reg cmd_go;
reg dr_write_latched;
reg dr_read_latched;
reg dr_go_latched;
 
wire status_cnt_end;
 
wire byte, half, long;
reg byte_q, half_q, long_q;
//wire previous_cmd_read;
wire previous_cmd_write;
wire cmd_read;
wire cmd_write;
wire cmd_go;
wire cmd_old_read;
 
reg status_cnt1, status_cnt2, status_cnt3, status_cnt4;
 
 
assign enable = wishbone_ce_i & shift_dr_i;
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end); // igor !!! Add something so CRC is calculated when data is read from WB
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end);
assign shift_crc_o = enable & status_cnt_end; // Signals dbg module to shift out the CRC
 
 
//always @ (posedge tck_i)
//begin
// if (enable & ((~addr_len_cnt_end) | (~cmd_cnt_end) | (~data_cnt_end)))
// dr <= #1 {dr[49:0], tdi_i};
//end
 
 
always @ (posedge tck_i)
begin
if (enable & ((~addr_len_cnt_end) | (~cmd_cnt_end) | (~data_cnt_end)))
/* if (cmd_old_read & cmd_go)
begin
case (cmd_old) // synthesis parallel_case full_case
`WB_READ8 : begin
if(byte & (~byte_q))
dr[31:24] <= #1 input_data[]; mama
else
dr <= #1 dr<<1;
end
`WB_READ16: begin
if(half & (~half_q))
start_rd_tck <= #1 1'b1;
else
start_rd_tck <= #1 1'b0;
end
`WB_READ32: begin
if(long & (~long_q))
start_rd_tck <= #1 1'b1;
else
start_rd_tck <= #1 1'b0;
end
endcase
end
else*/ if (enable & ((~addr_len_cnt_end) | (~cmd_cnt_end) | (~data_cnt_end)))
dr <= #1 {dr[49:0], tdi_i};
end
 
 
//always @ (posedge tck_i)
//begin
// if (enable & (data_cnt_end)) // Igor !!! perhaps not needed data_cnt_end
// data_tck <= #1 {data_tck[30:0], tdi_i};
//end
assign cmd_cnt_en = enable & (~cmd_cnt_end);
 
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
203,11 → 239,13
cmd_cnt <= #1 'h0;
else if (update_dr_i)
cmd_cnt <= #1 'h0;
else if (enable & (~cmd_cnt_end))
else if (cmd_cnt_en)
cmd_cnt <= #1 cmd_cnt + 1'b1;
end
 
 
assign addr_len_cnt_en = enable & cmd_cnt_end & (~addr_len_cnt_end);
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
214,11 → 252,13
addr_len_cnt <= #1 'h0;
else if (update_dr_i)
addr_len_cnt <= #1 'h0;
else if (enable & cmd_cnt_end & (~addr_len_cnt_end))
else if (addr_len_cnt_en)
addr_len_cnt <= #1 addr_len_cnt + 1'b1;
end
 
 
assign data_cnt_en = enable & cmd_cnt_end & (~data_cnt_end);
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
225,8 → 265,7
data_cnt <= #1 'h0;
else if (update_dr_i)
data_cnt <= #1 'h0;
// else if (enable & cmd_cnt_end & (~data_cnt_end)) // igor !!! add something that will count output data
else if (enable & (~data_cnt_end) & cmd_go & ((cmd_cnt_end & previous_cmd_write | crc_cnt_end & cmd_read)))
else if (data_cnt_en)
data_cnt <= #1 data_cnt + 1'b1;
end
 
246,9 → 285,12
 
 
 
//assign previous_cmd_read = (cmd == `WB_READ8) | (cmd == `WB_READ16) | (cmd == `WB_READ32);
assign previous_cmd_write = (cmd == `WB_WRITE8) | (cmd == `WB_WRITE16) | (cmd == `WB_WRITE32);
assign cmd_read = (cmd == `WB_READ8) | (cmd == `WB_READ16) | (cmd == `WB_READ32);
assign cmd_write = (cmd == `WB_WRITE8) | (cmd == `WB_WRITE16) | (cmd == `WB_WRITE32);
assign cmd_go = cmd == `WB_GO;
assign cmd_old_read = (cmd_old == `WB_READ8) | (cmd_old == `WB_READ16) | (cmd_old == `WB_READ32);
 
 
wire dr_read;
wire dr_write;
wire dr_go;
263,9 → 305,9
always @ (posedge tck_i)
begin
if (update_dr_i)
cmd_read <= #1 1'b0;
dr_read_latched <= #1 1'b0;
else if (cmd_cnt_end & (~cmd_cnt_end_q))
cmd_read <= #1 dr_read;
dr_read_latched <= #1 dr_read;
end
 
 
272,9 → 314,9
always @ (posedge tck_i)
begin
if (update_dr_i)
cmd_write <= #1 1'b0;
dr_write_latched <= #1 1'b0;
else if (cmd_cnt_end & (~cmd_cnt_end_q))
cmd_write <= #1 dr_write;
dr_write_latched <= #1 dr_write;
end
 
 
281,51 → 323,53
always @ (posedge tck_i)
begin
if (update_dr_i)
cmd_go <= #1 1'b0;
dr_go_latched <= #1 1'b0;
else if (cmd_cnt_end & (~cmd_cnt_end_q))
cmd_go <= #1 dr_go;
dr_go_latched <= #1 dr_go;
end
 
 
 
always @ (cmd_cnt_end or cmd_cnt_end_q or dr)
always @ (posedge tck_i)
begin
if (cmd_cnt_end & (~cmd_cnt_end_q))
if (cmd_cnt == 2'h2)
begin
// (current command is WB_STATUS or WB_GO)
if (dr_status | dr_go)
if ((~dr[0]) & (~tdi_i)) // (current command is WB_STATUS or WB_GO)
addr_len_cnt_limit = 6'd0;
// (current command is WB_WRITEx or WB_READx)
else
else // (current command is WB_WRITEx or WB_READx)
addr_len_cnt_limit = 6'd48;
end
end
 
 
always @ (cmd_cnt_end or cmd_cnt_end_q or dr or previous_cmd_write or len)
always @ (posedge tck_i)
begin
if (cmd_cnt_end & (~cmd_cnt_end_q))
if (cmd_cnt == 2'h2)
begin
// (current command is WB_GO and previous command is WB_WRITEx)
if (dr_go & previous_cmd_write)
if (dr[1] & (~dr[0]) & (~tdi_i) & cmd_write) // current command is WB_GO and previous command is WB_WRITEx)
data_cnt_limit = (len<<3);
else
data_cnt_limit = 19'h0;
end
else if (crc_cnt == 6'd31)
begin
if (dr_go_latched & cmd_read) // current command is WB_GO and previous command is WB_READx)
data_cnt_limit = (len<<3);
else
data_cnt_limit = 19'h0;
end
end
 
 
assign crc_cnt_en = enable & cmd_cnt_end & addr_len_cnt_end & data_cnt_end & (~crc_cnt_end);
 
// crc counter
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
crc_cnt <= #1 'h0;
// else if(enable & addr_len_cnt_end & (~crc_cnt_end))
else if(enable & cmd_cnt_end & addr_len_cnt_end & data_cnt_end & (~crc_cnt_end))
else if(crc_cnt_en)
crc_cnt <= #1 crc_cnt + 1'b1;
else if (update_dr_i)
crc_cnt <= #1 'h0;
332,7 → 376,6
end
 
assign cmd_cnt_end = cmd_cnt == 2'h3;
//assign addr_len_cnt_end = addr_len_cnt == 6'd48;
assign addr_len_cnt_end = addr_len_cnt == addr_len_cnt_limit;
assign crc_cnt_end = crc_cnt == 6'd32;
assign data_cnt_end = (data_cnt == data_cnt_limit);
339,24 → 382,54
 
always @ (posedge tck_i)
begin
crc_cnt_end_q <= #1 crc_cnt_end;
cmd_cnt_end_q <= #1 cmd_cnt_end;
crc_cnt_end_q <= #1 crc_cnt_end;
cmd_cnt_end_q <= #1 cmd_cnt_end;
data_cnt_end_q <= #1 data_cnt_end;
end
 
// status counter
 
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
status_cnt <= #1 'h0;
else if(shift_dr_i & crc_cnt_end & (~status_cnt_end))
status_cnt <= #1 status_cnt + 1'b1;
status_cnt1 <= #1 1'b0;
else if (update_dr_i)
status_cnt <= #1 'h0;
status_cnt1 <= #1 1'b0;
else if (data_cnt_end & (~data_cnt_end_q) & cmd_old_read & dr_go_latched |
crc_cnt_end & (~crc_cnt_end_q) & (~(cmd_read & dr_go_latched)) // cmd is not changed, yet.
)
status_cnt1 <= #1 1'b1;
end
 
assign status_cnt_end = status_cnt == `STATUS_LEN;
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
begin
status_cnt2 <= #1 1'b0;
status_cnt3 <= #1 1'b0;
status_cnt4 <= #1 1'b0;
end
else if (update_dr_i)
begin
status_cnt2 <= #1 1'b0;
status_cnt3 <= #1 1'b0;
status_cnt4 <= #1 1'b0;
end
else
begin
status_cnt2 <= #1 status_cnt1;
status_cnt3 <= #1 status_cnt2;
status_cnt4 <= #1 status_cnt3;
end
end
 
 
 
 
assign status_cnt_end = status_cnt4;
reg [`STATUS_LEN -1:0] status;
//reg address_unaligned;
 
reg wb_error, wb_error_sync, wb_error_tck;
reg wb_overrun, wb_overrun_sync, wb_overrun_tck;
371,12 → 444,16
reg busy_sync;
reg [799:0] TDO_WISHBONE;
 
 
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
status <= #1 'h0;
else if(crc_cnt_end & (~crc_cnt_end_q))
else if(crc_cnt_end & (~crc_cnt_end_q) & (~dr_read_latched))
status <= #1 {crc_match_i, wb_error_tck, wb_overrun_tck, busy_tck}; // igor !!! wb_overrun_tck bo uporabljen skupaj z wb_underrun_tck,
else if (data_cnt_end & (~data_cnt_end_q) & dr_read_latched)
status <= #1 {crc_match_reg, wb_error_tck, wb_overrun_tck, busy_tck}; // igor !!! wb_overrun_tck bo uporabljen skupaj z wb_underrun_tck,
else if (shift_dr_i & (~status_cnt_end))
status <= #1 {status[0], status[`STATUS_LEN -1:1]};
end
388,7 → 465,7
 
 
 
always @ (crc_cnt_end or crc_cnt_end_q or crc_match_i or status or pause_dr_i or busy_tck)
always @ (crc_cnt_end or crc_cnt_end_q or crc_match_i or status or pause_dr_i or busy_tck or cmd_read or data_cnt_end or data_cnt_end_q or crc_match_reg or dr_read_latched)
begin
if (pause_dr_i)
begin
395,13 → 472,18
tdo_o = busy_tck;
TDO_WISHBONE = "busy_tck";
end
else if (crc_cnt_end & (~crc_cnt_end_q))
else if (crc_cnt_end & (~crc_cnt_end_q) & (~(dr_go_latched & cmd_read))) // cmd is updated not updated, yet
begin
tdo_o = crc_match_i;
TDO_WISHBONE = "crc_match_i";
end
else if (crc_cnt_end)
else if (data_cnt_end & (~data_cnt_end_q) & dr_go_latched & cmd_old_read) // cmd is already updated
begin
tdo_o = crc_match_reg;
TDO_WISHBONE = "crc_match_reg";
end
else if (crc_cnt_end & (~(dr_go_latched & cmd_old_read)) | data_cnt_end & dr_go_latched & cmd_old_read) // cmd is already updated
begin
tdo_o = status[0];
TDO_WISHBONE = "status";
end
417,21 → 499,40
 
always @ (posedge tck_i)
begin
if(crc_cnt_end & (~crc_cnt_end_q))
crc_match_reg <= #1 crc_match_i;
end
 
 
always @ (posedge tck_i or posedge trst_i)
begin
if (trst_i)
begin
cmd <= #1 'h0;
cmd_old <= #1 'h0;
end
else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
begin
if (dr_write_latched | dr_read_latched)
cmd <= #1 dr[50:48];
else
cmd <= #1 dr[2:0];
 
cmd_old <= #1 cmd;
end
end
 
 
always @ (posedge tck_i)
begin
if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
begin
if (cmd_write | cmd_read)
if (dr_write_latched | dr_read_latched)
begin
cmd <= #1 dr[50:48];
adr <= #1 dr[47:16];
len <= #1 dr[15:0];
set_addr <= #1 1'b1;
end
else
begin
cmd <= #1 dr[2:0];
end
 
cmd_old <= #1 cmd;
end
else
set_addr <= #1 1'b0;
441,8 → 542,31
// Start wishbone read cycle
always @ (posedge tck_i)
begin
if (set_addr & cmd_read)
if (set_addr & dr_read_latched)
start_rd_tck <= #1 1'b1;
else if (cmd_old_read & cmd_go & crc_cnt_end_q & (~data_cnt_end))
begin
case (cmd_old) // synthesis parallel_case full_case
`WB_READ8 : begin
if(byte & (~byte_q))
start_rd_tck <= #1 1'b1;
else
start_rd_tck <= #1 1'b0;
end
`WB_READ16: begin
if(half & (~half_q))
start_rd_tck <= #1 1'b1;
else
start_rd_tck <= #1 1'b0;
end
`WB_READ32: begin
if(long & (~long_q))
start_rd_tck <= #1 1'b1;
else
start_rd_tck <= #1 1'b0;
end
endcase
end
else
start_rd_tck <= #1 1'b0;
end
452,7 → 576,7
// Start wishbone write cycle
always @ (posedge tck_i)
begin
if (cmd_go & previous_cmd_write)
if (dr_go_latched & cmd_write)
begin
case (cmd) // synthesis parallel_case full_case
`WB_WRITE8 : begin
538,21 → 662,11
end
end
 
`define WB_STATUS 3'h0 // igor !!! Delete this lines
`define WB_WRITE8 3'h1 // igor !!! Delete this lines
`define WB_WRITE16 3'h2 // igor !!! Delete this lines
`define WB_WRITE32 3'h3 // igor !!! Delete this lines
`define WB_GO 3'h4 // igor !!! Delete this lines
`define WB_READ8 3'h5 // igor !!! Delete this lines
`define WB_READ16 3'h6 // igor !!! Delete this lines
`define WB_READ32 3'h7 // igor !!! Delete this lines
 
 
 
 
 
 
 
// adr byte | short | long
// 0 1000 1100 1111
// 1 0100 err err
576,43 → 690,15
end
 
 
 
 
/*
always @ (posedge wb_clk_i or posedge wb_rst_i)
begin
if (wb_rst_i)
wb_dat_o[31:0] <= #1 32'h0;
else if (start_wb_wr & (~start_wb_wr_q))
begin
if (cmd[1:0] == 2'd1) // 8-bit access
wb_dat_o[31:0] <= #1 {4{8'h0}};
else if (cmd[1:0] == 2'd2) // 16-bit access
wb_dat_o[31:0] <= #1 {2{16'h0}};
else
wb_dat_o[31:0] <= #1 32'h0; //32-bit access
end
wb_sel_old <= #1 4'h0;
else if (wb_ack_i)
wb_sel_old <= #1 wb_sel_o;
end
*/
 
//always @ (wb_adr_o or cmd)
//begin
// wb_sel_o[0] = (cmd[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (cmd[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b11) |
// (cmd[1:0] == 2'b10) & (wb_adr_o[1:0] == 2'b10);
// wb_sel_o[1] = (cmd[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (cmd[1] ^ cmd[0]) & (wb_adr_o[1:0] == 2'b10);
// wb_sel_o[2] = (cmd[1]) & (wb_adr_o[1:0] == 2'b00) | (cmd[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b01);
// wb_sel_o[3] = (wb_adr_o[1:0] == 2'b00);
//end
 
 
 
// always @ (dr)
// begin
// address_unaligned = (dr[1:0] == 2'b11) & (dr[4:3] > 2'b00) | (dr[1:0] == 2'b10) & (dr[3]);
// end
 
 
assign wb_we_o = ~cmd[2]; // Status or write (for simpler logic status is allowed)
assign wb_cab_o = 1'b0;
assign wb_stb_o = wb_cyc_o;

powered by: WebSVN 2.1.0

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