stuart
02-05-2008, 04:57 PM
There have been several posts requesting examples of virtual sequences.
Below are a few simple examples (also see next post below)... :
-Stuart
action_api_vseq - basic demonstration of each "action" api (do, create, send...)
module test;
// This test shows the use of actions for virtual sequences. These include:
// 1. ovm_do_seq
// 2. ovm_do_seq_with
// 3. ovm_create_seq
// 4. ovm_send
// 5. ovm_rand_send
// 6. ovm_rand_send_with
`include "ovm.svh"
class simple_item extends ovm_sequence_item;
`ovm_object_utils(simple_item)
function new (string name="simple_item",
ovm_sequencer_base sequencer = null,
ovm_sequence parent_seq = null);
super.new(name, sequencer, parent_seq);
endfunction : new
endclass : simple_item
class simple_vsequencer extends ovm_virtual_sequencer;
`ovm_declare_sequence_lib
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib
endfunction : new
`ovm_component_utils(simple_vsequencer)
virtual function void build();
super.build();
add_seq_cons_if("foo");
add_seq_cons_if("bar");
endfunction
endclass : simple_vsequencer
class simple_sequencer extends ovm_sequencer;
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
`ovm_declare_sequence_lib
`ovm_component_utils(simple_sequencer)
endclass : simple_sequencer
class simple_seq extends ovm_sequence;
rand int foo;
int bar;
simple_item s_item;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils_begin(simple_seq, simple_sequencer)
`ovm_field_int(foo, OVM_ALL_ON)
`ovm_field_int(bar, OVM_ALL_ON)
`ovm_sequence_utils_end
virtual task body();
$display("%0t : simple_seq body() starting...", $time);
#10;
`ovm_do(s_item)
$display("%0t : simple_seq item done!", $time);
bar = foo + 1;
#40;
endtask
endclass : simple_seq
class vsimple_seq extends ovm_sequence;
simple_seq s_seq;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(vsimple_seq, simple_vsequencer)
virtual task body();
$display("%0t : vsimple_seq body() starting...", $time);
#10;
`ovm_do_seq(s_seq, p_sequencer.seq_cons_if["bar"])
$display("%0t : vsimple_seq do_seq of s_seq done!", $time);
#100;
`ovm_do_seq_with(s_seq, p_sequencer.seq_cons_if["bar"], { foo == 32'h3; } )
$display("%0t : vsimple_seq do_seq_with of s_seq done!", $time);
assert(s_seq.bar == 4) begin $display("%0t : vsimple_seq s_seq.bar is 4", $time); end
else $fatal;
s_seq = null;
`ovm_create_seq(s_seq, p_sequencer.seq_cons_if["bar"])
`ovm_send(s_seq)
s_seq.print();
#100;
`ovm_rand_send(s_seq)
s_seq.print();
#100;
`ovm_rand_send_with(s_seq, { foo == 32'hA; } )
s_seq.print();
endtask
endclass : vsimple_seq
class simple_driver extends ovm_driver;
ovm_sequence_item item;
function new (string name, ovm_component parent);
super.new(name, parent);
endfunction : new
`ovm_component_utils(simple_driver)
task run();
while(1) begin
#10;
$display("%0t : simple_driver getting next item...", $time);
seq_item_prod_if.get_next_item(item);
seq_item_prod_if.item_done();
end
endtask: run
endclass : simple_driver
simple_vsequencer vsequencer0;
simple_sequencer sequencer0;
simple_driver driver0;
initial
begin
$display("Beginning test...");
//ovm_default_printer = ovm_default_tree_printer;
set_config_int("sequencer0", "count", 0);
set_config_string("vsequencer0", "default_sequence", "vsimple_seq");
vsequencer0 = new("vsequencer0", null); vsequencer0.build();
sequencer0 = new("sequencer0", null); sequencer0.build();
driver0 = new("driver0", null); driver0.build();
driver0.seq_item_prod_if.connect_if(sequencer0.seq _item_cons_if);
sequencer0.seq_prod_if.connect_if(vsequencer0.seq_ cons_if["bar"]);
vsequencer0.print();
sequencer0.print();
driver0.print();
run_test();
end
endmodule
basic_api_vseq - basic demonstration of each user api in the seq_cons_if class
module test;
// This test uses each interface provided by the sequence consumer interface.
// These are:
// 1. is_grabbed()
// 2. grab()
// 3. current_grabber()
// 4. ungrab()
// 5. start_sequence()
// 6. is_connected()
// 7. is_virtual_sequencer()
// 8. get_sequencer_type_name()
`include "ovm.svh"
class simple_item extends ovm_sequence_item;
`ovm_object_utils(simple_item)
function new (string name="simple_item",
ovm_sequencer_base sequencer = null,
ovm_sequence parent_seq = null);
super.new(name, sequencer, parent_seq);
endfunction : new
endclass : simple_item
class simple_vsequencer extends ovm_virtual_sequencer;
`ovm_declare_sequence_lib
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib
endfunction : new
`ovm_component_utils(simple_vsequencer)
virtual function void build();
super.build();
add_seq_cons_if("foo");
add_seq_cons_if("bar");
endfunction
endclass : simple_vsequencer
class simple_sequencer extends ovm_sequencer;
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
`ovm_declare_sequence_lib
`ovm_component_utils(simple_sequencer)
endclass : simple_sequencer
class simple_seq extends ovm_sequence;
simple_item s_item;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(simple_seq, simple_sequencer)
virtual task body();
$display("%0t : simple_seq body() starting...", $time);
#10;
`ovm_do(s_item)
$display("%0t : simple_seq item done!", $time);
#40;
endtask
endclass : simple_seq
class vsimple_seq extends ovm_sequence;
simple_seq s_seq;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(vsimple_seq, simple_vsequencer)
virtual task body();
$display("%0t : vsimple_seq body() starting...", $time);
#10;
assert(p_sequencer.seq_cons_if["bar"].is_connected() == 1) else $fatal;
assert(p_sequencer.seq_cons_if["foo"].is_connected() == 0) else $fatal;
assert(p_sequencer.seq_cons_if["bar"].is_virtual_sequencer() == 0) else $fatal;
assert(p_sequencer.seq_cons_if["bar"].get_sequencer_type_name() == "simple_sequencer") else $fatal;
assert(p_sequencer.seq_cons_if["foo"].get_sequencer_type_name() == "NOT_CONNECTED") else $fatal;
assert(p_sequencer.seq_cons_if["bar"].is_grabbed() == 0) else $fatal;
p_sequencer.seq_cons_if["bar"].grab(this);
assert(p_sequencer.seq_cons_if["bar"].current_grabber() == this) else $fatal;
p_sequencer.seq_cons_if["bar"].ungrab(this);
s_seq = new("s_seq", null, this);
p_sequencer.seq_cons_if["bar"].start_sequence(s_seq);
$display("%0t : vsimple_seq do_seq of s_seq done!", $time);
#100;
endtask
endclass : vsimple_seq
class simple_driver extends ovm_driver;
ovm_sequence_item item;
function new (string name, ovm_component parent);
super.new(name, parent);
endfunction : new
`ovm_component_utils(simple_driver)
task run();
while(1) begin
#10;
$display("%0t : simple_driver getting next item...", $time);
seq_item_prod_if.get_next_item(item);
item.print();
seq_item_prod_if.item_done();
end
endtask: run
endclass : simple_driver
simple_vsequencer vsequencer0;
simple_sequencer sequencer0;
simple_driver driver0;
initial
begin
$display("Beginning test...");
//ovm_default_printer = ovm_default_tree_printer;
set_config_int("sequencer0", "count", 0);
set_config_string("vsequencer0", "default_sequence", "vsimple_seq");
vsequencer0 = new("vsequencer0", null); vsequencer0.build();
sequencer0 = new("sequencer0", null); sequencer0.build();
driver0 = new("driver0", null); driver0.build();
driver0.seq_item_prod_if.connect_if(sequencer0.seq _item_cons_if);
sequencer0.seq_prod_if.connect_if(vsequencer0.seq_ cons_if["bar"]);
vsequencer0.print(); sequencer0.print(); driver0.print();
run_test();
end
endmodule
Below are a few simple examples (also see next post below)... :
-Stuart
action_api_vseq - basic demonstration of each "action" api (do, create, send...)
module test;
// This test shows the use of actions for virtual sequences. These include:
// 1. ovm_do_seq
// 2. ovm_do_seq_with
// 3. ovm_create_seq
// 4. ovm_send
// 5. ovm_rand_send
// 6. ovm_rand_send_with
`include "ovm.svh"
class simple_item extends ovm_sequence_item;
`ovm_object_utils(simple_item)
function new (string name="simple_item",
ovm_sequencer_base sequencer = null,
ovm_sequence parent_seq = null);
super.new(name, sequencer, parent_seq);
endfunction : new
endclass : simple_item
class simple_vsequencer extends ovm_virtual_sequencer;
`ovm_declare_sequence_lib
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib
endfunction : new
`ovm_component_utils(simple_vsequencer)
virtual function void build();
super.build();
add_seq_cons_if("foo");
add_seq_cons_if("bar");
endfunction
endclass : simple_vsequencer
class simple_sequencer extends ovm_sequencer;
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
`ovm_declare_sequence_lib
`ovm_component_utils(simple_sequencer)
endclass : simple_sequencer
class simple_seq extends ovm_sequence;
rand int foo;
int bar;
simple_item s_item;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils_begin(simple_seq, simple_sequencer)
`ovm_field_int(foo, OVM_ALL_ON)
`ovm_field_int(bar, OVM_ALL_ON)
`ovm_sequence_utils_end
virtual task body();
$display("%0t : simple_seq body() starting...", $time);
#10;
`ovm_do(s_item)
$display("%0t : simple_seq item done!", $time);
bar = foo + 1;
#40;
endtask
endclass : simple_seq
class vsimple_seq extends ovm_sequence;
simple_seq s_seq;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(vsimple_seq, simple_vsequencer)
virtual task body();
$display("%0t : vsimple_seq body() starting...", $time);
#10;
`ovm_do_seq(s_seq, p_sequencer.seq_cons_if["bar"])
$display("%0t : vsimple_seq do_seq of s_seq done!", $time);
#100;
`ovm_do_seq_with(s_seq, p_sequencer.seq_cons_if["bar"], { foo == 32'h3; } )
$display("%0t : vsimple_seq do_seq_with of s_seq done!", $time);
assert(s_seq.bar == 4) begin $display("%0t : vsimple_seq s_seq.bar is 4", $time); end
else $fatal;
s_seq = null;
`ovm_create_seq(s_seq, p_sequencer.seq_cons_if["bar"])
`ovm_send(s_seq)
s_seq.print();
#100;
`ovm_rand_send(s_seq)
s_seq.print();
#100;
`ovm_rand_send_with(s_seq, { foo == 32'hA; } )
s_seq.print();
endtask
endclass : vsimple_seq
class simple_driver extends ovm_driver;
ovm_sequence_item item;
function new (string name, ovm_component parent);
super.new(name, parent);
endfunction : new
`ovm_component_utils(simple_driver)
task run();
while(1) begin
#10;
$display("%0t : simple_driver getting next item...", $time);
seq_item_prod_if.get_next_item(item);
seq_item_prod_if.item_done();
end
endtask: run
endclass : simple_driver
simple_vsequencer vsequencer0;
simple_sequencer sequencer0;
simple_driver driver0;
initial
begin
$display("Beginning test...");
//ovm_default_printer = ovm_default_tree_printer;
set_config_int("sequencer0", "count", 0);
set_config_string("vsequencer0", "default_sequence", "vsimple_seq");
vsequencer0 = new("vsequencer0", null); vsequencer0.build();
sequencer0 = new("sequencer0", null); sequencer0.build();
driver0 = new("driver0", null); driver0.build();
driver0.seq_item_prod_if.connect_if(sequencer0.seq _item_cons_if);
sequencer0.seq_prod_if.connect_if(vsequencer0.seq_ cons_if["bar"]);
vsequencer0.print();
sequencer0.print();
driver0.print();
run_test();
end
endmodule
basic_api_vseq - basic demonstration of each user api in the seq_cons_if class
module test;
// This test uses each interface provided by the sequence consumer interface.
// These are:
// 1. is_grabbed()
// 2. grab()
// 3. current_grabber()
// 4. ungrab()
// 5. start_sequence()
// 6. is_connected()
// 7. is_virtual_sequencer()
// 8. get_sequencer_type_name()
`include "ovm.svh"
class simple_item extends ovm_sequence_item;
`ovm_object_utils(simple_item)
function new (string name="simple_item",
ovm_sequencer_base sequencer = null,
ovm_sequence parent_seq = null);
super.new(name, sequencer, parent_seq);
endfunction : new
endclass : simple_item
class simple_vsequencer extends ovm_virtual_sequencer;
`ovm_declare_sequence_lib
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib
endfunction : new
`ovm_component_utils(simple_vsequencer)
virtual function void build();
super.build();
add_seq_cons_if("foo");
add_seq_cons_if("bar");
endfunction
endclass : simple_vsequencer
class simple_sequencer extends ovm_sequencer;
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
`ovm_declare_sequence_lib
`ovm_component_utils(simple_sequencer)
endclass : simple_sequencer
class simple_seq extends ovm_sequence;
simple_item s_item;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(simple_seq, simple_sequencer)
virtual task body();
$display("%0t : simple_seq body() starting...", $time);
#10;
`ovm_do(s_item)
$display("%0t : simple_seq item done!", $time);
#40;
endtask
endclass : simple_seq
class vsimple_seq extends ovm_sequence;
simple_seq s_seq;
function new(string name="simple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_sequence_utils(vsimple_seq, simple_vsequencer)
virtual task body();
$display("%0t : vsimple_seq body() starting...", $time);
#10;
assert(p_sequencer.seq_cons_if["bar"].is_connected() == 1) else $fatal;
assert(p_sequencer.seq_cons_if["foo"].is_connected() == 0) else $fatal;
assert(p_sequencer.seq_cons_if["bar"].is_virtual_sequencer() == 0) else $fatal;
assert(p_sequencer.seq_cons_if["bar"].get_sequencer_type_name() == "simple_sequencer") else $fatal;
assert(p_sequencer.seq_cons_if["foo"].get_sequencer_type_name() == "NOT_CONNECTED") else $fatal;
assert(p_sequencer.seq_cons_if["bar"].is_grabbed() == 0) else $fatal;
p_sequencer.seq_cons_if["bar"].grab(this);
assert(p_sequencer.seq_cons_if["bar"].current_grabber() == this) else $fatal;
p_sequencer.seq_cons_if["bar"].ungrab(this);
s_seq = new("s_seq", null, this);
p_sequencer.seq_cons_if["bar"].start_sequence(s_seq);
$display("%0t : vsimple_seq do_seq of s_seq done!", $time);
#100;
endtask
endclass : vsimple_seq
class simple_driver extends ovm_driver;
ovm_sequence_item item;
function new (string name, ovm_component parent);
super.new(name, parent);
endfunction : new
`ovm_component_utils(simple_driver)
task run();
while(1) begin
#10;
$display("%0t : simple_driver getting next item...", $time);
seq_item_prod_if.get_next_item(item);
item.print();
seq_item_prod_if.item_done();
end
endtask: run
endclass : simple_driver
simple_vsequencer vsequencer0;
simple_sequencer sequencer0;
simple_driver driver0;
initial
begin
$display("Beginning test...");
//ovm_default_printer = ovm_default_tree_printer;
set_config_int("sequencer0", "count", 0);
set_config_string("vsequencer0", "default_sequence", "vsimple_seq");
vsequencer0 = new("vsequencer0", null); vsequencer0.build();
sequencer0 = new("sequencer0", null); sequencer0.build();
driver0 = new("driver0", null); driver0.build();
driver0.seq_item_prod_if.connect_if(sequencer0.seq _item_cons_if);
sequencer0.seq_prod_if.connect_if(vsequencer0.seq_ cons_if["bar"]);
vsequencer0.print(); sequencer0.print(); driver0.print();
run_test();
end
endmodule