日曜技術者のメモ

趣味でやった事のメモ書きです。

SystemVerilogのパラメータ付きクラスを試してみた

[SystemVerilog] 接続記述をもっとエクストリーム的に書こうという記事で
パラメータがついたクラスが紹介されているので試してみた。

まずはパラメータが反映されているかテスト

module top();

class c_hoge #(int k = 0);
  
  function print();
    $display("k = %d",k);
  endfunction
  
endclass:c_hoge

initial begin
  c_hoge #(0)i0_c_hoge;
  c_hoge #(1)i1_c_hoge;
  c_hoge #(2)i2_c_hoge;
  c_hoge #(3)i3_c_hoge;
  
  i0_c_hoge = new();
  i1_c_hoge = new();
  i2_c_hoge = new();
  i3_c_hoge = new();
  
  i0_c_hoge.print();
  i1_c_hoge.print();
  i2_c_hoge.print();
  i3_c_hoge.print();
  
end
endmodule

ModelSimで実行すると

# k =           0
# k =           1
# k =           2
# k =           3

おぉ!ちゃんと入ってる!

で、私がやりたいのはこれをデータクラスとして使って
キューや連想配列に入れる事だったのだが・・・

エラーで動かなかった。書いたコードは↓

module top();

class c_hoge #(int k = 0);
  
  function print();
    $display("k = %d",k);
  endfunction
  
endclass:c_hoge

c_hoge q_c_hoge[$];
c_hoge h_c_hoge[*];
  
initial begin
  c_hoge#(0) i0_c_hoge;
  c_hoge#(1) i1_c_hoge;
  c_hoge#(2) i2_c_hoge;
  c_hoge#(3) i3_c_hoge;
  
  i0_c_hoge = new();
  i1_c_hoge = new();
  i2_c_hoge = new();
  i3_c_hoge = new();
  
  i0_c_hoge.print();
  i1_c_hoge.print();
  i2_c_hoge.print();
  i3_c_hoge.print();

  q_c_hoge.push_back(i0_c_hoge);
  h_c_hoge["hoge0"] = i0_c_hoge;

  q_c_hoge.push_back(i1_c_hoge); //ここでエラー
  h_c_hoge["hoge1"] = i1_c_hoge;
  
end
endmodule

実行

# k =           0
# k =           1
# k =           2
# k =           3
# ** Fatal: Illegal assignment to class work.top/c_hoge #(0) from class work.top/c_hoge #(1)
# 
#    Time: 0 ps  Iteration: 0  Process: /top/#INITIAL#14(#ublk#0#15) File: E:/altera/13.0/test/test.sv
# Fatal error in Module top at E:/altera/13.0/test/test.sv line 33
# 

パラメータが初期値(k=0)の時は問題無い様ですが
パラメータに値が入るとエラーになります。

多分キューや連想配列を宣言する時の型c_hogeはc_hoge#(0)と同じなので
c_hoge#(1)という型(?)が入らないと言う事かな?

C++のtemplate的な使い方を想定してたのだが・・・(´・ω・`)

7/3追記 : Twitterで色々教えて頂き解決しました。
SystemVerilogのパラメータ付きクラスを試してみた(解決編)