Line 1... |
Line 1... |
//******************************************************************************************************
|
//******************************************************************************************************
|
// Copyright (c) 2007 TooMuch Semiconductor Solutions Pvt Ltd.
|
// Copyright (c) 2007 TooMuch Semiconductor Solutions Pvt Ltd.
|
|
|
|
|
//File name : wb_ahb_scoreboard.svh
|
//File name : wb_ahb_scoreboard.svh
|
//Date : Aug, 2007
|
//Designer : Ravi S Gupta
|
|
//Date : 4 Sept, 2007
|
//Description : Stimulus Generation for WISHBONE_AHB Bridge
|
//Description : Stimulus Generation for WISHBONE_AHB Bridge
|
//Revision : 1.0
|
//Revision : 1.0
|
|
|
//******************************************************************************************************
|
//******************************************************************************************************
|
|
|
Line 16... |
Line 17... |
class wb_ahb_scoreboard extends avm_threaded_component;
|
class wb_ahb_scoreboard extends avm_threaded_component;
|
|
|
analysis_fifo#(monitor_pkt) ap_fifo; // analysis port fifo
|
analysis_fifo#(monitor_pkt) ap_fifo; // analysis port fifo
|
analysis_if#(monitor_pkt) ap_if; // analysis port interface
|
analysis_if#(monitor_pkt) ap_if; // analysis port interface
|
// local variables
|
// local variables
|
logic [AWIDTH-1:0]adr1;
|
|
logic [AWIDTH-1:0]adr2;
|
logic [AWIDTH-1:0]adr1; //WB ADDR
|
logic [DWIDTH-1:0]dat1;
|
logic [DWIDTH-1:0]dat1; //WB DATA
|
logic [DWIDTH-1:0]dat2;
|
logic [AWIDTH-1:0]adr2; //AHB ADDR
|
|
logic [DWIDTH-1:0]dat2; //WB DATA
|
|
|
// monitor packet
|
// monitor packet
|
monitor_pkt m_pkt;
|
monitor_pkt m_pkt;
|
|
|
virtual ahb_wb_if pin_if;
|
virtual ahb_wb_if pin_if;
|
|
|
Line 41... |
Line 44... |
|
|
task run;
|
task run;
|
forever
|
forever
|
begin
|
begin
|
ap_fifo.get(m_pkt);
|
ap_fifo.get(m_pkt);
|
if(m_pkt.stb) //No wait state
|
if(m_pkt.stb && m_pkt.ack) //No wait state
|
if(m_pkt.wr) //write mode
|
if(m_pkt.wr) //write mode
|
if(m_pkt.flag1) // first clock no comaprison only sampling the values
|
if(m_pkt.flag1) // first clock comparison only between addresses
|
|
begin
|
adr1=m_pkt.adr1;
|
adr1=m_pkt.adr1;
|
else
|
dat1=m_pkt.dat1;
|
|
adr2=m_pkt.adr2;
|
if(m_pkt.flag2) // first clock after after wait state
|
if(m_pkt.flag2) // first clock after after wait state
|
begin
|
begin
|
if((( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2)) || (( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2)));
|
if((( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2))|| (( m_pkt.adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === dat2)));
|
|
|
//avm_report_message("Scoreboard: Write Passed","after wait state");
|
//avm_report_message("Scoreboard: Write Passed","after wait state");
|
else
|
else
|
avm_report_warning("Scoreboard: Error in write after wait state",display_pkt(m_pkt));
|
avm_report_warning("Scoreboard: Error in write after wait state",display_pkt(m_pkt));
|
adr1=m_pkt.adr1; // Holding the previous address
|
adr1=m_pkt.adr1; // Holding the previous WB address
|
|
dat1=m_pkt.dat1; // Holding the previous WB data
|
|
adr2=m_pkt.adr2; // Holding the previous AHB Addr
|
|
|
end
|
end
|
else
|
else
|
|
|
begin
|
begin
|
if(( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2));
|
if(( m_pkt.adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === dat2));
|
//avm_report_message("Scoreboard: Write Passed","without wait state");
|
//avm_report_message("Scoreboard: Write Passed","without wait state");
|
else
|
else
|
begin
|
|
avm_report_warning("Scoreboard: Error in write without wait state",display_pkt(m_pkt));
|
avm_report_warning("Scoreboard: Error in write without wait state",display_pkt(m_pkt));
|
end
|
end
|
adr1=m_pkt.adr1;
|
|
end
|
end
|
else// read mode
|
else //READ Mode
|
if(m_pkt.flag1) // first clock no comaprison only sampling the values
|
if(m_pkt.flag1) // first clock comaprison between addresses
|
adr1=m_pkt.adr1;
|
begin
|
else
|
adr1=m_pkt.adr1;// Holding the previous WB address
|
|
adr2=m_pkt.adr2;// Holding the previous AHB Addr
|
if(m_pkt.flag2) // first clock after after wait state
|
if(m_pkt.flag2) // first clock after after wait state
|
begin
|
begin
|
if((( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2)) || (( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2)));
|
if((( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2)) || (( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2)));
|
//avm_report_message("Scoreboard: Read Passed","after wait state");
|
//avm_report_message("Scoreboard: Read Passed","after wait state");
|
else
|
else
|
|
|
avm_report_warning("Scoreboard: Error in read after wait state",display_pkt(m_pkt));
|
avm_report_warning("Scoreboard: Error in read after wait state",display_pkt(m_pkt));
|
adr1=m_pkt.adr1;
|
adr1=m_pkt.adr1;
|
|
adr2=m_pkt.adr2;
|
end
|
end
|
|
|
else
|
else
|
begin
|
begin
|
if(( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2)); // comparing unknown values too
|
if(( adr1 === m_pkt.adr2 ) && (m_pkt.dat1 === m_pkt.dat2)); // comparing unknown values too
|
//avm_report_message("Scoreboard: Read Passed","without wait state");
|
//avm_report_message("Scoreboard: Read Passed","without wait state");
|
else
|
else
|
begin
|
|
avm_report_warning("Scoreboard: Error in read without wait state",display_pkt(m_pkt));
|
avm_report_warning("Scoreboard: Error in read without wait state",display_pkt(m_pkt));
|
end
|
|
adr1=m_pkt.adr1;
|
adr1=m_pkt.adr1;
|
|
adr2=m_pkt.adr2;
|
|
end
|
end
|
end
|
else // wait state by slave or master
|
else // wait state by slave or master
|
|
begin
|
if(m_pkt.flag2) // latch the value
|
if(m_pkt.flag2) // latch the value
|
begin
|
begin
|
adr1=m_pkt.adr1;
|
adr1=m_pkt.adr1;
|
dat1=m_pkt.dat1;
|
dat1=m_pkt.dat1;
|
adr2=m_pkt.adr2;
|
adr2=m_pkt.adr2;
|
dat2=m_pkt.dat2;
|
dat2=m_pkt.dat2;
|
end
|
end
|
else
|
else
|
|
begin
|
if(( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2));
|
if(( adr1==m_pkt.adr1) && (dat1==m_pkt.dat1) && (adr2==m_pkt.adr2) && (dat2==m_pkt.dat2));
|
//$display("Passed wait");
|
|
//avm_report_message("Scoreboard: Passed","with wait state");
|
//avm_report_message("Scoreboard: Passed","with wait state");
|
else
|
else
|
begin
|
|
avm_report_warning("Scoreboard: Error in with wait state",display_pkt(m_pkt));
|
avm_report_warning("Scoreboard: Error in with wait state",display_pkt(m_pkt));
|
end
|
end
|
|
end
|
|
|
end
|
end
|
endtask
|
endtask
|
|
|
// function to display values at any instant :
|
|
|
// function to display values at any instant
|
function string display_pkt(input monitor_pkt m);
|
function string display_pkt(input monitor_pkt m);
|
string s;
|
string s;
|
$sformat(s,"current_adr1=%0d,adr1=%0d,adr2=%0d,dat1=%0d,dat2=%0d,wr=%0b,stb=%0b,f1=%b,f2=%b",adr1,m.adr1,m.adr2,m.dat1,m.dat2,m.wr,m.stb,m.flag1,m.flag2);
|
$sformat(s,"current_adr1=%0d,adr1=%0d,adr2=%0d,dat1=%0d,dat2=%0d,wr=%0b,stb=%0b,f1=%b,f2=%b",adr1,m.adr1,m.adr2,m.dat1,m.dat2,m.wr,m.stb,m.flag1,m.flag2);
|
return s;
|
return s;
|
endfunction
|
endfunction
|