我在Verilog中设计了一个模块(A),我需要在顶层模块中实例化它四次。这两个模块相互通信以及其他一些模块。 ' A'发出一些信号,其他实例是“A'应该接受。信号通过接口或总线发送。我不想通过合并任何标准总线协议来使设计复杂化。我创建了一个inout端口,以避免输入和输出具有相同类型的端口。
有没有办法为每个实例分配一个id或一个代码,以便每个实例检查该id并接受来自不同ID的信号。现在没有id或标准总线协议,模块也接受自己的信号,这是不应该发生的。
答案 0 :(得分:0)
为什么不为每个模块设置参数并将其用作ID?然后为每个实例唯一设置参数:
module A;
parameter ID = 0; //default value
case (ID)
0: //specific code for ID0
1: //specific code for ID1
2: //specific code for ID2
3: //specific code for ID3
endcase
endmodule
你的顶级模块:
module top;
A #(.ID(0)) inst_0 (...);
A #(.ID(1)) inst_1 (...);
A #(.ID(2)) inst_2 (...);
A #(.ID(3)) inst_3 (...);
endmodule
其他一些有用的观点:
您可能需要检查generate block
或vectorized/array module instantiation
,它们允许您实例化一组模块。
另外,请注意,通常,每个模块都可以看到整个层次结构。在每个模块中,您可以使用hierarchical expression
:
module A;
reg s;
....
initial $display("The initial value of signal s in instance A_2 is:", top.inst_2.s);
endmodule
请注意,不建议这样做,因为您的模块描述将特定于您的层次结构。
答案 1 :(得分:0)
您可以通过以下方式执行此操作:
module A ( /* your_ports */, input [1:0] ID );
/* ... code ... */
endmodule
module top;
A inst0 ( .ID(2'd0), .* );
A inst1 ( .ID(2'd1), .* );
A inst2 ( .ID(2'd2), .* );
A inst3 ( .ID(2'd3), .* );
endmodule
module A #(parameter ID) ( /* your_ports */ );
/* ... code ... */
endmodule
module top;
A #( .ID(0) ) inst0 ( .* );
A #( .ID(1) ) inst1 ( .* );
A #( .ID(2) ) inst2 ( .* );
A #( .ID(3) ) inst3 ( .* );
endmodule