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才开始发送;

 

 

 

 

 

 

 

 

 

 

posted on   知北游。。  阅读(413)  评论(0编辑  收藏  举报

编辑推荐:
· .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吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示