跳转至

输入查询内容

    本页内容

    kill 阻塞 get 进程后,FIFO 的 can_get() 恢复

    影响范围

    阻塞 get 的进程可能被 kill,或保留旧僵尸计数补偿。

    具体差异

    1.2 用 int m_pending_blocked_gets 计数,阻塞在 get() 的进程若被 kill,计数永久泄漏 → can_get() 恒返回 0、flush() 误报。2.0 改为 bit m_pending_blocked_gets[process](或 process_container_c,受 UVM_USE_PROCESS_CONTAINER 控制),can_get()/flush() 先调用 m_clear_zombie_gets() 剔除已 KILLED 进程。净效果:杀死阻塞 get 进程后 FIFO 恢复正常——属修复,但依赖旧(错误)行为的测试需调整。

    修改方案

    先在实际阻塞 get 被 kill 的流程验证后续 can_get/get 能恢复,再移除针对旧计数泄漏的补偿;FIFO 清场另按 M08-001 验证,不能由本条推断 flush 已无风险。

    兼容措施与范围:阻塞 get 恢复使用目标原生实现,无需兼容开关;旧补偿仅在实际流程通过后移除,flush 风险另验。

    迁移后验证

    kill 阻塞 get 后 put 新事务,检查 can_get 及后续 get 可完成;仅在此实际场景验证通过后移除旧补偿。

    记录本条结果M08-005 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    按“影响范围”检视实际代码与配置,再执行本条验证方法;扫描零命中不能排除此项。

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

    源码与标准依据

    核查方式:源码与实测核对。实测仅覆盖本条所列场景。

    VCS 内置 UVM-1.2uvm_tlm_fifos.svh:52(int 计数器)、uvm_tlm_fifos.svh:158(can_get)

    VCS 内置 uvm-ieee-2020-2.0uvm_tlm_fifos.svh:57(按 process 的关联数组)、uvm_tlm_fifos.svh:168(m_clear_zombie_gets)、uvm_tlm_fifos.svh:185(can_get)

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

    src/vcs-uvm-1.2/tlm1/uvm_tlm_fifos.svh
      local mailbox #( T ) m;
      local int m_size;
      protected int m_pending_blocked_gets;
    
    
      // Function: new
      //
      // The ~name~ and ~parent~ are the normal uvm_component constructor arguments. 
      // The ~parent~ should be ~null~ if the <uvm_tlm_fifo#(T)> is going to be used in a
      // statically elaborated construct (e.g., a module). The ~size~ indicates the
      // maximum size of the FIFO; a value of zero indicates no upper bound.
    
      function new(string name, uvm_component parent = null, int size = 1);
        super.new(name, parent);
        m = new( size );
        m_size = size;
      endfunction
    

    src/vcs-uvm-1.2/tlm1/uvm_tlm_fifos.svh
        return m_size == 0 || m.num() < m_size;
      endfunction  
    
      virtual function bit can_get();
        return m.num() > 0 && m_pending_blocked_gets == 0;
      endfunction
    
      virtual function bit can_peek();
        return m.num() > 0;
      endfunction
    
    
      // Function: flush
      //
      // Removes all entries from the FIFO, after which <used> returns 0
      // and <is_empty> returns 1.
    
      virtual function void flush();
        T t;
    

    完整源码 · SHA256:f4de9fa81bff8301401a46a2b108a88d767dab7f5a78a4d0e0f2ed0ecd63020e

    src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifos.svh
      local mailbox #( T ) m;
      local int m_size;
     `ifndef UVM_USE_PROCESS_CONTAINER 
      protected bit m_pending_blocked_gets[process];
     `else
      protected bit m_pending_blocked_gets[process_container_c];
     `endif 
    
    
      // Function -- NODOCS -- new
      //
      // The ~name~ and ~parent~ are the normal uvm_component constructor arguments. 
      // The ~parent~ should be ~null~ if the <uvm_tlm_fifo#(T)> is going to be used in a
      // statically elaborated construct (e.g., a module). The ~size~ indicates the
      // maximum size of the FIFO; a value of zero indicates no upper bound.
    
      function new(string name, uvm_component parent = null, int size = 1);
        super.new(name, parent);
        m = new( size );
    

    src/vcs-uvm-ieee-2020-2.0/tlm1/uvm_tlm_fifos.svh
      endfunction  
    
      // undocumented function for clearing zombie gets
      protected function void m_clear_zombie_gets();
      `ifndef UVM_USE_PROCESS_CONTAINER
        process zombie_gets[$];
      `else
        process_container_c zombie_gets[$];
      `endif  
        foreach (m_pending_blocked_gets[i])
        `ifndef UVM_USE_PROCESS_CONTAINER
          if (i.status() == process::KILLED)
        `else
          if (i.p.status() == process::KILLED)
        `endif        
            zombie_gets.push_back(i);
        foreach (zombie_gets[i])
          m_pending_blocked_gets.delete(zombie_gets[i]);
      endfunction : m_clear_zombie_gets
    
      virtual function bit can_get();
        m_clear_zombie_gets();
        return m.num() > 0 && m_pending_blocked_gets.size() == 0;
      endfunction
    
      virtual function bit can_peek();
        return m.num() > 0;
      endfunction
    
    
      // Function -- NODOCS -- flush
      //
      // Removes all entries from the FIFO, after which <used> returns 0
      // and <is_empty> returns 1.
    
      virtual function void flush();
    

    完整源码 · SHA256:fe915359c5e25996ddb3cf93580e80d18a4d39ff0f290ab5c69c386a1ff5bef6

    术语解释 · 兼容配置

    uvm_tlm_fifo::flush() 不再向 get_ap 广播(M08-001)

    返回TLM · 迁移清单

    版本适用范围