スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

task/functionのオーバーロードを検討してみた。

だ〜れかが言った
「だれかSystemVerilogで関数のオーバーロードできるようにしてくらはい」
ってことで検討してみた。
記述はすべて functionですが、taskでも同じなはず。。。

オーバーロードってなに?


C++で書くとこんな感じです。
 1|#include <stdio.h>
 2|
 3|void show(int a){
 4|  printf("--- a = %d\n", a);
 5|}
 6|
 7|void show(int a, int b){
 8|  printf("--- a = %d, b = %d\n", a, b);
 9|}
10|
11|int main(int argc, char const* argv[])
12|{
13|  show(10);
14|  show(20,30);
15|  return 0;
16|}
  • 実行結果
--- a = 10
--- a = 20, b = 30

SystemVerilogの場合(NG編)


実際に書いてみるとこんな感じ。
 1|module tb;
 2|
 3|  function void show(input int a);
 4|    $display("--- a = %3d", a);
 5|  endfunction
 6|
 7|  function void show(input int a, input int b);
 8|    $display("--- a = %3d, b = %3d", a,b);
 9|  endfunction
10|
11|  int i,j;
12|
13|  initial begin
14|    i = 10; j = 4;
15|    show(i);
16|    show(i,j);
17|    $finish;
18|  end
19|
20|endmodule
  • 実行結果
vlog sample.sv
Model Technology ModelSim ALTERA vlog 10.0d Compiler 2012.01 Jan 18 2012
-- Compiling module tb
** Error: sample.sv(7): 'show' already exists; must not be redefined as a function.
make: *** [compile] エラー 2
ってな訳でオーバーロード出来ないんですね。。。

SystemVerilogの場合(virtual functionで考えてみる)


では、どうするか?ってことで、class と virtual で考えてみた。
 1|class base;
 2|  virtual function void show(int a, int b=0); endfunction
 3|endclass
 4|
 5|class hoge extends base;
 6|  function void show(int a, int b=0);
 7|    $display("--- a = %3d", a);
 8|  endfunction
 9|endclass
10|
11|class hoge2 extends base;
12|  function void show(int a, int b=0);
13|    $display("--- a = %3d, b = %3d", a, b);
14|  endfunction
15|endclass
16|
17|module tb;
18|
19|  hoge  cl_hoge  = new;
20|  hoge2 cl_hoge2 = new;
21|
22|  int i,j;
23|
24|  initial begin
25|    i = 10; j = 4;
26|    cl_hoge.show(i);
27|    cl_hoge2.show(i, j);
28|    $finish;
29|  end
30|
31|endmodule
  • 実行結果
# 10.0d

# vsim -L work -do {run -all; quit} -c tb
# Loading sv_std.std
# Loading work.sample_sv_unit
# Loading work.tb
# run -all
# --- a = 10
# --- a = 10, b = 4
# ** Note: $finish : sample.sv(30)
っというような感じです。

今回は動作の違いを見るために2つインスタンスして記載してますが、
どちらか一つだけにするとインスタンス名が一つになると思いますよ。
DPI-C編はもう夜遅いので、気が向いたら書きましょう。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。