Twitterでやり取りしててちょっと思い出したのでメモと考えたこと。
シミュレーションを軽くするために動的配列をよく使うのであるが、二次元配列を初期化している例があまり書かれていなかったので書いてみた。
class PIX_t;
// ---------------------------------------------------------------------------
// members
// ---------------------------------------------------------------------------
int WIDTH, HEIGHT;
logic [47:0] pix [][];
// ---------------------------------------------------------------------------
// constructor
// ---------------------------------------------------------------------------
function new (int w, h);
WIDTH = w;
HEIGHT = h;
pix = new[WIDTH];
foreach(pix[i])
pix[i] = new[HEIGHT];
endfunction
endclass
module tb();
parameter int WIDTH = 3840;
parameter int HEIGHT = 2160;
PIX_t pix;
initial
pix = new(WIDTH, HEIGHT);
endmodule
foreach
を使用する。残念ながら一発で初期化はできない。
用途によっては、動的配列ではなくparameter
で配列を確保する方がコンパクトで良さそう。
class PIX_t #(parameter int WIDTH = 1920, HEIGHT = 1080);
// ---------------------------------------------------------------------------
// members
// ---------------------------------------------------------------------------
logic [47:0] pix [WIDTH][HEIGHT];
// ---------------------------------------------------------------------------
// constructor
// ---------------------------------------------------------------------------
function new (logic [47:0] p = 48'hFF_FF_FF_FF_FF_FF);
for (int x=0; x<WIDTH; x++)
for (int y=0; y<HEIGHT; y++)
pix[x][y] = p;
endfunction
endclass
module tb();
parameter int WIDTH = 3840;
parameter int HEIGHT = 2160;
PIX_t #(WIDTH, HEIGHT) pix;
initial
pix = new();
endmodule
ただし、parameter
によるインスタンス方法は、渡す引数の場所によってはうまくいかない場合があるので悩ましいところ。