Scoreboard

hello,
I have a monitor at the output of the DUT and a predictor . outputs of the predictor and the monitor should be connected to the scoreboard.

i have done it as given in one of the threads :

//Declaration inside processor monitor
ovm_analysis_port #(OUT_item) proc_mon_port;
:)proc_mon_port.write(OUT_item); -----error in this line
//Declaration inside predictor
ovm_analysis_port #(OUT_item) predictor_port;
:)predictor_port.write(OUT_item); -----error in this line

**//Declarations inside ovm_scoreboard

//Declare two ovm_analysis_export to receive transactions from**
monitors and predictor

ovm_analysis_export #(OUT_item) proc_mon_export;
ovm_analysis_export #(OUT_item) predictor_export;

**//Declare two tlm_analysis_fifo to connect to ovm_analysis_export
//**to get the transactions

tlm_analysis_fifo #(OUT_item) proc_mon_fifo;
tlm_analysis_fifo #(OUT_item) predictor_fifo;

//Connect ovm_analysis_export and tlm_analysis_fifo using
//connect function inside ovm_scoreboard
function void connect;
proc_mon_export.connect(proc_mon_fifo.analysis_export);
predictor_export.connect(predictor_fifo.analysis_export);
endfunction: connect

//Define the task run to get the transaction using get method
task run;
begin
chk_data();
end
endtask: run

task chk_data();
OUT_item proc_mon, predictor;
forever begin
proc_mon_fifo.get(proc_mon);
predictor_fifo.get(predictor);

if(proc_mon.OUT_item == predictor.OUT_item )
$display(“match”);

end
endtask: chk_data

// Connections inside the environment
// Now connecting the two differenct ovm_monitor with the
// ovm_scoreboard using the connect function

function void connect();
ctl_proc_mon_1.proc_mon_port.connect(ctl_scoreboard.proc_mon_export);
ctl_predictor_2.predictor_port.connect(ctl_scoreboard.predictor_export);
endfunction: connect

pls help…

In your monitor, do you have a build() function with the following lines?

proc_mon_port = new(“proc_mon_port”,this);
predictor_port = new(“predictor_port”,this);

Forgetting to create the ports would cause an error on the lines that you mentioned.

-Kurt

Sir,
i got it corrected by writing it inside the function new.

Now i had problem with the run task.

in the scoreboard how can i compare the output from the predictor and the monitor and display that both are same.

I wrote it as
task run;
begin
@(posedge PROC.clk)
chk_data();
end
endtask: run

task chk_data();
OUT_item ER902_mon, predictor;
forever begin
ER902_mon_fifo.get(ER902_mon);
$display(OUT_item.ddm_out);
predictor_fifo.get(predictor);
$display(OUT_item.pdd_out);
if (ER902_mon.OUT_item ==predictor.OUT_item )
$display(“match”);
endtask: chk_data

Sir,
i got it corrected by writing it inside the function new().

Now i had problem with the run task.

in the scoreboard how can i compare the output from the predictor and the monitor and display that both are same.

I wrote it as
task run;
begin
@(posedge PROC.clk)
chk_data();
end
endtask: run

task chk_data();
:)OUT_item proc_mon, predictor; ==== error at this line
forever begin
proc_mon_fifo.get(proc_mon);
$display(OUT_item.ddm_out);
predictor_fifo.get(predictor);
$display(OUT_item.pdd_out);
if (proc_mon.OUT_item ==predictor.OUT_item )
$display(“match”);
end
endtask: chk_data

pla help…

Hello,

Wish this would be helpful in understanding in connecting monitor with the scoreboard.,

http://ovmworld.org/forums/showthread.php?t=877&highlight=connecting+monitor+with+scoreboard

Thanks,
Desperado

Hi,

You can use the “compare” method of the sequence_item/transaction class.

if(mon_data.compare(pred_data)) begin
$display(“DATA MATCH!!!”);
end else begin
$display(“DATA MISMATCH!!!”);
end

Regards,

Sir,
to connect the predictor and the monitor i have done the following things:

predictor has a drive item out_item and monitor has a drive item out_item1 .
i have used put() method in both the predictor and monitor to put the data into the scoreboard.

//========================================
ovm_blocking_put_imp #(out_item ER902_scoreboard) put_export;
2172: ovm_blocking_put_imp #(out_item1, ER902_scoreboard) put_export;

when i have written like this , i had the error as
2172): ‘put_export’ already declared in this scope (ER902_scoreboard).

//=========================================
ovm_blocking_put_imp #(out_item,out_item1 ER902_scoreboard) put_export;

the error is syntax error.
//===================================

how can i implement the put_export of scoreboard with 2 different drive items.??

i tried put() method in the predictor and get() method in the monitor with 2 drive items…
then the problem is only the value in predictor is updated. the monitor value is alway zero,(no change)

class ER902_scoreboard extends ovm_scoreboard;

logic [31:0] smdd_out;
logic [31:0] spdd_out;

out_item OUT_item;
out_item1 OUT_item1;

:) ovm_blocking_put_imp #(out_item ,ER902_scoreboard) put_export;
:)ovm_blocking_put_imp #(out_item1, ER902_scoreboard) put_export;

