System verilog 在记分板中协调检查

System verilog 在记分板中协调检查,system-verilog,uvm,System Verilog,Uvm,我在解决代码中的一个问题时遇到了一些问题,希望您能帮助我 我有两个模块,A和B。模块A向B发出请求,并在若干周期后B向A发送多周期响应A最多可以容纳8个等待响应的请求,而B的响应不一定按顺序返回。这就是为什么我们使用ID来识别返回的数据 为了验证这种行为,我有一个带有几个跳棋的记分牌。我所做的检查之一是,用于请求的ID是否免费。为此,我保留了一个关联数组,其中包含待响应的ID,并根据需要插入、检查和删除项。我通过两个接口和监视器来控制它,一个用于请求,另一个用于响应。响应监视器是一个多周期长的响

我在解决代码中的一个问题时遇到了一些问题,希望您能帮助我

我有两个模块,
A
B
。模块
A
B
发出请求,并在若干周期后
B
A
发送多周期响应
A
最多可以容纳8个等待响应的请求,而
B
的响应不一定按顺序返回。这就是为什么我们使用ID来识别返回的数据

为了验证这种行为,我有一个带有几个跳棋的记分牌。我所做的检查之一是,用于请求的ID是否免费。为此,我保留了一个关联数组,其中包含待响应的ID,并根据需要插入、检查和删除项。我通过两个接口和监视器来控制它,一个用于请求,另一个用于响应。响应监视器是一个多周期长的响应,它等待所有数据发送到记分板,在那里我更新我的结构

A
看到它实际上从
B
获得了有效响应时,问题就出现了,它释放了ID并可以将其用于新的请求。这在我的一些模拟中发生,因为在所有响应完成之前我不会收到事务,block
A
正在使用一个ID执行一个新的请求,在我从监视器获得完整的事务之前,我不知道它是合法的


有没有办法解决这个问题?谢谢

在您看到来自B的响应的循环中,为什么不将请求从a移动到另一个关联数组中,该数组表示已启动的响应。这样,您将在原始阵列中有一个空闲的插槽来处理来自的新请求,但现在您将有第二个新阵列来处理已经开始的多周期响应。

我不确定这是否有帮助。从记分板上,我只在响应完成后看到响应,当监视器在多个周期中捕捉响应数据时,只有到那时我才能用它做任何事情。因此,新的请求甚至可能在响应被通知之前出现一两个周期……听起来您必须修改您的测试环境,以便您的记分板检测到来自B的响应的开始。如果您想要检查的条件之一是来自a的未完成请求数,那么这是必要的不大于8。如果您不关心这个检查,那么您可以简单地将当前数组设置为足够大,以容纳最大数量的未完成请求,以验证在测试结束时所有请求都已收到响应。是的,这正是我担心的。。。我试图避免这种情况,但似乎我将不得不在环境中做相当大的改变……我会给你一个有效的回答,因为最终或多或少是我所做的。除了用于完整事务的uvm_analysis_端口外,我还添加了另一个在响应开始时发送ID的端口,并使用该端口将请求从挂起的_响应移动到正在进行的_响应。非常感谢。