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のパラメータ付きクラスを試してみた(解決編)