SystemVerilog:$rootってどう使う?

SystemVerilogでは Top-levelが $rootで特定できるようになってます。
ってことで、記述してみた。
 1|module top(input bit clock, input bit a, output bit[1:0] b);
 2|
 3|  // hoge uhoge(.*);
 4|  subm usubm(.*);
 5|
 6|endmodule
 7|
 8|module subm(input bit clock, input bit a, output bit[1:0] b);
 9|
10|  hoge uhoge(.*);
11|
12|endmodule
13|
14|module hoge(input bit clock, input bit a, output bit[1:0] b);
15|
16|  always @(posedge clock) begin
17|    b[1] <= b[0] ;
18|    b[0] <= a;
19|  end
20|
21|  always @(posedge clock) begin
22|    $display("------ testbench.in = %b, top.b(out) = %b", 
23|             $root.testbench.in, $root.testbench.utop.b);   
24|  end
25|endmodule
26|
27|module testbench;
28|  bit      clock = 0;
29|  bit      in = 0;
30|  bit[1:0] out;
31|
32|  top utop(.*, .a(in), .b(out));
33|
34|  always #5 clock = ~clock;
35|
36|  initial begin
37|    @(posedge clock); in = 0; // $display("--- in = %b, out = %b", in, out);
38|    @(posedge clock); in = 1; // $display("--- in = %b, out = %b", in, out);
39|    @(posedge clock); in = 1; // $display("--- in = %b, out = %b", in, out);
40|    @(posedge clock); in = 0; // $display("--- in = %b, out = %b", in, out);
41|    @(posedge clock); in = 1; // $display("--- in = %b, out = %b", in, out);
42|    @(posedge clock); in = 0; // $display("--- in = %b, out = %b", in, out);
43|    @(posedge clock); in = 1; // $display("--- in = %b, out = %b", in, out);
44|    @(posedge clock); in = 0; // $display("--- in = %b, out = %b", in, out);
45|    @(posedge clock); in = 0; // $display("--- in = %b, out = %b", in, out);
46|    $finish(1);
47|  end
48|
49|endmodule:testbench

シミュレーション結果
vlib work
vlog sample.sv
Model Technology ModelSim ALTERA vlog 10.0d Compiler 2012.01 Jan 18 2012
-- Compiling module top
-- Compiling module subm
-- Compiling module hoge
-- Compiling module testbench

Top level modules:
testbench
vsim -c -L work testbench -do "run -all; quit"
Reading /home/kocha/tools/modelsim/12.0/modelsim_ase/tcl/vsim/pref.tcl

# 10.0d

# vsim -L work -do {run -all; quit} -c testbench
# Loading sv_std.std
# Loading work.testbench
# Loading work.top
# Loading work.subm
# Loading work.hoge
# run -all
# ------ testbench.in = 0, top.b(out) = 00
# ------ testbench.in = 0, top.b(out) = 00
# ------ testbench.in = 1, top.b(out) = 00
# ------ testbench.in = 1, top.b(out) = 01
# ------ testbench.in = 0, top.b(out) = 11
# ------ testbench.in = 1, top.b(out) = 10
# ------ testbench.in = 0, top.b(out) = 01
# ------ testbench.in = 1, top.b(out) = 10
# ------ testbench.in = 0, top.b(out) = 01
# ** Note: $finish : sample.sv(46)
# Time: 85 ps Iteration: 1 Instance: /testbench
これで、3行目と4行目を逆に変更しても同じ結果になります。
 3|  // hoge uhoge(.*);
 4|  subm usubm(.*);
ただ、ModelSimの場合は vlibで指定した(今回は work)が $rootなんですよね。
子モジュールで TOP側を参照するような使い方ではないのかな???
22|    $display("------ testbench.in = %b, top.b(out) = %b", 
23|             $root.testbench.in, $root.testbench.utop.b);   

最近、UVM書いてないので、super と混乱してきたので勉強を再開せねば。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
09 | 2017/10 | 11
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
アクセス人数