2011年6月3日 星期五

Connecting a Child Export to a Parent Export

Cadence example

此例的連接性
producer.put_port->consumer.put_export->child_consumer.put_export

`include "uvm_pkg.sv"

module test;
import uvm_pkg::*;
`include "uvm_macros.svh"

`include "simple_packet.sv"

typedef class consumer;
class parent_consumer extends uvm_component;
uvm_blocking_put_export #(simple_packet) put_export;
consumer child_consumer_inst;

`uvm_component_utils(parent_consumer)

function new(string name, uvm_component parent);
super.new(name, parent);
put_export = new("put_export", this);
child_consumer_inst= new("child_consumer_inst", this);
endfunction

virtual function void connect();
put_export.connect(child_consumer_inst.put_export);
endfunction : connect

endclass : parent_consumer

class producer extends uvm_component;
uvm_blocking_put_port #(simple_packet) put_port;

`uvm_component_utils_begin(producer)
`uvm_component_utils_end

function new(string name, uvm_component parent);
super.new(name, parent);
put_port = new("put_port", this);
endfunction : new

virtual task run();
simple_packet p;
p = simple_packet::type_id::create("p");
void'(p.randomize());
put_port.put(p);
endtask : run

endclass : producer

class consumer extends uvm_component;
uvm_blocking_put_imp #(simple_packet, consumer) put_export;

`uvm_component_utils(consumer)

function new(string name, uvm_component parent);
super.new(name, parent);
put_export = new("put_export", this);
endfunction : new

task put(simple_packet p);
p.print();
endtask : put
endclass : consumer

class parent_comp extends uvm_component;
producer producer_inst;
parent_consumer consumer_inst;

`uvm_component_utils(parent_comp)

function new(string name, uvm_component parent);
super.new(name, parent);
endfunction : new

function void build();
super.build();
producer_inst = producer::type_id::create("producer_inst", null);
consumer_inst = parent_consumer::type_id::create("consumer_inst", null);
endfunction : build

function void connect();
super.connect();
producer_inst.put_port.connect(consumer_inst.put_export);
endfunction : connect

function void end_of_elaboration();
super.end_of_elaboration();
this.print();
endfunction : end_of_elaboration

endclass : parent_comp

parent_comp pc = parent_comp::type_id::create("pc", null);

initial begin
fork
run_test();
#100 global_stop_request();
join
end

endmodule : test

沒有留言: