6.3seqr&driver-seqr的仲裁(sequence的仲裁问题)
1.seqr的仲裁
(1) 当有多个sequence同时在一个sequencer上启动时,所有的sequence都参与仲裁,根据算法决定哪个sequence发送transaction.仲裁算法由sequencer决定.
(2) sequencer在仲裁时,会查看sequence的is_relevant函数的结果.如果为1,则sequence有效,参与仲裁;如果为0,则sequence无效,表示sequence主动放弃sequencer的使用权(可以通过重载is_relevant函数使sequence失效,使sequence主动放弃控制权).
注1:通过lock任务和grab任务,sequence可以独占sequencer,强行使sequencer发送自己产生的transaction;
注2:sequence也可以通过控制is_relevant函数实现在一定时间内不参与仲裁,主动放弃sequencer的控制权;
(3) 如果sequencer发现其上启动的所有sequence都无效(即is_relevant的返回值均为0), sequencer就会调用wait_for_relevant函数并等待sequence变有效. wait_for_relevant函数中,必须将使sequence无效的条件清除,不然系统会处于sequencer循环调用wait_for_relevant的死循环状态.
注1:sequence的失效是自己控制的,但是重新有效却受其他sequence控制;当其他sequence的transaction发送完毕后,sequencer发现失效sequence无效,会调用其wait_for_relevant;如果其他sequence用于不结束,那么失效sequence将永远处于失效状态;
(4) is_relevant与wait_for_relevant函数应成对重载,不能只重载其中一个;在wait_for_relevant中,必须使sequence无效的条件清除,否则系统将处于死循环的状态;
(5) 通过lock与grab操作, sequence可以独占sequencer.
2.seqr的仲裁所考虑的因素
2.1 transaction的优先级(会受sequencer仲裁算法影响)
(1)对于transaction来说,存在优先级的概念,优先级越高越容易被选中.
(2)当使用uvm_do或uvm_do_with宏时,产生的transaction的优先级是默认的优先级,即-1.
(3)可以通过uvm_do_pri或uvm_do_pri_with改变所产生transaction的优先级(第二个参数是优先级,该值需要是大于-1的整数;数字越大,优先级越高;);
注1:由于sequence1中transaction的优先级较高,所以按照预期,先选择sequence1产生的transaction; 当sequence1的transaction全部生成完毕后,再产生sequence0的transaction; 但事实并不如预期那样!!!这是因为sequencer的仲裁算法有很多种,默认情况下,sequencer的仲裁算法是SEQ_ARB_FIFO,它会严格遵循先入先出的顺序,而不会考虑优先级;
2.2 sequence的优先级
(1) sequence的优先级可以在启动时指定.对sequence设置优先级的本质是设置其内产生的transaction的优先级.
(2)seq.start的函数的第一个参数为sequencer,第二个参数是parent sequence,可以设置为null; 第三个参数是优先级;
注1:运行上图中代码,会发现sequence1中transaction完全发送完后,才发送sequence0中的transaction;
2.3 sequencer的仲裁算法(可以通过seqr的set_arbitration选择一种仲裁算法)
(1) SEQ_ARB_FIFO:严格遵循先入先出顺序,而不考虑优先级;
(2) SEQ_ARB_WEIGHTED:加权的仲裁;
(3) SEQ_ARB_RANDOM:完全随机选择;
(4) SEQ_ARB_STRICT_FIFO:严格按照优先级,当有多个同一优先级的sequence时,按照先入先出的顺序原则;
(5) SEQ_ARB_STRICT_RANDOM:严格按照优先级,当有多个同一优先级的sequence时,随机从最高优先级中选择;
(6) SEQ_ARB_USER:用户自定义的仲裁算法;这种模式下,必须覆盖uvm_sequencer的user_priority_arbitartion()方法;该方法的输入参数是sequencer的sequence_item queue,user实现一个返回值为整数的方法,从sequencer的sequence_item queue中挑选一个sequence_item;
注1:上图中设置sequencer的仲裁算法为SEQ_ARB_STRICT_FIFO后,会发现直到sequence1发送完transaction后,sequence0才开始发送;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?