【问题标题】:Issue with reading bus signal. Compare to my Modelsim DE 10.2c and 10.4. EDAplayground Modelsim 10.1d has different result读取总线信号问题。与我的 Modelsim DE 10.2c 和 10.4 进行比较。 EDAplayground Modelsim 10.1d 有不同的结果
【发布时间】:2015-02-14 05:02:42
【问题描述】:

您好所有使用 Mentor Graphic Modelsim Tool 的 SystemVerilog 专家。

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

这是一个编写监控类代码的例子:

     @(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          

http://www.edaplayground.com/x/7kG 如果我有这个额外的时钟周期,示例会显示正确的结果。我将正确获取 data = c 进行读取或写入。 http://www.edaplayground.com/x/TSE 如果我删除了这个额外的时钟周期,一个例子会显示错误的结果。我得到 data = 516 (地址)用于写入和 data = z 用于读取。但是,我的 Modelsim 10.2c 和 10.4 会显示正确的结果(数据 = c)。

你能帮我理解这个问题吗?谢谢。

迈克尔

【问题讨论】:

  • 您可能在data 信号上有竞争条件。信号操作在两个模拟器上的安排可能略有不同,如果没有向我们展示驱动该信号的代码,就无法确定。
  • 这绝对是调度差异。在每个 @ 之后放置 $display 语句显示 @(negedge bus.MONCLK.FRAMEn);@(bus.MONCLK); 在 ModelSim 10.1d 中发生在相同的时间戳中。如果它是 10.1d 中的错误或来自 LRM 的固有竞争条件,我没有阻止。 @Tudor,完整代码可在 edaplayground 链接上找到。
  • 非常感谢。我相信 Atlera Modelsim 是基于 Modelsim DE 的核心引擎。我不认为有区别。我用 UVM 库做了这个例子。我对 uvm_info 和事务类数据包中存储的错误数据有同样的问题(不仅仅是 $display 问题)。调度不能有那么大的不同吗?它能够打破我的 UVM 测试台。如果有兴趣,我可以提供指向 UVM 测试平台的链接。
  • 抱歉,UVM 很复杂,可能会混淆问题。此处的 SV 示例很简单。也许我可以把数据比较来显示不匹配问题。这可能是查看它是否与 $display 相关的简单方法。在 UVM 中,我有一个数据错误的不匹配问题。所以,我知道有一个问题。
  • 我添加了比较 (==) 以检查两个示例中的实际地址/数据。感谢您提供任何额外的 cmets。

标签: system-verilog modelsim edaplayground


【解决方案1】:

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

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

  • while(bus.MONCLK.FRAMEn!=1'b0) @(bus.MONCLK);

另一种方法是在@ 之前或之后使用微小的延迟。只要您的时钟周期大于 1 个时间单位,#1 就应该是安全的。我不建议同时使用前导延迟和尾随延迟,选择一个。

  • @(negedge bus.MONCLK.FRAMEn) #1;
  • #1 @(bus.MONCLK);

【讨论】:

  • 格雷格。非常感谢您提供示例代码。第一个示例将采样 FRAMEn 的状态并仅使用 @(bus.MONCLK) 来推进。第二个例子是设置#1 单位延迟以避免两个语句同时发生。我想我在这里理解你的想法。我会试试看。
  • 仅供参考:在本网站上,感谢您通过投票和接受最佳答案(答案旁边的复选标记)给出。这也有助于其他有类似问题的用户找到解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多