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)。
この問題を理解するのを手伝ってくれませんか? ありがとうございました。
マイケル