PDA

View Full Version : Virtual Sequence Examples



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

stuart
02-05-2008, 04:59 PM
virt_subseq_vseq - basic demonstration of executing a virtual subsequence inside a virtual sequence (different than doing driver sequences on driver sequencers)




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_sequencer_utils(simple_vsequencer)
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib
endfunction : new
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;
`ovm_sequencer_utils(simple_sequencer)
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
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_register_sequence(simple_seq, simple_sequencer)
`ovm_object_utils_begin(simple_seq)
`ovm_field_int(foo, OVM_ALL_ON)
`ovm_field_int(bar, OVM_ALL_ON)
`ovm_object_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 vplain_seq extends ovm_sequence;
simple_seq s_seq;
rand int duh;
function new(string name="vplain_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_register_sequence(vplain_seq, simple_vsequencer)
`ovm_object_utils(vplain_seq)
virtual task body();
$display("%0t : vplain_seq body() starting...", $time);
#10;
`ovm_do_seq(s_seq, p_sequencer.seq_cons_if["bar"])
$display("%0t : vplain_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 : vplain_seq do_seq_with of s_seq done!", $time);
assert(s_seq.bar == 4) begin $display("%0t : vplain_seq s_seq.bar is 4", $time); end
else $fatal;
endtask
endclass
class vsimple_seq extends ovm_sequence;
vplain_seq vp_seq;
function new(string name="vsimple_seq",
ovm_sequencer_base sequencer=null,
ovm_sequence parent_seq=null);
super.new(name, sequencer, parent_seq);
endfunction
`ovm_register_sequence(vsimple_seq, simple_vsequencer)
`ovm_object_utils(vsimple_seq)
virtual task body();
$display("%0t : vsimple_seq body() starting...", $time);
#10;
`ovm_do(vp_seq)
$display("%0t : vsimple_seq do of vp_seq done!", $time);
#100;
`ovm_do_with(vp_seq, { duh == 32'h3; } )
$display("%0t : vsimple_seq do_with of vp_seq done!", $time);
assert(vp_seq.duh == 3) begin $display("%0t : vsimple_seq vp_seq.duh is 3", $time); end else $fatal;
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



manual_if_vseq - basic demonstration of manually creating the seq_cons_if instance in lieu of using the add_seq_cons_if() api.





module test;
// This test shows the ability to manually create the seq_cons_if in the
// virtual sequencer as opposed to using the array and the add_seq_cons_if()
// function.
`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_seq_cons_if that_seq_cons_if;
`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();
that_seq_cons_if = new("that_seq_cons_if", this);
endfunction
endclass : simple_vsequencer
class simple_sequencer extends ovm_sequencer;
`ovm_declare_sequence_lib
function new (string name, ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(simple_item)
endfunction : new
`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.that_seq_cons_if)
$display("%0t : vsimple_seq do_seq of s_seq done!", $time);
#100;
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.that _seq_cons_if);
vsequencer0.print();
sequencer0.print();
driver0.print();
run_test();
end
endmodule