gpt4 book ai didi

system-verilog - 读取总线信号的问题。与我的 Modelsim DE 10.2c 和 10.4 进行比较。 EDAplayground Modelsim 10.1d 有不同的结果

转载 作者:行者123 更新时间:2023-12-04 06:37:19 25 4
gpt4 key购买 nike

您好,所有使用 Mentor Graphic Modelsim 工具的 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 (address) 用于写入和 data = z 用于读取。但是,我的 Modelsim 10.2c 和 10.4 将显示正确的结果 (data = c)。

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

迈克尔

最佳答案

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

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

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

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

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

关于system-verilog - 读取总线信号的问题。与我的 Modelsim DE 10.2c 和 10.4 进行比较。 EDAplayground Modelsim 10.1d 有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27495246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com