跳转至

输入查询内容

    本页内容

    启用 deprecated 开关后验证旧 sequence 宏

    环境:VCS W-2024.09-SP2-8。1.2 使用 uvm-1.2,2.0 使用 uvm-ieee-2020-2.0

    实验检查观察值是否符合预期;成功复现问题不代表问题已修复。

    结果对比

    本组配置:UVM_ENABLE_DEPRECATED_API · REVIEW_DEPRECATED

    观察内容 UVM 2.0
    普通请求前授予的 lock 数 leading_locks 1
    普通请求后的 lock 授予记录 lock_after_request 1
    调用旧响应报告开关后,报告被禁用(1=是) response_disabled 1
    宏生成的请求字段值(本例约束为 42) macro_constraint 42
    宏传递的优先级 macro_priority 37
    宏使用预期 sequencer(1=是) macro_sequencer 1
    宏生成的请求保持 parent 关联(1=是) macro_parent 1

    运行命令

    目录与环境准备;从解包根目录执行:

    uv run tools/run_uvm_review.py --case sequence_probe --variants 20 --define UVM_ENABLE_DEPRECATED_API --define REVIEW_DEPRECATED
    

    最小源码

    sequence_probe.sv

    sequence_probe.sv
    `timescale 1ns/1ps
    `include "uvm_macros.svh"
    import uvm_pkg::*;
    
    class macro_item extends uvm_sequence_item;
      rand int value;
      `uvm_object_utils(macro_item)
      function new(string name="macro_item"); super.new(name); endfunction
    endclass
    
    class macro_sequence extends uvm_sequence#(macro_item);
      `uvm_object_utils(macro_sequence)
      function new(string name="macro_sequence"); super.new(name); endfunction
      task body();
    `ifdef REVIEW_UVM20
    `ifdef REVIEW_DEPRECATED
        `uvm_do_on_pri_with(req, m_sequencer, 37, { value == 42; })
    `else
        `uvm_do(req, m_sequencer, 37, { value == 42; })
    `endif
    `else
        `uvm_do_on_pri_with(req, m_sequencer, 37, { value == 42; })
    `endif
      endtask
    endclass
    
    class observing_sequencer extends uvm_sequencer#(macro_item);
      int observed_priority;
      function new(string name, uvm_component parent); super.new(name, parent); endfunction
      virtual task wait_for_grant(uvm_sequence_base sequence_ptr,
                                 int item_priority = -1, bit lock_request = 0);
        observed_priority = item_priority;
        super.wait_for_grant(sequence_ptr, item_priority, lock_request);
      endtask
    
      // Supply a deterministic queue to the real protected lock-grant algorithm.
      function int lock_probe(bit request_first, uvm_sequence_base a, uvm_sequence_base b);
        uvm_sequence_request r;
        arb_sequence_q.delete();
        lock_list.delete();
        for (int i=0; i<2; i++) begin
          r = new();
          r.request_id = 9000+i;
          r.process_id = process::self();
          r.sequence_ptr = i == 0 ? a : b;
          r.request = request_first && i==0 ? SEQ_TYPE_REQ : SEQ_TYPE_LOCK;
          arb_sequence_q.push_back(r);
        end
        grant_queued_locks();
        lock_probe = lock_list.size();
        arb_sequence_q.delete();
        lock_list.delete();
      endfunction
    endclass
    
    module sequence_probe;
      initial begin
        macro_sequence seq_a = new("a"), seq_b = new("b");
        observing_sequencer sqr = new("sqr", null);
        macro_item received;
        int value;
        $display("REVIEW|leading_locks|%0d", sqr.lock_probe(0, seq_a, seq_b));
        $display("REVIEW|lock_after_request|%0d", sqr.lock_probe(1, seq_a, seq_b));
        seq_a.set_response_queue_error_report_disabled(1);
        $display("REVIEW|response_disabled|%0d", seq_a.get_response_queue_error_report_disabled());
        fork
          seq_a.start(sqr);
          begin
            sqr.get_next_item(received);
            value = received.value;
            sqr.item_done();
          end
        join
        $display("REVIEW|macro_constraint|%0d", value);
        $display("REVIEW|macro_priority|%0d", sqr.observed_priority);
        $display("REVIEW|macro_sequencer|%0d", received.get_sequencer() == sqr);
        $display("REVIEW|macro_parent|%0d", received.get_parent_sequence() == seq_a);
        $display("REVIEW|done|1");
        $finish;
      end
      initial begin #100; $fatal(1, "sequence probe timeout"); end
    endmodule
    

    全部用例 · 证据摘要

    版本适用范围