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