ovm_component_utils_begin(ER902_scoreboard) ovm_field_object(OUT_item1,OVM_ALL_ON)
ovm_field_object(OUT_item,OVM_ALL_ON) ovm_component_utils_end

  function new (string name, ovm_component parent);    
      super.new(name, parent);
      ovm_report_info("", "ER902_scoreboard::new");
      put_export = new("put_export",this);
      ovm_report_info("", "Called put_export::new");
                   
  endfunction : new

:) task put(out_item OUT_item, out_item1 OUT_item1);
begin

    fork
        
  
        $display("sequences in scoreboard from predictor");
        spdd_out =OUT_item.pddm_out;
        $display("spdd_out =%b",spdd_out);
        
     $display("sequences in scoreboard from monitor");
        smdd_out =OUT_item1.ddm_out;
        $display("smdd_out =%b",smdd_out);
        
                
        
                    
        
    join
//  end
 end

endtask : put

endclass :ER902_scoreboard

pls help…

Hi,

Here you need to use macro “`ovm_blocking_put_imp_decl(”

ovm_blocking_put_imp_decl(_P1) ovm_blocking_put_imp_decl(_P2)
class ER902_scoreboard extends ovm_scoreboard;
logic [31:0] smdd_out;
logic [31:0] spdd_out;
out_item OUT_item;
out_item1 OUT_item1;
**ovm_blocking_put_imp_P1 #(out_item ,ER902_scoreboard) put_export;
ovm_blocking_put_imp_P2 #(out_item1 ,ER902_scoreboard) put_export1;
**
ovm_component_utils_begin(ER902_scoreboard) ovm_field_object(OUT_item1,OVM_ALL_ON)
ovm_field_object(OUT_item,OVM_ALL_ON) ovm_component_utils_end
function new (string name, ovm_component parent);
super.new(name, parent);
ovm_report_info(“”, “ER902_scoreboard::new”);
put_export = new(“put_export”,this);
put_export1 = new(“put_export1”,this);
ovm_report_info(“”, “Called put_export::new”);
endfunction : new
task put_P1(out_item OUT_item);
// …
endtask : put_P1
task put_P2(out_item1 OUT_item1);
// …
endtask : put_P2

Hope this helps you.

Regards,

Sir,
I had tried the program as u have written… still my problem is, in the scoreboard i could only get the output from monitor ie from task put_P2.
//=======================================================

ovm_blocking_put_imp_decl(_P1) ovm_blocking_put_imp_decl(_P2)

class ER902_scoreboard extends ovm_scoreboard;

logic [31:0] smdd_out;
logic [31:0] spdd_out;

out_item OUT_item;// predictor
out_item1 OUT_item1; //monitor

ovm_blocking_put_imp_P1 #(out_item ,ER902_scoreboard) put_export;
ovm_blocking_put_imp_P2 #(out_item1 ,ER902_scoreboard) put_export1;

ovm_component_utils_begin(ER902_scoreboard) ovm_field_object(OUT_item,OVM_ALL_ON)
ovm_field_object(OUT_item1,OVM_ALL_ON) ovm_component_utils_end

function new (string name, ovm_component parent);
super.new(name, parent);
ovm_report_info(“”, “ER902_scoreboard::new”);
put_export = new(“put_export”,this);
put_export1 = new(“put_export1”,this);
ovm_report_info(“”, “Called put_export::new”);
endfunction : new

task put_P1(out_item OUT_item);
$display(“sequences in scoreboard from predictor”);
spdd_out =OUT_item.pddm_out; //============“ERROR” ===sequences in scoreboard from predictor
// # ** Fatal: (SIGSEGV) Bad handle or reference
$display(“spdd_out =%b”,spdd_out);
endtask : put_P1

task put_P2(out_item1 OUT_item1);
$display(“sequences in scoreboard from monitor”);
smdd_out =OUT_item1.ddm_out;
$display(“smdd_out =%b”,smdd_out);
endtask : put_P2
//====================================
.

pls help

Hi,

Have you connected “ovm_blocking_put_imp_P1 #(out_item ,ER902_scoreboard) put_export;” port?

Regards,

SIr,
i tried to write the “connect function” in the scoreboard … but is not working…

connection b/w

“ovm_blocking_put_imp_P1 #(out_item ,ER902_scoreboard) put_export;”
and
ovm_blocking_put_port #(out_item) put_port;

pls help

Sir,
I ahve connected the monitor and scoreboard as
mon_er902.put_port1.connect(score_er902.put_export1);
and
predictor and scoreboard as
pre_dictor.put_port.connect(score_er902.put_export);
in the environment.

My ports and exports are

for predictor
ovm_blocking_put_imp_P1 #(out_item ,ER902_scoreboard) put_export;
ovm_blocking_put_port #(out_item) put_port;

for monitor
ovm_blocking_put_imp_P2 #(out_item1 ,ER902_scoreboard) put_export1;
ovm_blocking_put_port #(out_item1) put_port1;

how should i connect this in scoreboard.
pls help…

Hi,

It seems that connection are correct. Can you make sure that predictor is not sending nulll packets…

Regards,

Sir ,
I got it corrected. Thank u for ur help.
regards
lakshmi