将模块作为类型传入
Passing in modules as types
我有一堆 'unique' 共享一些共同领域的模块。我想创建一个可以引用它的模块,比如说,通过向上名称引用。是否可以传入一个模块类型作为参数,可以在内部使用?我试过这个:
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
我有一堆 'unique' 共享一些共同领域的模块。我想创建一个可以引用它的模块,比如说,通过向上名称引用。是否可以传入一个模块类型作为参数,可以在内部使用?我试过这个:
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