首页 > 系统相关 >uvm_event的变量传递+查看软链接的指向+grep只打印匹配的数据+并行进程的串行化--构建进程池+UVM动态复位问题+VIP动态复位注意事项

uvm_event的变量传递+查看软链接的指向+grep只打印匹配的数据+并行进程的串行化--构建进程池+UVM动态复位问题+VIP动态复位注意事项

时间:2024-10-15 20:45:35浏览次数:8  
标签:reset process 复位 phase uvm 进程 动态 class

uvm_event的变量传递

uvm_event可以传递变量,但是变量需要为uvm_object类型,对于package,建议类型向下转换,直接传递uvm_object,并在另一端解析
https://www.edaplayground.com/x/RhYc

module testbench;
  class class1 extends uvm_object;
    `uvm_object_utils(class1)

    int a;
    function new(string name = "class1");
      super.new(name);
    endfunction
  endclass


  initial begin
    class1 copy;
    uvm_event event1;
    
    event1=uvm_event_pool::get_global("event000");

    copy = class1::type_id::create("copy");
    copy.a = 10;
    
    #1;
    event1.trigger(copy);
    $display("start trigger");
  end

  initial begin
    class1 copy;
    uvm_object copy1;
    uvm_event event1;
    
    event1=uvm_event_pool::get_global("event000");
    $display("start wait");
    event1.wait_trigger_data(copy1);
    $cast(copy, copy1);
    $display("get a %0d", copy.a);
  end


  initial begin
    #10;
  end

endmodule

输出:

start wait
start trigger
get a 10

查看软链接的指向

使用readlink命令,-f 选项可以递归跟随给出文件名的所有符号链接

readlink /usr/bin/awk ----> 其实这个还是一个符号连接

grep只打印匹配的数据

使用-o命令

grep -o 按照正则表达式只打印匹配的数据
grep -o 'sh[0-9]\{6\}' infile
grep -o 'sz[0-9]\{6\}' infile

并行进程的串行化--构建进程池

注意中途引入了变量k,该变量k替换了变量i,使得数字真正递增,直接使用变量i,,将导致每个进程中的a的值变成10,且进程池中没有信息。
刚创建完毕后,进程打印的结果队列是空的,等到队列启动后,进程队列才有数据。
随后将所有进程队列挂起,逐个恢复进程,等进程执行完毕后再执行下一个进程。

module testbench();
  
  class a;
    function new();
    endfunction
    
    process proc_queue[10];  


    task  start();
      int i;
      int a;
      for(i = 0; i< 10; i ++) begin
        int k = i; 
        fork begin
          proc_queue[k] = process::self();
          #10;
          a = k; 
          $display("%0d", a); 
          $display("time %t", $time);
        end join_none
      end
      
      $display("qqqq %p", proc_queue);
      for (i = 0; i < 10; i ++)
        wait( proc_queue[i] != null );
      for (i = 0; i < 10; i ++)
        proc_queue[i].suspend();
      $display("qqqq %p", proc_queue);
      for(i = 0; i< 10; i ++) begin
        proc_queue[i].resume();
        proc_queue[i].await();
      end
    endtask

  endclass
  


initial begin
  a xx= new();
  xx.start();
  #30;
  
end

endmodule

输出结果:

qqqq '{null, null, null, null, null, null, null, null, null, null}
qqqq '{{ ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}, { ref to class process}}
0
time                   10
1
time                   20
2
time                   30
3
time                   40
4
time                   50
5
time                   60
6
time                   70
7
time                   80
8
time                   90
9
time                  100

UVM动态复位问题

  1. a wait_for_grant on sequencer for sequence has been killed
    原因:存在item位于driver的仲裁队列中未被清除
    处理:对于支持动态复位的VIP,跳入reset_phase后,立刻调用seqr.stop_sequences()将item从driver队列中删掉。防止item的存在。
    https://blog.csdn.net/qiuzhongyu123/article/details/121498199

  2. Item_done() called with no outstanding requests. Each call to item_done() must be paired with a previous call to get_next_item()
    原因:对于支持动态复位的vip,其driver的驱动过程在main_phase中,直接从main_phase跳转到reset_phase的时候,其driver中的item_done未执行,而又开始了新的事务。

处理:在复位信号拉动以后跳转到reset_phase,然后在reset_phase中需要立刻调用stop_sequences。对于不支持动态复位的VIP,跳入reset_phase后,需要延时,等到item被处理完毕,整个队列中没有数据,再象征性执行stop_sequences。

最后,在reset_phase中取消复位。执行后续的phase。
https://verificationacademy.com/forums/t/doing-x-stop-sequences-is-causing-this-uvm-fatal-item-done-called-with-no-outstanding-requests-each-call-to-item-done-must-be-paired-with-a-previous-call-to-get-next-item/38457

VIP动态复位注意事项

  1. AXI的VIP配置,有两种方式,默认会补发,如有需要,改成全部清空
    svt_axi_port_configuration::reset_type = EXCLUDE_UNSTARTED_XACT (default value)
    复位将终止事务,而已经存在于driver中的事务被暂停,等到复位取消后继续发送
    svt_axi_port_configuration::reset_type reset_type = RESET_ALL_XACT
    复位将终止事务,而已经存在于driver中的事务被清空,等到复位取消后继续发送

  2. APB-VIP的复位
    需要在base_test中调用其reset方法,否则在中途动态复位,可能报告意料之外的问题

task reset_phase(uvm_phase phase);
    phase.raise_objection(this, "Resetting regmodel");
    regmodel.reset();
    phase.drop_objection(this);
endtask
  1. AXI stream的复位特性
    有些VIP是不支持动态复位的,但是仍然需要调试出复位的场景,则需要手动实现复位。
    不支持动态复位,可能意味着其driver使用run_phase而不是main_phase,并不会实现phase跳转。
    因此,在复位的时候,需要跳转到reset_phase后,等待一段时间,保证其item_done执行结束,再开始执行诸如stop_sequences的函数。

标签:reset,process,复位,phase,uvm,进程,动态,class
From: https://www.cnblogs.com/bai2022/p/18468400

相关文章

  • 【Linux】Linux进程状态与进程优先级
    1.前置知识1.1.并行与并发并发:表示CPU在同⼀个时间内执⾏多个任务并⾏:表示多个CPU在同⼀个时间内执⾏各⾃的任务示意图如下:1.2.时间片时间⽚(timeslice),⼜称为“量⼦(quantum)”或“处理器⽚(processorslice)”,是分时操作系统分配给每个正在运⾏的进程微观上的⼀段CPU时间(在......
  • 国内动态ip代理哪几个好?超详细的选择指南
    国内动态IP代理的选择指南在当今互联网的世界中,动态IP代理已成为许多企业和个人在进行数据采集、网络爬虫以及电商运营时的重要工具。它不仅能够有效保护用户的隐私,还能帮助用户获取更为丰富的数据资源。那么,国内有哪些优秀的动态IP代理服务值得关注呢?接下来,我们将从几个方面......
  • leetcode 刷题day43动态规划Part12(115.不同的子序列、583. 两个字符串的删除操作、72.
    115.不同的子序列思路:这个题还是比较有难度的,问题s中有多少个t子序列可以转化为s字符串中有多少删除元素的方式,使s可以变成t。考虑动规五部曲。1、确定dp数组(dptable)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2、确定递推公式......
  • leetcode 刷题day42动态规划Part11(1143.最长公共子序列、1035.不相交的线、53. 最大子
    1143.最长公共子序列思路:718.最长重复子数组两个数组对应相同且连续,所以递推公式是dp[i-1][j-1]+1。最长公共子序列不要求连续但要求相对顺序,差别主要在于递推公式。对于该题主要有两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同。如果te......
  • 【C语言】动态内存管理及相关笔试题
    文章目录一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用三、calloc和realloc1.calloc函数的使用2.realloc函数的使用四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3六、总结C/C++中程序内存区域划分一、为什么有动态......
  • 【VUE】Vue中动态组件
    component动态组件(DynamicComponents)可以通过is属性切换不同的组件,从而实现动态渲染的效果。常用于实现Tab切换效果、配合使用keep-alive来缓存组件。动态组件的作用Vue中的动态组件可以帮助我们轻松地实现以下几个功能:实现按需加载:当页面中存在多个组件时,我们可......
  • 进程间通信--整理总结
    前言:进程间通信(IPC,Interprocesscommunication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间......
  • 【Linux阅览室】进程控制
     学习编程就得循环渐进,扎实基础,勿在浮沙筑高台   循环渐进Forward-CSDN博客目录 循环渐进Forward-CSDN博客进程创建fork函数初识fork函数返回值写时拷贝fork常规用法fork调用失败的原因进程终止进程常见退出方法_exit函数exit函数return退出进程等待进......
  • DBPM: 增强时间序列对比学习:一种动态坏对挖掘方法《Towards Enhancing Time Series Co
    今天是2024年10月12日,思路枯竭,还是论文看的太少了,继续看论文.论文:TowardsEnhancingTimeSeriesContrastiveLearning:ADynamicBadPairMiningApproach或者是:TowardsEnhancingTimeSeriesContrastiveLearning:ADynamicBadPairMiningApproachGitHub:https://git......
  • python画图|三维动态柱状图绘制
    【1】引言前序已经学习了二维动态柱状图绘制教程,本次尝试探索三维动态柱状图绘制教程:【2】项目设计三维和二维的不同,要在一开始就定义。二维的定义简单粗暴,只需要一行代码:fig,ax=plt.subplots()#定义要画图到了三维则需要两行,一行说要画三维图,一行说这个图使用哪......