Verilogの$ readmembと$ readmemhの紹介と使用

$ readmemxのフォーマット:

これら2つのシステムタスクは、ファイルからメモリにデータを読み取るために使用されます。これは、シミュレーション中にいつでも実行および使用でき、6つの形式が使用されています。

$readmemb("<数据文件名>",<存贮器名>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)

$readmemh("<数据文件名>",<存贮器名>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)

これらの2つのシステムタスクでは、読み取るデータファイルの内容には、空白の位置(スペース、改行、表、コメント行、2進数または16進数)のみを含めることができます。数値には、ビット幅の説明と形式$ readmembおよび$ readmemhシステムタスクの説明、各数値は2進および16進文字にすることができますさらに、数値は空白スペースまたはコメント行で区切る必要があります。

上記の6つのシステムタスクフォーマットの場合、5つのポイントを追加する必要があります。
(1)システムタスクステートメントステートメントとデータファイルにアドレスの記述がない場合、デフォルトのストレージ開始アドレスは、メモリ定義ステートメントの開始アドレスです。 。データファイルのデータは、ストレージユニットがいっぱいになるか、データファイルのデータがなくなるまで、メモリに継続的に保存されます。
(2)システムタスクで格納開始アドレスを指定し、格納終了アドレスを指定しない場合、メモリ定義文の開始アドレスから終了アドレスまでデータが格納されます。
(3)システムタスクステートメントステートメントで終了アドレスと開始アドレスの両方が指定されている場合、データファイル内のデータは、メモリに関係なく、開始アドレスに従って終了アドレスまでストレージユニットに格納されますステートメントの開始アドレスと終了アドレスを定義します。
(4)システムタスクとデータファイルの両方にアドレス情報が指定されている場合、データファイルのアドレスは、システムタスクのアドレスパラメータで宣言された範囲内にある必要があります。そうしないと、エラーが表示され、データをメモリにロードする操作が中断されます。
(5)データファイルのデータ数がシステムタスクの開始アドレスと終了アドレスで示されるデータ数と異なる場合は、エラーメッセージも表示されます。

簡単なコード:

module data_read;

reg [31:0] mem [0:11];
integer i;

initial $readmemh("./data.txt",mem);

initial begin
  for(i=0; i<12; i=i+1)
    $display("%d: %h", i, mem[i]);
end

endmodule

data.txt

// Hexadecimal values for $readmemh demo
 // can include comments with double forward slash (standard Verilog comment)
 // second 32-bit value
 // third value
 // etc.

// can break up into related groups, insert comments, etc.

8e700002
ae700001
1232fffa
1210fff9  // last value

注意: 

memの幅が[15:0]に調整されている場合、エラーが生成され、出力されません。

警告:(vsim-PLI-3406)ファイル "./data.txt"の2行目のデータの桁(8)が多すぎます。(最大は4):data_read.v(6)

memの幅を[63:0]に調整すると、結果は次のようになります。

#0:0000000002328020

#1:0000000002328022

#2:0000000002328024 

この比較は、システムタスクが行で読み取られることを示しています。

注意:$readmemb和$readmemh只能读取二进制和十六进制。

おすすめ

転載: blog.csdn.net/qq_33231534/article/details/106167484