uvm sequence仲裁和优先级

1.设置transaction或者sequence的优先级,

`uvm_do_pri(m_trans,100)

`uvm_do_pri_with(m_trans,200,{m_trans.pload.size<50;})

这两种方式优先级就是上面较高,但是需要注意要设置仲裁算法,通过

env.i_agt.sqr.set_artbitration(SEQ_ARB_STRICT_FIFO);等方式设置仲裁算法,保证,高优先级的sequence发送完毕后再发送低优先级sequence。

2.sequencerd lock与grab

repeat(3) begin

        `uvm_do_with(m_trans,{m_trans.pload.size<50;})

end

lock();

repeat(5) begin

        `uvm_do_with(m_trans,{m_trans.pload.size<50;})

end

unlock();

执行到lock语句时,会独占sequencer,直到unlock.

类似的,grab也可以这么做,与lock的区别就是,grab更强势,lock会等待仲裁队列里的请求全部执行完毕,而,grab会直接插到最前面一个,但是grab并不会打断正在进行的sequence。

repeat(3) begin

        `uvm_do_with(m_trans,{m_trans.pload.size<50;})

end

grab();

repeat(5) begin

        `uvm_do_with(m_trans,{m_trans.pload.size<50;})

end

ungrab();

3.通过is_relevant函数使sequence失效,sequencer仲裁时会查看sequence的is_relevant函数,返回为1时,sequence有效,否则无效,因此可以重载is_relevant来使sequence失效,通常is_relevant函数里要实现一个让sequence无效的条件,但是注意,当sequencer发送完所有sequence后,会调用有is_relevant的sequence里的wait_for_relevant,如果没有则会报错。所以要么,在所有sequence发送完之前就主动让is_relevant返回1,要么一定要有wait_for_relevant函数把无效的条件再恢复有效。

virtual function bit is_relevant();
    if((num>=3)&&(!has_delayed)) return 0;
    else return 1;
endfucntion
virtual task wait_for_relevant();
    #10000;
    has_delayed = 1;
endtask

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值