System verilog 读取总线信号时出现问题。与我的型号SIM DE 10.2c和10.4进行比较。EDASim 10.1d模型有不同的结果

System verilog 读取总线信号时出现问题。与我的型号SIM DE 10.2c和10.4进行比较。EDASim 10.1d模型有不同的结果,system-verilog,modelsim,edaplayground,System Verilog,Modelsim,Edaplayground,各位SystemVerilog专家,请使用Mentor Graphic Modelsim工具 我正在编写一个监视器任务来处理一个简单的PCI单字写/读总线事件。不知何故,我的Modelsim DE 10.2c/10.4不需要额外的时钟周期,而Altera Modelsim 10.1d需要额外的时钟周期,原因不明。我想知道这是否正确 下面是一个关于编写监控器类代码的示例: @(negedge bus.MONCLK.FRAMEn); @(bus.MONCLK); // ED

各位SystemVerilog专家,请使用Mentor Graphic Modelsim工具

我正在编写一个监视器任务来处理一个简单的PCI单字写/读总线事件。不知何故,我的Modelsim DE 10.2c/10.4不需要额外的时钟周期,而Altera Modelsim 10.1d需要额外的时钟周期,原因不明。我想知道这是否正确

下面是一个关于编写监控器类代码的示例:

     @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);    // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Write_CMD) begin
        //tran_type = PCI_WRITE;
        write = 1;      // true
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end  
    @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);     // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Read_CMD) begin
        write = 0;      // false
        @(bus.MONCLK);
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end          
下面是有关读取监视器类代码的示例:

     @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);    // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Write_CMD) begin
        //tran_type = PCI_WRITE;
        write = 1;      // true
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end  
    @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);     // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Read_CMD) begin
        write = 0;      // false
        @(bus.MONCLK);
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end          
一个例子显示了正确的结果,如果我有这个额外的时钟周期。我将获得正确的读取或写入数据=c。 一个例子显示,如果我删除这个额外的时钟周期,结果是错误的。对于写入,我得到data=516(地址),对于读取,得到data=z。但是,我的Modelsim 10.2c和10.4将显示正确的结果(data=c)

你能帮我理解这个问题吗?多谢各位


Michael

我找不到对竞赛条件的解释,但我找到了两种适用于所有版本的解决方法

一种方法是使用while循环,时钟作为阻塞事件,网络作为比较条件

  • while(bus.MONCLK.FRAMEn!=1'b0)@(bus.MONCLK)
另一种方法是在
@
之前或之后使用微小延迟<代码>#1
应该是安全的,只要您的时钟周期大于1个时间单位。我不建议同时使用前导和尾随延迟,选择一个

  • @(negedge bus.MONCLK.FRAMEn)#1
  • #1@(巴士MONCLK)

您可能在
数据信号上有竞争条件。信号操作在两个模拟器上的调度可能稍有不同,但不向我们显示驱动信号的代码,这是不可能确定的。这肯定是一个调度差异。在每个
@
显示
@(negedge bus.MONCLK.FRAMEn)之后放置
$display
语句
@(bus.MONCLK)发生在ModelSim 10.1d中的同一时间戳中。我不知道这是10.1d中的一个bug还是LRM固有的竞争条件@都铎,完整的代码可以在EDA操场链接上找到。非常感谢。我相信Atlera Modelsim基于Modelsim DE的核心引擎。我不认为有什么区别。我用UVM库做了这个例子。我对uvm_信息和事务类数据包中存储的错误数据也有同样的问题(不仅仅是$display问题)。日程安排不会有那么大的不同吗?它能够打破我的UVM测试台。如果有兴趣,我可以提供到UVM测试台的链接。对不起,UVM很复杂,可能会混淆问题。这里的示例很简单。也许我可以比较一下数据来说明不匹配的问题。这可能是查看它是否与$display相关的简单方法。在UVM中,我有一个数据错误的不匹配问题。因此,我知道存在一个问题。我在两个示例中都添加了比较(=)来检查实际地址/数据。谢谢您的任何其他评论。Greg。非常感谢您提供示例代码。第一个示例将对FRAMEn的状态进行采样,并仅使用@(bus.MONCLK)进行升级。第二个例子是放置#1个单元延迟,以避免两个语句同时发生。我想我理解你的想法。我会尝试一下。仅供参考:在这个网站上,通过放弃投票和接受最佳答案(在答案旁边打勾)表示感谢。这也有助于其他有类似问题的用户找到解决方案。