以下の 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/を使用してバイナリ ファイルを作成および表示します)
- 16進パターン80 00 80 00 80 00 80 00でバイナリファイルを作成/保存します
- 新しい遊び場を作る
- 新しく作成されたバイナリ ファイルを新しいプレイグラウンドにアップロードする
- プレイグラウンドの「実行後にファイルをダウンロード」ボックスをチェックします
- プレイグラウンドを保存
- 遊び場を実行
- プレイグラウンド実行の結果を保存/解凍します
- バイナリ ファイルを表示します。私の場合は、アップロード/ダウンロードのプロセス中に変更されています。結果のスクリーンショットを以下に示します。
この実験は、2 つの異なる Windows ワークステーションで実施されました。これらの結果とコメントに基づいて、これは Systemverilog の問題ではなく、EDA プレイグラウンドへのバイナリ ファイルのアップロード/ダウンロードに関連するという結論で、この問題をクローズします。コメントしてくれた人に感謝します。