我对 Verilog 有点陌生,并且继承了别人创建的项目。它使用了我不理解其意图的模块实例化技术。基本上创建了两种不同的模块类型。在其中一个模块实例化中,另一种类型的名称用作实例名称。我将提供一个简化的代码示例:
module bidirectional_filter #(
parameter SIZE = 4,
parameter MAX = 5'd10 //min 2, max 32!
)(
input wire clk,
input wire res,
input wire sync, // sync period
input wire [(SIZE-1):0]in,
output reg [(SIZE-1):0]out
);
// do bidirectional filter stuff
endmodule
module unidirectional_filter #(
parameter SIZE = 4,
parameter MAX = 5'd10 //min 2, max 32!
)(
input wire clk,
input wire res,
input wire sync, // sync period
input wire [(SIZE-1):0]in,
output reg [(SIZE-1):0]out
);
// do unidirectional filter stuff
endmodule
module m_top #(
parameter IN_FREQ_HZ = 25000000
)(
// IO list
);
// do stuff
bidirectional_filter #(
.SIZE( 17 ),
.MAX( 2000 / 100 )
) unidirectional_filter (
.clk( clk ),
.res( res ),
.sync( test_error_sync ),
.in( xcheck_filter_in[17 -1:0] ),
.out( xcheck_error_filtered[17 -1:0] )
);
// do stuff
endmodule
它会实例化双向过滤器或单向过滤器模块吗?我的直觉告诉我,它只会实例化一个名为“uni Direction_filter”的双向过滤器。
模块定义名称和实例名称存在于两个不同的名称空间中。重复使用相同的标识符时不会发生冲突(请参阅 IEEE 1800 SystemVerilog LEM 中的第 3.13 节)。
虽然这是允许的,但我想说,使用与实例名称相同的模块名称是一种非常糟糕的做法。
在没有看到更多代码的情况下,我只能猜测他们为什么想这样做。也许他们的脚本依赖于查看
unidirectional_filter
实例名称,而不管使用哪个模块。