System verilog 驱动程序/DUT/监视器之间的SystemVerilog同步

System verilog 驱动程序/DUT/监视器之间的SystemVerilog同步,system-verilog,System Verilog,我有一个项目,这是一个同步FIFO验证,我已经建立了驱动程序,它是成功的。之后,我制作了显示器和记分板。运行测试台时出现的问题是,我无法控制传输到监视器的内容,我从监视器读取的内容是DUT获取的内容(输入数据和输出数据)的延迟版本。所以我总是在记分牌上得到数据。我是初学者,这是我的第一个项目。起初我没有使用时钟块,我想以后再使用它们,但从我的角度来看,它们只会使监视器和DUT的同步变得更加复杂 我已使显示器时钟块的输入和输出偏差为1ps,与驱动器时钟块的输入和输出偏差相同。我真不知道该怎么办。你

我有一个项目,这是一个同步FIFO验证,我已经建立了驱动程序,它是成功的。之后,我制作了显示器和记分板。运行测试台时出现的问题是,我无法控制传输到监视器的内容,我从监视器读取的内容是DUT获取的内容(输入数据和输出数据)的延迟版本。所以我总是在记分牌上得到数据。我是初学者,这是我的第一个项目。起初我没有使用时钟块,我想以后再使用它们,但从我的角度来看,它们只会使监视器和DUT的同步变得更加复杂

我已使显示器时钟块的输入和输出偏差为1ps,与驱动器时钟块的输入和输出偏差相同。我真不知道该怎么办。你能给我推荐一些相关的阅读材料吗

这是我的司机,显示器,记分牌代码

/DRIVER/
`包括“interface.sv”
`定义驱动程序intf vif.driv.driv驱动程序cb
`定义mon_intf vif.mon.monitor_cb
类驱动程序;
int no_交易;
交易交易;
邮箱gen2drive;
虚拟intf vif;
新功能(虚拟intf vif、邮箱gen2drive);
this.vif=vif;
this.gen2drive=gen2drive;
端功能
任务重置();
$display(“----[驱动程序]-重置任务-等待重置----”;
等待(振动复位);
$display(“-----------[DRIVER]复位已开始----------------”);

`driv_intf.wr首先,您的代码需要更多的结构。您正在监视器内创建scoreboard对象,并从监视器中调用方法。这是糟糕的编码

首先创建一个顶级环境类,该类创建监视器、驱动程序和记分板的对象。在driver、monitor和scoreboard内部实现run()方法,并从环境类中fork调用它们以允许它们并行运行

一旦你有了这个正确的结构,只要你首先写入fifo(它创建了一个推入记分板),然后读取应该匹配数据