英文:
How to access signals in submodules with multiple modules?
问题
I have the following Verilog file named main.v
:
module m1(input a, b, output wire c);
assign c = a & b;
endmodule
module main(input x, y, output wire z);
wire k;
m1 m1_inst(.a(x), .b(y), .c(k));
assign z = x ^ k;
endmodule
After that, I have a test bench named tb_main.v
which has an instantiation as shown below:
`include "main.v"
reg a, b;
wire c;
main main_dut(a, b, c);
$display("%b", main_dut.m1_inst.a);
$display("%b", main_dut.y);
$display("%b", main_dut.m1_inst.a);
When I simulate that testbench, I get the error "unresolved reference to m1" and "unresolved reference to main".
How do I solve this problem? I do not want to separate modules in the main.v
file into different files.
Any help will be appreciated.
英文:
I have the following Verilog file named main.v
:
module m1(input a, b, output wire c);
assign c = a & b;
endmodule
module main(input x, y, output wire z);
wire k;
m1 m1_inst(.a(x), .b(y), .c(k));
assign z = x ^ k;
endmodule
After that, I have a test bench named tb_main.v
which has an instantiation as shown below:
`include "main.v"
reg a, b;
wire b;
main main_dut(a, b, c);
$display("%b", main_dut.m1.a);
$display("%b", main_dut.main.y);
$display("%b", m1.a);
When I simulate that testbench, I get the error unresolved reference to m1
and unresolved reference to main
.
How do I solve this problem? I do not want to separate modules in the main.v
file into different files.
Any help will be appreciated.
答案1
得分: 1
问题在于您在分层规范中使用了一些模块名称,而不是模块实例名称。
例如,在 main_dut.m1.a
中:
main_dut
是模块实例名称m1
是模块的名称,而不是实例
您必须只使用模块实例名称。 这是一个可以编译而不会出错的完整代码示例(也可在 EDA Playground 上找到):
module m1 (input a, b, output wire c);
assign c = a & b;
endmodule
module main (input x, y, output wire z);
wire k;
m1 m1_inst (.a(x), .b(y), .c(k));
assign z = x ^ k;
endmodule
module tb_main;
reg a, b;
main main_dut (a, b, c);
initial $display("%b", main_dut.m1_inst.a);
initial $display("%b", main_dut.y);
endmodule
英文:
The problem is that you are using some module names instead of module instance names in your hierarchical specifiers.
For example, in main_dut.m1.a
:
main_dut
is a module instance namem1
is the name of the module, not the instance
You must only use module instance names. This is a complete code example that compiles without errors (also on EDA Playground):
module m1 (input a, b, output wire c);
assign c = a & b;
endmodule
module main (input x, y, output wire z);
wire k;
m1 m1_inst (.a(x), .b(y), .c(k));
assign z = x ^ k;
endmodule
module tb_main;
reg a, b;
main main_dut (a, b, c);
initial $display("%b", main_dut.m1_inst.a);
initial $display("%b", main_dut.y);
endmodule
答案2
得分: -1
总是更好地保持明确的连接。因此,不要这样做:
reg a, b;
wire b;
main main_dut(a, b, c);
而应该这样做:
reg a, b;
wire b;
main main_dut(
.a(a),
.b(b),
.c(c)
);
英文:
It is always better to maintain explicit connectivity. So instead of
reg a, b;
wire b;
main main_dut(a, b, c);
, do something like
reg a, b;
wire b;
main main_dut(
.a(a),
.b(b),
.c(c)
);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论