System verilog 基本UVM序列模拟查询

System verilog 基本UVM序列模拟查询,system-verilog,uvm,System Verilog,Uvm,我有几个关于基于UVM的基本结核病的问题,我正在尝试了解其序列及其工作原理 在响应项中更新bvalid时,驱动程序中始终选择bvalid为0 最近两个事务的两条错误消息(#UVM_error@18:UVM_test_top.axi_agent1.axi_base_seqr1@@axi_base_seq1[UVM_test_top.axi_agent1.axi_base_seqr1.axi_base_seq1]响应队列溢出,响应已丢弃) 这里是EDA操场上编译代码的链接 对我遗漏的东西有什么建议

我有几个关于基于UVM的基本结核病的问题,我正在尝试了解其序列及其工作原理

  • 在响应项中更新bvalid时,驱动程序中始终选择bvalid为0
  • 最近两个事务的两条错误消息(#UVM_error@18:UVM_test_top.axi_agent1.axi_base_seqr1@@axi_base_seq1[UVM_test_top.axi_agent1.axi_base_seqr1.axi_base_seq1]响应队列溢出,响应已丢弃)
  • 这里是EDA操场上编译代码的链接

    对我遗漏的东西有什么建议吗

    谢谢


    venkstart

    查看$urandom\u范围的规范后,它将签名显示为:
    函数int unsigned$urandom\u范围(int unsigned maxval,int unsigned minval=0)
    。将您的呼叫更改为
    $uradom\u range(1,0)
    ,它应该可以工作


    第二个错误来自这样一个事实,即您正在发送来自驱动程序的响应,而没有按照您的顺序接收它们。这是执行此操作的行:
    seq_item_port.item_done(axi_item_driv_src)。只需执行
    seq_item_port.item_done()
    (不发送响应)或在
    finish\u item()
    之后在序列中调用
    get\u response()
    。我通常会更新原始请求的字段,然后调用
    item\u done()
    。例如,如果我启动一个读取事务,在我的驱动程序中,我将驱动控制信号并等待DUT响应,用我从DUT获得的数据更新请求的
    数据
    字段,并在我的驱动程序中调用
    项_done()
    ,将请求标记为完成。这样,如果我在序列中需要这些数据(例如,约束将来的某个项目),我就有了。

    谢谢Tudor的解释。还有一个问题是,为什么只有在大约8个TXN之后才会出现错误??如果序列没有拾取响应,我应该从一开始就看到它?@venkstart,因为序列器不知道何时调用
    get\u response()
    ,它将未完成的响应存储在队列中。当队列变得太大时,它开始触发错误。这意味着它只会在队列满时才开始给出错误(在UVM中,每个默认值可能设置8-ish,但我认为您也可以更改此数字)。@TudorTimi您是否尝试过
    get\u response()
    中的
    fork-join\u none
    中的非阻塞序列?我尝试过这样的场景,但是
    get\u response()
    始终处于阻塞状态。这种方法是否存在固有的问题?我的问题,谢谢。