0

以下のコードを使用して、ModelSim で Verilog の配列を使用して 1MB メモリ モデルを宣言しようとしています。また、アドレス空間内にアドレス 0x80020000 が必要です。

parameter MEM_START = 32'h7FFA_0000;
parameter MEM_END = 32'h800A_0000;
reg [7:0] MEMORY [MEM_START:MEM_END];

上記のコードは正常にコンパイルされますが、シミュレートしようとすると次のエラーが発生します。

# Loading project.memoryModule
# ** Fatal: (vsim-3419) Array with element size 2 and index range 2147090432 downto -2146828288 is too large.
#    Time: 0 ns  Iteration: 0  Instance: Project/memoryModule.v
# FATAL ERROR while loading design
# Error loading design

ただし、メモリ インデックスを 7FEF_FFFF から 7FFF_FFFF (これも 1 MB である必要があります) に初期化すると、すべて問題なく、シミュレーションで割り当てられたメモリを確認できます。範囲を 7FEF_FFFF から 8000_0000 に変更すると、コンパイル中に内部データ サイズのオーバーフローが発生します。メモリの最後の範囲がエラー (2 の補数) で -2146828288 (FFFF FFFF 800A 0000) と表示されるのはなぜですか?

私がオンラインで見たすべての例は、より小さなメモリを示しています。つまり、256 ワード (reg [7:0] MEMORY [0:255]) であるため、ロジックに問題があるのか​​、それとも問題が関連しているのかはわかりません。私のマシンのハードウェア。32 ビット バージョンの Modelsim を使用しており、4 GB の RAM を搭載しています。

4

2 に答える 2

3

その配列の各エントリは 2 バイトになり、各ビットは01ZまたはになりXます。配列は0x80020000エントリで、10 進数で 2147614720 エントリです。

2 * 2147614720 は 4295229440 であり、これは1 つの配列で 4 + ビット ギガバイトです。

私を信じてください、あなたはこれをしたくありません。これらすべての場所に 1 つの値を書き込むだけでも、膨大なシミュレーション時間がかかります。

SystemVerilog を使用している場合は、アドレスをインデックスとして連想配列を使用します。これは、何かが保存されている場所のメモリのみを使用します。それ以外の場合は、小さな配列をアドレス空間の適切な部分に移動する何かでメモリをラップすることをお勧めします。

于 2012-05-16T12:06:32.693 に答える
1

最初はこれはバグのように見えましたが、そうではないかもしれません。配列インデックスは定数整数式として扱われます。

配列のインデックスを指定する式は定数整数式でなければなりません。定数式の値は、正の整数、負の整数、またはゼロにすることができます。

仕様は、定数整数についても非常に明確であり、それらが可変整数とは異なることを示しています。

サイズと基本形式のない単純な 10 進数は符号付き整数として扱われますが、基本形式で指定された数値は、指定子 s が含まれている場合は符号付き整数として扱われ、基本形式のみが使用されている場合は符号なし整数として扱われます。

ただし、そのパラメータは(定数であっても)整数型にする必要があり、常に署名されています。これは、仕様で暗示されているようなものです。

型または範囲の指定がないパラメーター宣言は、値のオーバーライドが適用された後、パラメーターに割り当てられる最終値の型と範囲にデフォルト設定されます。

シムを実行し、MEM_END を使用していくつかの算術結果を出力すると、おそらく 32 ビットの符号付き値として機能します。表示されるメッセージは、署名されている MEM_END と一致しています。個人的には、オフセット配列インデックスをこのように使用することは決してありません。


これを修正するには、いくつかの方法を試すことができます。

  • 符号なし関数を使用します。

    reg [7:0] MEMORY [$unsigned(MEM_START):$unsigned(MEM_END)];

  • 1MB の範囲が必要な場合は、0x8000_0000..0x8010_0000 を使用して、インデックスの MSB を無視できます。

  • アドレスの MSB 全体をテストする必要がある場合は、メモリ モデル内にオフセットを適用できます。

  • Modelsim の 64 ビット バージョンを使用します。

  • パラメータを回避するために使用`defineしますが、定義はグローバルであり、パラメータはスコープされているため理想的ではありません。

    `define MEM_START 32'h7FFA_0000;
    `define MEM_END   32'h800A_0000; 
    reg [7:0] MEMORY [`MEM_START:`MEM_END];

あなたが何をしようとしているのかを正確に知らずにこれに答えるのは難しいです.

于 2012-05-16T20:56:04.143 に答える