【发布时间】: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