2016-06-28 2 views

답변

2

포트 연결은 두 개의 독립 블록 (구성 요소)을 연결하는 데 사용됩니다. uvm_blocking_put_port 및 uvm_analysis_port는 모두 생산자에서 소비자로 데이터를 전송하는 데 사용됩니다.

(1) uvm_blocking_put_port : 단일 제작자에서 단일 소비자로의 데이터 전송에 사용됩니다.

(2) uvm_analysis_port : 단일 제작자에서 단일 소비자 또는 다중 소비자로의 데이터 전송에 사용됩니다.

이 분석 포트의 장점은 사용자가 단일 제작자의 데이터를 uvm_blocking_put_port의 도움으로 아카이브되지 않은 여러 소비자로 전송할 수 있다는 것입니다.

이 점에 대해서도 그림에서 설명합니다.

여기 샘플 코드를 제공하여 uvm_blocking_put_port 및 uvm_analysis_port를 더욱 명확하게 보여줍니다.

This image explain use of uvm_blocking_put_port

는 기억 포트 연결이 두 개 이상의 독립적 인 구성 요소를 연결하는 데 사용됩니다.

(1) uvm_blocking_put_port 예. 예 uvm_analysis_port

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)

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