2016-06-28 8 views

Antwort

2

Port-Verbindung wird verwendet, um zwei unabhängige Blöcke (Komponenten) zu verbinden. Sowohl uvm_blocking_put_port als auch uvm_analysis_port werden verwendet, um Daten vom Produzenten zum Verbraucher zu übertragen.

(1) uvm_blocking_put_port: Wird für die Datenübertragung von einem einzelnen Hersteller zu einem einzelnen Verbraucher verwendet.

(2) uvm_analysis_port: Wird für die Datenübertragung von einem einzelnen Hersteller zu einem einzelnen Verbraucher oder mehreren Verbrauchern verwendet.

Vorteil für diesen Analyseport ist, dass ein Benutzer Daten von einem einzelnen Hersteller zu mehreren Konsumenten übertragen kann, die nicht mit Hilfe von uvm_blocking_put_port archiviert werden.

Dieses Ding wird auch in der Abbildung erklärt.

Hier stelle ich Beispielcode zur Verfügung, um mehr Klarheit für uvm_blocking_put_port und uvm_analysis_port zu erhalten.

This image explain use of uvm_blocking_put_port

Denken Sie daran: Port-Verbindung verwendet wird, um zwei oder mehrere unabhängige Komponente zu verbinden.

(1) uvm_blocking_put_port BEISPIEL.

class transaction extends uvm_sequence_item; 
    `uvm_object_utils(transaction); 
    rand int unsigned a; 
    rand int unsigned b; 

    function new(string name =""); 
    super.new(name); 
    endfunction 

endclass 


class producer extends uvm_component; 
    `uvm_component_utils(producer); 
    transaction tr_inst; 
    uvm_blocking_put_port #(transaction) produce_to_consumer_p; 

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


    task run_phase(uvm_phase phase) ; 
    super.run_phase(phase); 
    phase.raise_objection(this); 
    //tr_inst.randomize(); 
    `uvm_info(get_full_name(),"Write the data from PRODUCER",UVM_LOW) 
    tr_inst.a = 10; tr_inst.b = 20; 
    produce_to_consumer_p.put(tr_inst); 
    phase.drop_objection(this); 
    endtask 

endclass 

class consumer extends uvm_component; 
    `uvm_component_utils(consumer); 
    uvm_blocking_put_imp#(transaction,consumer) put_imp; 
    //transaction tr_inst; 

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

    function void put(transaction tr_inst); 
    `uvm_info(get_full_name(),"Got the data in CONSUMER",UVM_LOW); 
    `uvm_info(get_full_name(),$sformatf("the value of a %0d and b is %0d",tr_inst.a,tr_inst.b),UVM_LOW); 
    endfunction 

endclass 

class env extends uvm_component; 
    `uvm_component_utils(env); 

    producer p_inst; 
    consumer c_inst; 

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

    function void connect(); 
    p_inst.produce_to_consumer_p.connect(c_inst.put_imp); 
    endfunction 

endclass 

module main(); 

    env env_inst; 

    initial 
    begin 
    env_inst = new("env_inst",null); 
    run_test(); 
    end 

endmodule 

This image gives explanation of uvm_analysis_port (2) uvm_analysis_port BEISPIEL

class transaction extends uvm_sequence_item; 
    `uvm_object_utils(transaction); 
    rand int unsigned a; 
    rand int unsigned b; 

    function new(string name =""); 
    super.new(name); 
    endfunction 

endclass 


class producer extends uvm_component; 
    `uvm_component_utils(producer); 
    transaction tr_inst; 
    uvm_analysis_port #(transaction) produce_to_consumer_p; 

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


    task run_phase(uvm_phase phase); 
    super.run_phase(phase); 
    phase.raise_objection(this); 
// tr_inst.randomize(); 
    `uvm_info(get_full_name(),"Write the data from PRODUCER",UVM_LOW); 
    tr_inst.a = 10; tr_inst.b = 20; 
    produce_to_consumer_p.write(tr_inst); 
    phase.drop_objection(this); 
    endtask 

endclass 

class consumer_1 extends uvm_component; 
    `uvm_component_utils(consumer_1); 
    uvm_analysis_imp#(transaction,consumer_1) write_imp_1; 

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

    function void write(transaction tr_inst); 
    `uvm_info(get_full_name(),"Got the data in CONSUMER_1",UVM_LOW); 
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW); 
    endfunction 

endclass 

class consumer_2 extends uvm_component; 
    `uvm_component_utils(consumer_2); 
    uvm_analysis_imp#(transaction,consumer_2) write_imp_2; 

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

    function void write(transaction tr_inst); 
    `uvm_info(get_full_name(),"Got the data in CONSUMER_2",UVM_LOW); 
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW); 
    endfunction 

endclass 

class consumer_3 extends uvm_component; 
    `uvm_component_utils(consumer_3); 
    uvm_analysis_imp#(transaction,consumer_3) write_imp_3; 

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

    function void write(transaction tr_inst); 
    `uvm_info(get_full_name(),"Got the data in CONSUMER_3",UVM_LOW); 
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW); 
    endfunction 

endclass 

class env extends uvm_component; 
    `uvm_component_utils(env); 

    producer p_inst; 
    consumer_1 c_inst_1; 
    consumer_2 c_inst_2; 
    consumer_3 c_inst_3; 

    function new(string name="",uvm_component parent); 
    super.new(name,parent); 
    p_inst = new("p_inst",this); 
    c_inst_1 = new("c_inst_1",this); 
    c_inst_2 = new("c_inst_2",this); 
    c_inst_3 = new("c_inst_3",this); 
    endfunction 

    function void connect(); 
    p_inst.produce_to_consumer_p.connect(c_inst_1.write_imp_1); 
    p_inst.produce_to_consumer_p.connect(c_inst_2.write_imp_2); 
    p_inst.produce_to_consumer_p.connect(c_inst_3.write_imp_3); 
    endfunction 

endclass 

module main(); 

    env env_inst; 
    initial 
    begin 
    env_inst = new("env_inst",null); 
    run_test(); 
    end 

endmodule 
Verwandte Themen