0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何配置sequence的仲裁算法和优先级

工程师邓生 来源:芯片学堂 作者:JKZHAN 2022-09-14 15:59 次阅读

本文依然是比较多的干货,也偏保姆级,介绍Sequence之间发生竞争的时候,我们需要或者说可以做些什么,包括如何配置sequence的仲裁算法和优先级、如何让sequence占用sequencer(这个地方UVM 1.2有个bug),以及如何中断sequence的执行。

01 Arbitrary

在UVM中,多个sequence可以同时被绑定到相同的sequencer并启动。这种测试场景在实际中是存在的,比如在模拟同一个总线master口上的不同类型的数据流时,可以将符合这些不同类型的数据流的sequence绑定到同一个sequencer,并启动它们,以构造出复杂的测试场景。

de6945ca-304c-11ed-ba43-dac502259ad0.png

这样一来,在验证环境运行中就会出现竞争的问题,当多个sequence同时企图向下游发transaction的时候,sequencer需要能够决定处理这些transaction的顺序。而给出答案的,是sequencer内建的仲裁机制。

下面给出一个简单的UVM例程:例程同时启动三个sequence(seq_0, seq_1, seq_2),它们会往同一个sequencer发transaction,并且在启动的时候还分配了权重值(start方法的第三个参数),每个sequence会循环发送4个transaction。在Env中例化sequencer和driver,并完成连接。例程中在driver拿到transaction之后,会根据transaction的成员变量id和index打印出来当前transaction产生自哪个sequence,以及是循环的第几次。

dea60456-304c-11ed-ba43-dac502259ad0.png

仿真结果如下,可以看得出来在没有配置仲裁算法的情况下,即使我们为sequence都分配了权重值,sequencer对三个sequence还是“雨露均沾”:

df1c1cb8-304c-11ed-ba43-dac502259ad0.png 实际上,UVM给我们预设了六种仲裁算法供选择,同时保留了用户自定义的接口。默认情况下,使用的仲裁算法是UVM_SEQ_ARB_FIFO,严格按照先进先出的原则来做选择,所以才会出现上面说的,仿真结果跟权重值没有关系。关于仲裁算法,需要根据实际测试场景来做出选择。

df941862-304c-11ed-ba43-dac502259ad0.png

那么如何配置仲裁算法?在代码中,可以通过调用sequencer的方法set_arbitration()来对仲裁算法进行配置。比如在上面例程env_demo类的build_phase函数的最后一行,可以加上sqr.set_arbitration(UVM_SEQ_ARB_WEIGHTED)来配置仲裁算法,仿真结果我贴在下面,可以看到,我们分配的权重值开始起作用了:

dfcb7460-304c-11ed-ba43-dac502259ad0.png

02 LockingMechanism

Locking mechanism指的是sequence对sequencer的占用,sequence可以优先获得sequencer的使用权限,并且在它自己释放之前,其他sequence无法通过该sequencer和driver发送transaction。

Sequence抢占功能同样来源于测试场景的需求,应用于当有某个sequence需要优先并独占sequencer的时候,比如对中断(interrupt)的处理。如下图所示,当sequence_2占用了sequencer之后,其他sequence在sequence_2释放之前将无法联系上sequencer。

e0119ec2-304c-11ed-ba43-dac502259ad0.png

UVM提供了两种抢占方法:lock和grab。lock方式会等待仲裁机制正常调度到该sequence(即将请求放在仲裁队里的最后),并占用该sequencer直到sequence调用unlock()来解锁;grab方式则会使该sequence在下一轮仲裁中被执行(即将请求放在仲裁队列的最前面),并占用该sequencer直到sequence调用unlock()和ungrab()。

Sequencer被某个sequence抢占了之后,我们可以通过调用它的成员方法来获取当前的状态信息。比如,可以在sequence的body()里面使用m_sequencer.is_grabbed()函数来看当前sequencer是不是被谁锁住了;还可以使用m_sequencer.current_grabber()函数来获得当前锁住sequencer的sequence句柄;还有其他函数可以使用,具体可以参考UVM的手册。

e032c20a-304c-11ed-ba43-dac502259ad0.png

关于lock和grab的使用在其他地方有很多示例代码,这里将基于上面的例程,展示UVM 1.2潜藏的一个bug。先在上述代码中seq_demo_0类的body()任务的入口和出口处,分别加上lock()和unlock(),如上图所示,然后进行仿真,就会发现:最终只有seq_0抢先锁住了sequencer,虽然我们在body()的最后调用了unlock(),但是seq_1和seq_2在seq_0结束之后依然抢不到锁,仿真最后结束在UVM timeout,如下图:

e0640036-304c-11ed-ba43-dac502259ad0.png

这是一个UVM的bug,问题的根源在uvm_sequencer_base的源码中,当有多个sequence在lock_list队列里面时,调用m_wait_for_available_sequence()方法获取sequence句柄会使代码挂死。该UVM issue已经有人提交到了accellera,具体可以参见参考资料2。这个bug在UVM 2017-1.1或者UVM 2020中可能已经修掉了,有兴趣的读者可以自己试一下。鉴于目前有很多代码是基于UVM 1.2构建的,用户在使用lock/grab的时候需要特别注意这个bug。

03Sequence Interrupt

处理器等数字系统中,通常硬件中断都是由某个信号脉冲或者电平来触发,并通过中断控制仲裁之后,由控制器发送给处理器进行处理。

