System verilog 作为类型传入模块

System verilog 作为类型传入模块,system-verilog,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

我有一堆“独特”的模块,它们共享一些公共字段。我想创建一个可以引用这个的模块,比如说,通过向上的名称引用。是否可以将模块类型作为可在内部使用的参数传入?我试过这个:

  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 '('.

只有数据类型可以参数化为类型

您可以使用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

只有数据类型可以参数化为类型

您可以使用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

谢谢@dave_59!唉,这些模块都是RTL,目前我还没有在其中添加函数的灵活性。不过这是一个相当巧妙的把戏。您是否可以为遇到此问题的任何其他人提供LRM参考?第23.8.1节“任务和功能名称解析”对此进行了解释。它是在最初的Verilog规范中。您应该能够将这些函数放在RTL中。它们是可合成的,但将被忽略,因为没有RTL会引用它们。另一个选项是将要引用的信号的名称放在
Bind
模块的端口列表中。谢谢@dave_59!唉,这些模块都是RTL,目前我还没有在其中添加函数的灵活性。不过这是一个相当巧妙的把戏。您是否可以为遇到此问题的任何其他人提供LRM参考?第23.8.1节“任务和功能名称解析”对此进行了解释。它是在最初的Verilog规范中。您应该能够将这些函数放在RTL中。它们是可合成的,但将被忽略,因为没有RTL将引用它们。另一个选项是将要引用的信号的名称放入
Bind
模块的端口列表中。