3

Mentor Graphic Modelsim Tool を使用している SystemVerilog エキスパートの皆様、こんにちは。

単純な PCI シングル ワード書き込み/読み取りバス イベントを処理するための監視タスクを作成しています。私のModelsim DE 10.2c / 10.4はそうではありませんが、どういうわけかEDAplayground Altera Modelsim 10.1dは未知の理由で余分なクロックサイクルを必要とします。これが正しいかどうかを理解したい。

書き込みモニター クラス コードの例を次に示します。

     @(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)。

この問題を理解するのを手伝ってくれませんか? ありがとうございました。

マイケル

4

1 に答える 1

1

競合状態の説明は見つかりませんが、すべてのバージョンで機能する 2 つの回避策を見つけました。

1 つのアプローチは、クロックをブロック イベントとして、ネットを比較条件として while ループを使用することです。

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

もう 1 つのアプローチは、 の前後に小さな遅延を使用すること@です。#1時計の周期が 1 時間単位より大きい限り、安全である必要があります。先行遅延と後続遅延の両方を使用することはお勧めしません。どちらかを選択してください。

  • @(negedge bus.MONCLK.FRAMEn) #1;
  • #1 @(bus.MONCLK);
于 2014-12-17T22:28:31.437 に答える