3

以下の Systemverilog コードは、$fread を使用してバイナリ ファイルをメモリに読み込み、メモリの内容を出力する単一ファイル テストベンチです。バイナリ ファイルは 16 バイトで、そのビューを以下に示します (これは、Systemverilog コードが出力すると予想されるものです)。

印刷された出力は、最初の 6 (0-5) バイトに期待するものと一致します。その時点で予想される出力は 0x80 ですが、印刷された出力はスティミュラス ファイルにない 0xef で始まる 3 バイトのシーケンスです。これらの 3 バイトの後、出力は再び刺激に一致します。読み取ったバイナリ バイトのビット 7 が 1 の場合、エラーが発生するようです。データが署名付きとして扱われているように見えますが、そうではなく、バイナリ データが 16 進数として出力されます。メモリは、符号なしのタイプ ロジックとして定義されます。

これは、次の投稿の質問/回答に似ています: Read binary file data in Verilog into 2D Array . ただし、私のコードには $fopen ステートメントで同じ問題 (「rb」を使用) がないため、その解決策はこの問題には適用されません。

Systemverilog 仕様 1800-2012 では、セクション 21.3.4.4 バイナリ データの読み取りで、$fread を使用してバイナリ ファイルを読み取ることができ、その方法について説明しています。この例は、そのセクションに記載されている内容に準拠していると思います。

コードは EDA Playground に投稿され、ユーザーが表示して実行できるようになっています。 https://www.edaplayground.com/x/5wzA 実行してダウンロードするにはログインが必要です。ログインは無料です。HDL シミュレーション用の業界標準ツールの完全なクラウドベース バージョンへのアクセスを提供します。

また、EDA Playground で 3 つの異なるシミュレーターを実行してみました。それらはすべて同じ結果を生成します。

stim.bin ファイルを再配置して、0x80 値がファイルの途中ではなく先頭に来るようにしました。その場合、エラーはテストベンチ印刷出力の開始時にも発生します。

Systemverilog コードは問題なく、バイナリ ファイルに問題があるのでしょうか。その内容について、emacs Hexlモードが表示するもののスクリーンショットを提供しました。また、別のビューアーで見たところ、同じように見えました。EDA Playground で実行しているときにダウンロードして、別のエディターで調べることができます。バイナリ ファイルは GNU Octave によって生成されました。

元のファイルを回避する (学習する) よりも、元のファイルをデバッグするために、他のものではなく Systemverilog $fread を使用するソリューションを使用することをお勧めします。これは、Octave/Matlab で生成されたバイナリ ファイルから読み込まれたスティミュラスを Systemverilog DUT に適用する Systemverilog テストベンチに開発されます。ファイルへのアクセス速度が速いため、バイナリ fileIO が推奨されます。

Systemverilog テストベンチが mem[6] に対して 0x80 ではなく 0xef を出力するのはなぜですか?

module tb();

  // file descriptors
  int       read_file_descriptor;
  // memory
  logic [7:0] mem [15:0];


  // ---------------------------------------------------------------------------
  // Open the file
  // ---------------------------------------------------------------------------
  task open_file();
    $display("Opening file");
    read_file_descriptor=$fopen("stim.bin","rb");
  endtask

  // ---------------------------------------------------------------------------
  // Read the contents of file descriptor
  // ---------------------------------------------------------------------------
  task readBinFile2Mem ();
    int n_Temp;
    n_Temp = $fread(mem, read_file_descriptor);
    $display("n_Temp = %0d",n_Temp);
  endtask
  
  // ---------------------------------------------------------------------------
  // Close the file
  // ---------------------------------------------------------------------------
  task close_file();
    $display("Closing the file");
    $fclose(read_file_descriptor);
  endtask

  // ---------------------------------------------------------------------------
  // Shut down testbench
  // ---------------------------------------------------------------------------
  task shut_down();
    $stop;
  endtask
  
  // ---------------------------------------------------------------------------
  // Print memory contents
  // ---------------------------------------------------------------------------  
  task printMem();
    foreach(mem[i])
      $display("mem[%0d] = %h",i,mem[i]);
  endtask
    
  // ---------------------------------------------------------------------------
  // Main execution loop
  // ---------------------------------------------------------------------------
  initial
    begin :initial_block
      open_file;
      readBinFile2Mem;
      close_file;
      printMem;
      shut_down;
    end :initial_block

endmodule

バイナリ刺激ファイル:

ここに画像の説明を入力

実際の出力:

Opening file
n_Temp = 16
Closing the file
mem[15] = 01
mem[14] = 00
mem[13] = 50
mem[12] = 60
mem[11] = 71
mem[10] = 72
mem[9] = 73
mem[8] = bd
mem[7] = bf
mem[6] = ef
mem[5] = 73
mem[4] = 72
mem[3] = 71
mem[2] = 60
mem[1] = 50
mem[0] = 00

更新: EDA プレイグラウンドへのアップロード プロセス中にバイナリ ファイルが変更される可能性があることをテストするために、実験が実行されました。これらの手順に含まれる Systemverilog コードはありません。ファイルのアップロード/ダウンロードのみです。

手順: ( https://hexed.it/を使用してバイナリ ファイルを作成および表示します)

  1. 16進パターン80 00 80 00 80 00 80 00でバイナリファイルを作成/保存します
  2. 新しい遊び場を作る
  3. 新しく作成されたバイナリ ファイルを新しいプレイグラウンドにアップロードする
  4. プレイグラウンドの「実行後にファイルをダウンロード」ボックスをチェックします
  5. プレイグラウンドを保存
  6. 遊び場を実行
  7. プレイグラウンド実行の結果を保存/解凍します
  8. バイナリ ファイルを表示します。私の場合は、アップロード/ダウンロードのプロセス中に変更されています。結果のスクリーンショットを以下に示します。 実験結果

この実験は、2 つの異なる Windows ワークステーションで実施されました。これらの結果とコメントに基づいて、これは Systemverilog の問題ではなく、EDA プレイグラウンドへのバイナリ ファイルのアップロード/ダウンロードに関連するという結論で、この問題をクローズします。コメントしてくれた人に感謝します。

4

1 に答える 1