количество соединений 0 не соответствует требуемому минимуму 1 - PullRequest
1 голос
/ 31 марта 2020

У меня есть среда 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 других порта анализа, и я получаю одно и то же сообщение об ошибке для всех них.

Как можно исправить эту ошибку?

1 Ответ

0 голосов
/ 31 марта 2020

Я сделал следующее изменение, которое решило эту проблему: вместо

    uvm_analysis_export #(qvsat_ib_tx_machine_desc_item) desc_export      ;

я использовал:

    uvm_analysis_imp_desc       #(qvsat_ib_tx_machine_desc_item,qvsat_ib_tx_machine_sb) desc_export      ;

т.е. uvm_analysis_imp <`uvm_analysis_imp_decl name>

regards Илан

...