У меня есть среда UVM / system-verilog, в которой есть 3 агента, которые связаны портами анализа с табло. Я использую квест на windows для симуляции. Я получаю сообщение об ошибке:
# UVM_ERROR @ 0: uvm_test_top.tx_machine_env.tx_machine_sb.Q_I_in_export [Ошибка соединения] число соединений 0 не соответствует требуемому минимуму 1
мой монитор:
class qvsat_ib_tx_machine_desc_monitor extends uvm_monitor;
`uvm_component_utils(qvsat_ib_tx_machine_desc_monitor)
uvm_analysis_port#(qvsat_ib_tx_machine_desc_item) qvsat_ib_tx_machine_desc_ap;
virtual qvsat_ib_tx_machine_desc_if tx_machine_desc_if;
//Constructor
function new(string name = "qvsat_ib_tx_machine_desc_monitor", uvm_component parent);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
qvsat_ib_tx_machine_desc_ap = new(.name("qvsat_ib_tx_machine_desc_ap"), .parent(this));
endfunction: build_phase
task run_phase(uvm_phase phase);
.
.
.
endtask
endclass
мой агент:
class qvsat_ib_tx_machine_desc_agent extends uvm_agent ;
`uvm_component_utils(qvsat_ib_tx_machine_desc_agent)
uvm_analysis_port#(qvsat_ib_tx_machine_desc_item) tx_machine_desc_ap;
qvsat_ib_tx_machine_desc_sequencer tx_machine_seqr;
qvsat_ib_tx_machine_desc_driver tx_machine_driver;
qvsat_ib_tx_machine_desc_monitor tx_machine_monitor;
qvsat_ib_tx_machine_desc_agent_config cfg;
//Constructor
function new(string name = "qvsat_ib_tx_machine_desc_agent", uvm_component parent);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
uvm_report_info(get_full_name(),"START of build ",UVM_LOW);
super.build_phase(phase);
if ( ! uvm_config_db#( qvsat_ib_tx_machine_desc_agent_config )::get
( .cntxt( this ), .inst_name( "" ), .field_name( "desc_cfg" ), .value( cfg ) ) ) begin
`uvm_error( "qvsat_ib_tx_machine_desc_agent", "cfg not found" )
end
tx_machine_desc_ap = new(.name("tx_machine_desc_ap"), .parent(this));
.
.
.
tx_machine_monitor = qvsat_ib_tx_machine_desc_monitor::type_id::create(.name("tx_machine_monitor"), .parent(this));
uvm_report_info(get_full_name(),"END of build ",UVM_LOW);
endfunction: build_phase
function void connect_phase(uvm_phase phase);
uvm_report_info(get_full_name(),"START of connect ",UVM_LOW);
super.connect_phase(phase);
.
.
.
uvm_report_info(get_full_name(),"connecting analysis ports",UVM_HIGH);
tx_machine_monitor.qvsat_ib_tx_machine_desc_ap.connect(tx_machine_desc_ap);
uvm_report_info(get_full_name(),"END of connect ",UVM_LOW);
endfunction: connect_phase
endclass
моя среда:
class qvsat_ib_tx_machine_env extends uvm_env;
`uvm_component_utils(qvsat_ib_tx_machine_env)
qvsat_ib_tx_machine_desc_agent tx_machine_desc_agent ;
qvsat_ib_tx_machine_sb tx_machine_sb;
qvsat_ib_tx_machine_env_config env_cfg ;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
uvm_report_info(get_full_name(),"START of build ",UVM_LOW);
super.build_phase(phase);
tx_machine_desc_agent = qvsat_ib_tx_machine_desc_agent::type_id::create(.name("tx_machine_desc_agent"), .parent(this));
uvm_report_info(get_full_name(),"END of build ",UVM_LOW);
endfunction: build_phase
function void connect_phase(uvm_phase phase);
uvm_report_info(get_full_name(),"START of connect ",UVM_LOW);
super.connect_phase(phase);
if(env_cfg.scoreboard_en == 1'b1) begin
tx_machine_desc_agent.tx_machine_desc_ap.connect(tx_machine_sb.desc_export);
end
uvm_report_info(get_full_name(),"END of connect ",UVM_LOW);
endfunction: connect_phase
endclass: qvsat_ib_tx_machine_env
мое табло:
`uvm_analysis_imp_decl(_desc )
class qvsat_ib_tx_machine_sb extends uvm_scoreboard;
`uvm_component_utils(qvsat_ib_tx_machine_sb)
uvm_analysis_export #(qvsat_ib_tx_machine_desc_item) desc_export ;
qvsat_ib_tx_machine_desc_item cur_desc;
function new(string name, uvm_component parent);
super.new(name, parent);
uw_cnt = 0;
uw_simbole_cnt = 0;
data_cnt = 0;
pilot_simbole_cnt = 0;
state = IDLE;
endfunction : new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
desc_export = new("desc_export", this);
endfunction: build_phase
virtual function void write_desc(input qvsat_ib_tx_machine_desc_item desc);
cur_desc = desc;
cur_desc.print();
endfunction : write_desc
.
.
.
endclass
Примечание. У меня есть еще 2 агента, которые подключены к табло через 2 других порта анализа, и я получаю одно и то же сообщение об ошибке для всех них.
Как можно исправить эту ошибку?