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

上記のコードは以下のコードとどう違うのですか? ポーズエッジクロックを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 のポーズエッジを待機し、実行を継続します。

コードのバージョン 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 に答える