Line 43... |
Line 43... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.2 2001/09/18 14:13:47 mohor
|
|
// Trace fixed. Some registers changed, trace simplified.
|
|
//
|
// Revision 1.1.1.1 2001/09/13 13:49:19 mohor
|
// Revision 1.1.1.1 2001/09/13 13:49:19 mohor
|
// Initial official release.
|
// Initial official release.
|
//
|
//
|
// Revision 1.3 2001/06/01 22:22:35 mohor
|
// Revision 1.3 2001/06/01 22:22:35 mohor
|
// This is a backup. It is not a fully working version. Not for use, yet.
|
// This is a backup. It is not a fully working version. Not for use, yet.
|
Line 62... |
Line 65... |
|
|
`include "dbg_timescale.v"
|
`include "dbg_timescale.v"
|
`include "dbg_defines.v"
|
`include "dbg_defines.v"
|
|
|
// module Trace
|
// module Trace
|
module dbg_trace (Wp, Bp, DataIn, OpSelect, LsStatus, IStatus, RiscStall,
|
module dbg_trace (Wp, Bp, DataIn, OpSelect, LsStatus, IStatus, RiscStall_O,
|
Mclk, Reset, TraceChain, ContinMode, TraceEnable,
|
Mclk, Reset, TraceChain, ContinMode, TraceEnable_reg,
|
WpTrigger, BpTrigger, LSSTrigger, ITrigger, TriggerOper, WpQualif,
|
WpTrigger, BpTrigger, LSSTrigger, ITrigger, TriggerOper, WpQualif,
|
BpQualif, LSSQualif, IQualif, QualifOper, RecordPC, RecordLSEA,
|
BpQualif, LSSQualif, IQualif, QualifOper, RecordPC, RecordLSEA,
|
RecordLDATA, RecordSDATA, RecordReadSPR, RecordWriteSPR,
|
RecordLDATA, RecordSDATA, RecordReadSPR, RecordWriteSPR,
|
RecordINSTR,
|
RecordINSTR,
|
WpTriggerValid, BpTriggerValid, LSSTriggerValid, ITriggerValid,
|
WpTriggerValid, BpTriggerValid, LSSTriggerValid, ITriggerValid,
|
Line 89... |
Line 92... |
input Reset; // Reset
|
input Reset; // Reset
|
input ReadBuffer;// Instruction for reading a sample from the Buffer
|
input ReadBuffer;// Instruction for reading a sample from the Buffer
|
|
|
// from registers
|
// from registers
|
input ContinMode;
|
input ContinMode;
|
input TraceEnable;
|
input TraceEnable_reg;
|
|
|
input [10:0] WpTrigger;
|
input [10:0] WpTrigger;
|
input BpTrigger;
|
input BpTrigger;
|
input [3:0] LSSTrigger;
|
input [3:0] LSSTrigger;
|
input [1:0] ITrigger;
|
input [1:0] ITrigger;
|
Line 135... |
Line 138... |
input IStopValid;
|
input IStopValid;
|
// end: from registers
|
// end: from registers
|
|
|
|
|
output [`OPSELECTWIDTH-1:0] OpSelect; // Operation select (what kind of information is avaliable on the DataIn)
|
output [`OPSELECTWIDTH-1:0] OpSelect; // Operation select (what kind of information is avaliable on the DataIn)
|
output RiscStall; // CPU stall (stalls the RISC)
|
output RiscStall_O; // CPU stall (stalls the RISC)
|
output [39:0] TraceChain; // Scan shain from the trace module
|
output [39:0] TraceChain; // Scan shain from the trace module
|
|
|
|
reg TraceEnable_d;
|
|
reg TraceEnable;
|
|
|
|
|
|
|
reg [`TRACECOUNTERWIDTH:0] Counter;
|
reg [`TRACECOUNTERWIDTH:0] Counter;
|
reg [`TRACECOUNTERWIDTH-1:0] WritePointer;
|
reg [`TRACECOUNTERWIDTH-1:0] WritePointer;
|
reg [`TRACECOUNTERWIDTH-1:0] ReadPointer;
|
reg [`TRACECOUNTERWIDTH-1:0] ReadPointer;
|
reg RiscStall;
|
reg RiscStall;
|
Line 242... |
Line 249... |
/**********************************************************************************
|
/**********************************************************************************
|
* *
|
* *
|
* Generation of the TriggerLatch *
|
* Generation of the TriggerLatch *
|
* *
|
* *
|
**********************************************************************************/
|
**********************************************************************************/
|
wire Reset_TriggerLatch = Reset | TriggerLatch & ~TraceEnable;
|
always @(posedge Mclk or posedge Reset)
|
always @(posedge Mclk or posedge Reset_TriggerLatch)
|
|
begin
|
begin
|
if(Reset_TriggerLatch)
|
if(Reset)
|
|
TriggerLatch<=#Tp 0;
|
|
else
|
|
if(TriggerLatch & ~TraceEnable)
|
TriggerLatch<=#Tp 0;
|
TriggerLatch<=#Tp 0;
|
else
|
else
|
if(Trigger)
|
if(Trigger)
|
TriggerLatch<=#Tp 1;
|
TriggerLatch<=#Tp 1;
|
end
|
end
|
|
|
|
|
|
|
|
|
|
/**********************************************************************************
|
|
* *
|
|
* TraceEnable Synchronization *
|
|
* *
|
|
**********************************************************************************/
|
|
always @(posedge Mclk or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
begin
|
|
TraceEnable_d<=#Tp 0;
|
|
TraceEnable<=#Tp 0;
|
|
end
|
|
else
|
|
begin
|
|
TraceEnable_d<=#Tp TraceEnable_reg;
|
|
TraceEnable<=#Tp TraceEnable_d;
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
/**********************************************************************************
|
/**********************************************************************************
|
* *
|
* *
|
* RiscStall, counter and pointers generation *
|
* RiscStall, counter and pointers generation *
|
* *
|
* *
|
**********************************************************************************/
|
**********************************************************************************/
|
Line 271... |
Line 304... |
wire WriteSample = IncrementPointer;
|
wire WriteSample = IncrementPointer;
|
|
|
wire Decrement = ReadBuffer & ~BufferEmpty & (~ContinMode | ContinMode & ~TraceEnable);
|
wire Decrement = ReadBuffer & ~BufferEmpty & (~ContinMode | ContinMode & ~TraceEnable);
|
wire CounterEn = IncrementCounter ^ Decrement;
|
wire CounterEn = IncrementCounter ^ Decrement;
|
|
|
wire ResetCpuStall;
|
wire SyncResetCpuStall;
|
wire ResetStallCounter;
|
wire ResetStallCounter;
|
reg BufferFull_q;
|
reg BufferFull_q;
|
reg BufferFull_2q;
|
reg BufferFull_2q;
|
|
|
reg Qualifier_mclk;
|
reg Qualifier_mclk;
|
Line 283... |
Line 316... |
always @(posedge Mclk)
|
always @(posedge Mclk)
|
begin
|
begin
|
Qualifier_mclk<=#Tp Qualifier;
|
Qualifier_mclk<=#Tp Qualifier;
|
BufferFull_q<=#Tp BufferFull;
|
BufferFull_q<=#Tp BufferFull;
|
BufferFull_2q<=#Tp BufferFull_q;
|
BufferFull_2q<=#Tp BufferFull_q;
|
RiscStall_q <=#Tp RiscStall;
|
RiscStall_q <=#Tp RiscStall_O;
|
end
|
end
|
|
|
|
|
wire AsyncSetCpuStall = Qualifier & ~Qualifier_mclk & TriggerLatch | Qualifier_mclk & Trigger & ~TriggerLatch |
|
wire FirstCpuStall = Qualifier & ~Qualifier_mclk & TriggerLatch |
|
|
Qualifier_mclk & Trigger & ~TriggerLatch |
|
Qualifier & Trigger & ~Qualifier_mclk & ~TriggerLatch;
|
Qualifier & Trigger & ~Qualifier_mclk & ~TriggerLatch;
|
|
|
|
|
wire SyncSetCpuStall = Qualifier_mclk & TriggerLatch &
|
//wire SyncSetCpuStall = Qualifier_mclk & TriggerLatch &
|
|
|
|
wire SyncSetCpuStall = RiscStall_O & ~RiscStall_q |
|
|
Qualifier_mclk & TriggerLatch &
|
(
|
(
|
(~ContinMode & ~BufferFull & ~BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-1) |
|
(~ContinMode & ~BufferFull & ~BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-1) |
|
(~ContinMode & ~BufferFull_q & BufferFull_2q & StallCounter==0) |
|
(~ContinMode & ~BufferFull_q & BufferFull_2q & StallCounter==0) |
|
( ContinMode & StallCounter==`OPSELECTIONCOUNTER-1)
|
( ContinMode & StallCounter==`OPSELECTIONCOUNTER-1)
|
);
|
);
|
|
|
assign ResetCpuStall = (
|
assign SyncResetCpuStall = (
|
(~ContinMode & ~BufferFull & ~BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-2) |
|
(~ContinMode & ~BufferFull & ~BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-2) |
|
(~ContinMode & ~BufferFull & BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-1) |
|
(~ContinMode & ~BufferFull & BufferFull_q & StallCounter==`OPSELECTIONCOUNTER-1) |
|
( ContinMode & StallCounter==`OPSELECTIONCOUNTER-2)
|
( ContinMode & StallCounter==`OPSELECTIONCOUNTER-2)
|
) | Reset;
|
);
|
|
|
|
assign RiscStall_O = FirstCpuStall | RiscStall;
|
|
|
|
|
always @(posedge Mclk or posedge Reset)
|
always @(posedge Mclk or posedge Reset)
|
begin
|
begin
|
if(Reset)
|
if(Reset)
|
Line 321... |
Line 360... |
|
|
|
|
always @(posedge Mclk or posedge Reset)
|
always @(posedge Mclk or posedge Reset)
|
begin
|
begin
|
if(Reset)
|
if(Reset)
|
begin
|
|
WritePointer<=#Tp 0;
|
WritePointer<=#Tp 0;
|
ReadPointer<=#Tp 0;
|
|
end
|
|
else
|
else
|
begin
|
|
if(IncrementPointer)
|
if(IncrementPointer)
|
WritePointer[`TRACECOUNTERWIDTH-1:0]<=#Tp WritePointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
WritePointer[`TRACECOUNTERWIDTH-1:0]<=#Tp WritePointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
// else igor !!! Probably else is missing here. Check it.
|
end
|
|
|
|
always @(posedge Mclk or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
ReadPointer<=#Tp 0;
|
|
else
|
if(Decrement & ~ContinMode | Decrement & ContinMode & ~TraceEnable)
|
if(Decrement & ~ContinMode | Decrement & ContinMode & ~TraceEnable)
|
ReadPointer[`TRACECOUNTERWIDTH-1:0]<=#Tp ReadPointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
ReadPointer[`TRACECOUNTERWIDTH-1:0]<=#Tp ReadPointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
else
|
else
|
if(ContinMode & IncrementPointer & (BufferFull | BufferFullDetected))
|
if(ContinMode & IncrementPointer & (BufferFull | BufferFullDetected))
|
ReadPointer[`TRACECOUNTERWIDTH-1:0]<=#Tp WritePointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
ReadPointer[`TRACECOUNTERWIDTH-1:0]<=#Tp WritePointer[`TRACECOUNTERWIDTH-1:0] + 1;
|
end
|
end
|
end
|
|
|
|
always @(posedge Mclk)
|
always @(posedge Mclk)
|
begin
|
begin
|
if(~TraceEnable)
|
if(~TraceEnable)
|
BufferFullDetected<=#Tp 0;
|
BufferFullDetected<=#Tp 0;
|
Line 348... |
Line 388... |
if(ContinMode & BufferFull)
|
if(ContinMode & BufferFull)
|
BufferFullDetected<=#Tp 1;
|
BufferFullDetected<=#Tp 1;
|
end
|
end
|
|
|
|
|
always @(posedge Mclk or posedge AsyncSetCpuStall)
|
always @(posedge Mclk or posedge Reset)
|
begin
|
begin
|
if(AsyncSetCpuStall)
|
if(Reset)
|
RiscStall<=#Tp 1;
|
RiscStall<=#Tp 0;
|
|
else
|
|
if(SyncResetCpuStall)
|
|
RiscStall<=#Tp 0;
|
else
|
else
|
if(SyncSetCpuStall)
|
if(SyncSetCpuStall)
|
RiscStall<=#Tp 1;
|
RiscStall<=#Tp 1;
|
else
|
|
if(ResetCpuStall)
|
|
RiscStall<=#Tp 0;
|
|
end
|
end
|
|
|
|
|
always @(posedge Mclk)
|
always @(posedge Mclk)
|
begin
|
begin
|