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
模块的端口列表中。