0
task monitorPush();
  begin
    bit [7:0] data = 0;
    while (1) begin
      @ (posedge intf.clk);
      if (intf.cb.wr_cs== 1 &&  intf.cb.wr_en== 1) begin
        // @ (posedge intf.clk);
        data = intf.data_in;
        sb.addItem(data);
        $write("%dns : Write posting to scoreboard data = %x\n",$time, data);
      end
    end
  end
  endtask

上面的代码和下面的代码有什么不同?就像将 posedge 时钟从第 5 行移到第 7 行如何改变代码一样?提前致谢

task monitorPush();
  begin
    bit [7:0] data = 0;
    while (1) begin
      // @ (posedge intf.clk);
      if (intf.cb.wr_cs== 1 &&  intf.cb.wr_en== 1) begin
        @ (posedge intf.clk);
        data = intf.data_in;
        sb.addItem(data);
        $write("%dns : Write posting to scoreboard data = %x\n",$time, data);
      end
    end
  end
endtask
4

3 回答 3

2

@(posedge intf.clk)等待 clk 的 posedge 然后继续执行。

您的代码版本 1 等待 clk (posedge) 然后执行 if 语句。

版本 2:在 if 语句失败的情况下,将在 while true 块内连续执行,直到 if 变为 true,然后您将等待 clk posedge。

于 2012-08-03T09:42:13.270 回答
1

在第 2 版中,您可能会陷入无限循环,因为模拟器会在评估 while 循环和 if 语句时陷入困境,并且不会切换到执行代码的其他部分。在版本 1 中,@(posedge intf.clk) 将让模拟器跳转到代码的其他部分。简而言之,使用版本 1。

于 2014-12-10T06:28:29.633 回答
1

版本 2) 将挂起您的模拟,因为您没有 if 的 else 条件。从调用监视函数的那一刻起,wr_cs/wr_en 第一次遇到为零将卡在 while(1) 无限循环中,因为没有 else 条件或任何计时事件。

版本 1 是正确的使用方式。大多数情况下,您的控制和数据信号会随时钟而变化。

在版本 1) 中,您将在 CS/WEN 变高时的时钟沿对记分板的数据进行采样

在版本 2)中,您将在 wr_cs/wr_en 变高后一个时钟对数据进行采样。(当您看到它们为高后等待时钟)您最终可能会得到错误的数据。

于 2018-08-31T05:12:15.927 回答