在Sequence中的中断操作也类似,分两部分实现:第一部分是将通过虚拟接口监视中断源信号的变化,以实现软硬件的隔离;第二部分是在主sequence中发起一个监视进程(monitor process),在等到中断到来之后启动用作中断处理的sequence。

e09c3a0a-304c-11ed-ba43-dac502259ad0.png

另外,Sequence一旦被启动,通常不会去想着将它异常结束(通过seq.kill()或者seqr.stop_sequences()调用),否则我们需要更加复杂的实现去查看当前driver是否空闲,以确保sequencer跟driver的握手机制不出问题。如果有必要将sequence提前结束,建议在sequence内部去做条件判断和处理。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    900

    浏览量

    41839
  • UVM
    UVM
    +关注

    关注

    0

    文章

    182

    浏览量

    19240
  • FIFO芯片
    +关注

    关注

    0

    文章

    10

    浏览量

    8865

原文标题:SystemVerilog | UVM | Sequence的仲裁和锁定,还有要避开UVM的bug

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    freertos中断优先级在哪设置

    FreeRTOS是一个流行的实时操作系统,它广泛应用于嵌入式系统开发。在FreeRTOS中,中断优先级是一个重要的概念,因为它决定了中断处理的顺序和响应时间。 1. 理解中断优先级 在讨论如何设置
    的头像 发表于 09-02 14:17 809次阅读

    APS智能优化排产软件的优先级应用

    资源、订单需求和约束条件,自动计算出最优的生产计划。在这个过程中,订单排产的优先规则起着至关重要的作用。1.交期优先级交期优先级是订单排产中最基本的优先规则。根据
    的头像 发表于 06-26 17:43 466次阅读
    APS智能优化排产软件的<b class='flag-5'>优先级</b>应用

    ESP32S2如何设置中断优先级

    ESP32S2有六中断, 如何设置中断优先级? 比如在GPIO例程里 ,这种中断优先级是如何设置的呢? 中断寄存器列表里 ,只有简称,哪里能获取这个名称所对应的功能??
    发表于 06-21 07:59

    请问有什么方法降低WIFI中断的优先级

    因为项目对时序输出要求比较严格,WIFI中断优先级比硬件定时器中断优先级要高,在定时器中断里面对GPIO管脚控制被延长执行,请问有什么方法降低WIFI中断的优先级
    发表于 06-19 07:37

    如何在不同优先级安装相同的处理程序?

    在不同的优先级中安装相同的处理程序? 我需要一个解决方案,在不同的优先级中安装相同的处理程序(ISR),以便在我的项目中处理 CAT2 中断,但我不能上传项目,因为我签署了 NDA。
    发表于 05-28 08:13

    systick的中断优先级是否应该设置为最高优先级的嵌套中断?

    最近在学习ucosii有这样一个疑问,关于stm32的systick作为ucosii的基准时钟,systick的中断优先级是否应该设置为最高优先级的嵌套中断。理由是什么?各位大侠求指教!!!
    发表于 05-16 06:44

    stm32的中断优先级分组了之后还能改分组吗?

    如标题所示,stm32的中断优先级分组了之后还能改分组吗? 比如我要使用外部中断EXIT2,3,我在配置的时候配置优先级分组2组,然后配置
    发表于 05-13 08:40

    创建了两个task如果一个优先级高 一个优先级低,高优先级的那个一直在做,什么时候会调度到低优先级的呢?

    创建了两个task如果一个优先级高一个优先级低, 我看到任务的函数都是用死循环做的,那个高优先级的那个一直在做,什么时候会调度到低优先级的呢?
    发表于 05-13 07:13

    STM8中断优先级不够怎么解决?

    STM8L 中,中断优先级通过下面函数设置,但此处仅 ITC_PriorityLevel_1,ITC_PriorityLevel_2,ITC_PriorityLevel_3总共才3个中断优先级可设
    发表于 05-06 06:54

    嵌入式实时操作系统中的优先级反转问题

    死锁预防是实时系统设计中的一个重要因素。不幸的是,即使使用安全排除技术,这可能也不是困难的终点。在解决资源争用问题时,可能引入新的优先级翻转问题。
    发表于 04-26 15:47 531次阅读
    嵌入式实时操作系统中的<b class='flag-5'>优先级</b>反转问题

    求助,关于stm32F4中断优先级0无法抢占的问题求解

    使用F407遇到一个抢占优先级的问题: 现设置优先级分组 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);也就是15个优先级分组。按照手册说明0
    发表于 04-23 07:26

    关于stm32cube中freertos的优先级设置问题求解

    在用stm32cube中freertos,在配置界面里设置为12任务优先级,但是在cube中配置每个任务优先级时还是只能选择7种
    发表于 04-22 07:25

    STM32F103的寄存器NVIC_IPRx抢占优先级和子优先级是怎么设置的?

    STM32F103的寄存器NVIC_IPRx有些不明白,抢占优先级和子优先级是怎么设置的? 如果,中断分组2,抢占优先级3,子优先级3 那下面这样写对吗? SCB->AIR
    发表于 03-27 07:48

    Hightec对芯片中断优先级分配时,中断号越高中断优先级越高吗?

    请问大佬,Hightec对芯片中断优先级分配时,中断号越高中断优先级越高吗?看网上的帖子说中断号越低优先级越高。
    发表于 02-27 06:13

    RTTnano的用户main函数中的优先级是多少?

    RTTnano 的用户main函数中的优先级是多少?为什么会出现创建新的task之后,main函数会抢占掉低优先级的task,例如RT_THREAD_PRIORITY_MAX设置为8 ,低于3
    发表于 02-26 08:01