任何使用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将显示正确的结果(data = c)。
你可以帮我理解这个问题吗?谢谢。迈克尔
答案 0 :(得分:1)
我无法找到竞争条件的解释,但我找到了两种适用于所有版本的变通方法。
一种方法是使用while循环,将时钟作为阻塞事件,将net作为比较条件。
while(bus.MONCLK.FRAMEn!=1'b0) @(bus.MONCLK);
另一种方法是在@
之前或之后使用微小延迟。只要您的时钟周期大于1个单位,#1
就应该是安全的。我不建议同时使用前导和尾随延迟,选择一个。
@(negedge bus.MONCLK.FRAMEn) #1;
#1 @(bus.MONCLK);