我对UVM有疑问。我们认为我有一个带有两个接口的DUT,每个接口都有一个代理,用相同的时钟生成事务。这些事务使用记分板上的分析导入(和写入函数)进行处理。我的问题是这两个事务都读取/修改记分板的共享变量。
我的问题是:
1)我是否可以通过信号量明确保证互斥? (我想是的)
2)这通常是一种正确的方法吗?
3)和主要问题,能以某种方式修复执行顺序吗?
根据该顺序,共享变量的值可能会发生变化,从而产生不一致。此外,该订单由规格确定。
提前致谢。
答案 0 :(得分:2)
虽然SystemVerilog任务和函数同时运行,但它们并不是并行运行的。理解并行性和并发性之间的区别非常重要,并且已经很好地解释了here。
因此,虽然SystemVerilog任务或函数可以与另一个任务或函数同时执行,但实际上它实际上并不是同时运行(运行时上下文)。 SystemVerilog调度程序保存了需要在相同模拟时间运行的所有任务和函数的列表,并且当时它在同一处理器上逐个(按顺序)执行它们(并发),而不是在多个处理器上一起执行(并行)。因此,互斥是隐含的,您不需要在该帐户上使用信号量。
执行两个这样的并发函数的顺序不是确定性的,但它是可重复的。因此,当您在同一模拟器上多次执行测试平台时,执行顺序将是相同的。但是两个不同的模拟器(或同一模拟器的不同版本)可以以不同的顺序执行这些功能。
如果规范要求执行某个顺序,则需要通过使其中一个任务/功能等待另一个来确保顺序。在您的记分板示例中,由于您使用的是分析端口,因此您将有两个"写"函数(可能使用uvm_analysis_imp_decl宏)并发执行。为了确保订单,(因为函数不能等待)你可以通过引入在第一个线程结束时触发的事件并且另一个线程等待此事件来分叉join_none线程并使其中一个线程等待另一个线程一开始。
答案 1 :(得分:0)
这是一个非常难以解决的问题。如果您在同一时间步中获得2个交易,则无论订单发送到记分板的顺序如何,您都必须能够处理它们。您无法确定首先触发哪个监视器。您唯一能做的就是收集交易,并在时间步骤结束时进行建模/检查/等。
信号量仅在您拥有尝试访问共享资源的(模拟)时间的并发线程时才会帮助您。如果你从分析端口获取东西,那么你可以在0时间内获得它们,所以信号量不会帮助你。
答案 2 :(得分:0)
所以据我所知,答案是:compiler / vendor / uvm无法保证执行的顺序。如果您需要确保在同一时间步骤中实际发生的顺序,则需要正确使用信号量使其按您希望的方式工作。 另一件事是,只有你自己知道哪一个必须在另一个之后执行,如果它们处于相同的模拟时间。
答案 3 :(得分:0)
这是一个经典的竞争条件,其结果取决于实际的线程顺序......
首先,你必须决定写比赛是否对你有用和/或在这种情况下是否有优先顺序。如果你不在乎最后一次访问会赢。
如果访问不是原子的,您可能需要一个信号量来确保一次只处理一个访问,下一个访问等到第一个完成。
您也可以尝试通过更改结构或引入线程排序(wait_order)来控制顺序,或者如果可能的话,您可以删除时间(这里不是直接使用您获得的数据操作,而是只为某些数据存储数据)时间,然后再操作它。