2016-04-13 229 views
1

Verilogで推定RAMの内容を初期化できません。ラムのコードは次のとおりです。Verilogで推定ブロックRAM(BRAM)の内容を初期化する方法

module ram(
     input clock, // System clock 
     input we, // When high RAM sets data in input lines to given address 
     input [13:0] data_in, // Data lines to write to memory 
     input [10:0] addr_in, // Address lines for saving data to memory 
     input [10:0] addr_out, // Address for reading from ram 
     output reg data_out // Data out 
); 

reg [13:0] ram[2047:0]; 

// Initialize RAM from file 
// WHAT SHOULD GO HERE? 

always @(posedge clock) begin 
    // Save data to RAM 
    if (we) begin 
     ram[addr_in] <= data_in; 
    end 

    // Place data from RAM 
    data_out <= ram[addr_out]; 
end   
endmodule 

私は$ readmemhコマンドを実行しました。しかし、それについての文書は疎であるようです。どのようにデータを含むファイルをフォーマットする必要がありますか?また、このモジュールをインスタンス化するときにファイルを引数として渡して、このモジュールの異なるインスタンスを別のファイルからロードできるようにするにはどうすればよいですか?

シミュレーションと実際の実装の両方で初期化されたコンテンツを利用したいと考えています。そのため、FPGAはすでにこのコンテンツをRAMでブートしています。

私はKintex xc7k70 FPGAをプログラムするためにVivado 2015.4を使用しています。

答えて

4

$readmemhを最初のブロックの内側に使用することは間違いありません。そのモジュールのように異なるインスタンスが異なる初期化ファイルを持つことができるようにするために、あなたはそうのようなパラメータを使用する必要があります。

parameter MEM_INIT_FILE = ""; 
... 
initial begin 
    if (MEM_INIT_FILE != "") begin 
    $readmemh(MEM_INIT_FILE, ram); 
    end 
end 

をフォーマットはIEEE1800-2012仕様のセクション21.4で説明されています。いかなるプレフィクス「0x」と各行が隣接アドレス(または任意の分離空白が表していないことを

0001 
1234 
3FFF 
1B34 
... 

注:典型的には、ファイルがそうのような正しいビット長の16進数を含む行のちょうど束であります)。上記の例では、$readmemhは、ram[0]14'h1234ram[1]14'h3FFFram[2]と入力するなど、14'h0001を入力します。コメントは、//または/* */を使用して16進ファイルに含めることもできます。初期化されていないだろう

@0002 
0101 
0A0A 
... 
上記ファイルで

ram[0]ram[1]をしてram[2]14'h0101になるだろう:最後に、次の番号が位置するようにするためにそのようなアドレスを指定する@記号を使用することができます。これらはすべて16進ファイル形式の主要な構成要素ですが、_,xzを他のVerilog番号と同じように使用することができます。上記のセクションで読むことができるいくつかの規則があります。

2

別にUNNの優れたANS @から、私はあなただけ1'b1または1'b0にすべてのビットのいずれかを使用してメモリを初期化したい場合は、あなただけのコードを次のように置くことができ、ことを追加したい、のために

integer j; 
initial 
    for(j = 0; j < DEPTH; j = j+1) 
    ram[j] = {WIDTH{MEM_INIT_VAL}}; 

あなたのケース、WIDTH = 14、MEM_INIT_VALは1'b1または1'b0です。

-2
integer j; 
initial 
    for(j = 0; j < DEPTH; j = j+1) 
    ram[j] = j; 

デバッグの場合、ロケーションの値がロケーション番号である場合は、これは簡単です。

また、RAMを初期化しないことをお勧めします。 RAMが初期化されずに簡単にキャッチされても、データ駆動型のバグがある場合は、そのバグをキャッチするのに役立ちます。

関連する問題