跳转至

输入查询内容

    本页内容

    新增 uvm_sequencer_base::get_arbitration_sequence / start() 重入检测改 mutex

    新增功能:目标库新增的 API 和可选替代接口;已有用法的迁移要求列在用户接口与行为中。

    影响范围

    重入 start 同一 sequence,或采用仲裁队列观察接口。

    具体差异

    新增只读仲裁观察 API;start() 重入检测行为等价(重复 start 仍 SEQ_NOT_DONE fatal)。

    修改方案

    无。

    兼容措施与范围:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。

    迁移后验证

    并发重复 start 应被诊断;正常重复启动前确认前次结束,仲裁索引限制在当前队列范围。

    补充查阅

    扫描定位与记录结果

    无对应规则。当前脚本没有针对本条的直接检测规则。

    本条处理级别为“可选采用”,按修改方案评估;缺少扫描规则本身不增加迁移改造要求。

    扫描器下载、输入范围与报告说明

    源码与标准依据

    核查方式:源码核对。未单独进行 VCS 行为实测。

    VCS 内置 UVM-1.2uvm_sequence_base.svh:282 附近(start 用状态枚举做重入检查)

    VCS 内置 uvm-ieee-2020-2.0uvm_sequencer_base.svh:312/uvm_sequencer_base.svh:1292get_arbitration_sequence(int index) 返回仲裁队列中第 index 个 sequence);uvm_sequence_base.svh:149/uvm_sequence_base.svh:290m_sequence_state_mutex.try_get 做重入检查)

    引用代码(高亮为引用行);上方行号链接可直接定位。

    src/vcs-uvm-1.2/seq/uvm_sequence_base.svh
        end
        if (this_priority < 0) begin
           if (parent_sequence == null) this_priority = 100;
           else this_priority = parent_sequence.get_priority();
        end
    
        // Check that the response queue is empty from earlier runs
        clear_response_queue();
    
        m_priority           = this_priority;
    
        if (m_sequencer != null) begin
           integer handle;
           uvm_tr_stream stream;
           if (m_parent_sequence == null) begin
              stream = m_sequencer.get_tr_stream(get_name(), "Transactions");
              handle = m_sequencer.begin_tr(this, get_name());
              m_tr_recorder = uvm_recorder::get_recorder_from_handle(handle);
           end else begin
    

    完整源码 · SHA256:1594d38afd79cb400a689fdbe6c8e33ff60714bb7527cd8d79739d9357b31682

    src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh
      // Added in IEEE. Not in UVM 1.2
      // @uvm-ieee 1800.2-2020 auto 15.3.2.4
      extern virtual function uvm_sequence_base get_arbitration_sequence( int index );
    
      //----------------------------------------------------------------------------
      // INTERNAL METHODS - DO NOT CALL DIRECTLY, ONLY OVERLOAD IF VIRTUAL
      //----------------------------------------------------------------------------
    
      extern protected function void grant_queued_locks();
    
    
      extern protected task          m_select_sequence(output uvm_sequence_request selected_sequence_request);
      extern protected function int  m_choose_next_request();
      extern           task          m_wait_for_arbitration_completed(int request_id);
      extern           function void m_set_arbitration_completed(int request_id);
    
    
      extern local task m_lock_req(uvm_sequence_base sequence_ptr, bit lock);
    

    src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh
    // get_arbitration_sequence
    // ---------------
    function uvm_sequence_base uvm_sequencer_base::get_arbitration_sequence( int index);
      return arb_sequence_q[index].sequence_ptr;
    endfunction
    
    
    // analysis_write
    // --------------
    
    function void uvm_sequencer_base::analysis_write(uvm_sequence_item t);
      return;
    endfunction
    
    
    // wait_for_sequences
    // ------------------
    

    完整源码 · SHA256:6d2477484529dad661a38b31619edf9898bfa3375f217f06a27b3a69af32ccf7

    src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh
      // This semaphore is provided to ensure that a sequence is only being
      // run from a single thread at a time.
      protected semaphore          m_sequence_state_mutex;
      protected uvm_sequence_state m_sequence_state;
                int                m_next_transaction_id = 1;
      local     int                m_priority = -1;
                uvm_recorder       m_tr_recorder;
                int                m_wait_for_grant_semaphore;
    
      // Each sequencer will assign a sequence id.  When a sequence is talking to multiple
      // sequencers, each sequence_id is managed separately
      protected int m_sqr_seq_ids[int];
    
      protected bit children_array[uvm_sequence_base];
    
      protected uvm_sequence_item response_queue[$];
      protected int               response_queue_depth = 8;
      protected bit               response_queue_error_report_enabled;
    

    src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh
        set_item_context(parent_sequence, sequencer);
    
        if (m_sequence_state_mutex.try_get(1) == 0) begin
          uvm_report_fatal("SEQ_NOT_DONE",
             {"Sequence ", get_full_name(), " already started"},UVM_NONE);
        end
    
        if (m_parent_sequence != null) begin
           m_parent_sequence.children_array[this] = 1;
        end
    
        if (this_priority < -1) begin
          uvm_report_fatal("SEQPRI", $sformatf("Sequence %s start has illegal priority: %0d",
                                               get_full_name(),
                                               this_priority), UVM_NONE);
        end
        if (this_priority < 0) begin
           if (parent_sequence == null) this_priority = 100;
    

    完整源码 · SHA256:aedbad6d9991d5712dd8e5e676a9fb5487ab33af52219ae4786e6adaa7001375

    术语解释 · 兼容配置

    返回Sequence / Sequencer · 迁移清单

    版本适用范围