将模块作为类型传入

时间:2019-05-13 19:07:56

标签: system-verilog

我有一堆共享某些公共字段的“独特”模块。我想创建一个可以通过向上名称引用来引用此模块的模块。是否可以将模块类型作为可以在内部使用的参数传递?我尝试过:

  3 module A;
  4   int flag = 0;
  5 endmodule
  6
  7 module B;
  8   int flag = 1;
  9 endmodule
 10
 11 module C;
 12   int flag = 2;
 13 endmodule
 14
 15 module Bind #(parameter type T=A);
 16   initial begin
 17     $display("flat = %0d",t.flag);
 18   end
 19 endmodule
 20
 21 module tb;
 22   bind A Bind#(A) u_bound;
 23 endmodule

但是我遇到了以下编译错误:

-- Compiling module B
-- Compiling module C
-- Compiling module Bind
** Error: test.sv(15): (qverilog-2730) Undefined variable: 'A'.
** Error (suppressible): test.sv(15): (qverilog-2987) Illegal expression as initializer for type parameter 'T'.
-- Compiling module tb
** Error: (qverilog-13069) test.sv(22): near ";": syntax error, unexpected ';', expecting '('.

1 个答案:

答案 0 :(得分:2)

只能将数据类型参数化为类型。

您可以使用Verilog的这一鲜为人知的功能,即所有函数调用名称都向上搜索

 module A;
    int flag = 0;
    function int get_flag(); return flag; endfunction
 endmodule

  module B;
    int flag = 1;
    function int get_flag(); return flag; endfunction
  endmodule

  module C;
    int flag = 2;
    function int get_flag(); return flag; endfunction
  endmodule

  module Bind #(parameter type T=A);
    initial begin
      $display("flag = %0d",get_flag);
    end
  endmodule

  module tb;
    A aa();
    bind A Bind# u_bound();
  endmodule