0

アルテラ FPGA のコードには 8 つのメモリがあり、メモリ初期化ファイル (mifs) を使用して初期化する必要があります。異なる mifs でメモリをインスタンス化できるようにするために、メモリ定義ファイルに次の変更を加えます。

オリジナルコード

module my_memory (
input clk,addr,din,wen,ren;
output dout);
...
...
defparam
altsyncram_component.init_file = "memory_init.mif";
...
endmodule

変更されたコード

module my_memory (
input clk,addr,din,wen,ren;
output dout
);


parameter MIFNAME = "memory_init.mif";

...
...
...
defparam
altsyncram_component.init_file = MIFNAME,
...
endmodule

これにより、複数のメモリ ブロックをインスタンス化し、初期化ファイルをパラメーターとして渡すことができるようになりました。

私のメモリのインスタンス化は次のようになりました

my_memory #(.MIFNAME("mem_0_init.mif") u_mem0 (...);
my_memory #(.MIFNAME("mem_1_init.mif") u_mem1 (...);
my_memory #(.MIFNAME("mem_2_init.mif") u_mem2 (...);
my_memory #(.MIFNAME("mem_3_init.mif") u_mem3 (...);
my_memory #(.MIFNAME("mem_4_init.mif") u_mem4 (...); 

次に、generate を使用して記憶をインスタンス化することにしました。

generate
genvar i;
for (i=0; i<=4; i=i+1)
begin : MEM_INST
  mem_memory #(.MIFNAME({"mem_",i,"_init.mif"}) u_mem (...);
end
endgenerate

ただし、これは機能しません。各インスタンス化に渡されたメモリ初期化ファイル パラメータが正しくありません。

私は何をしますか?

4

1 に答える 1

2

SystemVerilog を使用できる場合は、次のように記述できます。

  mem_memory #(.MIFNAME($sformatf("mem_%0d_init.mif",i)) u_mem (...);

それ以外の場合は、パラメーターを使用して創造的になる必要があります

genvar i;
for (i=0; i<=4; i=i+1)
begin : MEM_INST
  localparam [7:0] index = "0"+i;
  mem_memory #(.MIFNAME({"mem_",index,"_init.mif"}) u_mem (...);
end
endgenerate
于 2015-02-11T00:14:08.870 に答える