RTL仿真中门级网表拆分端口的Verilog映射解决方案
解决门级网表拆分端口的实例化问题
方案1:显式逐位映射端口
直接匹配网表中拆分后的单个端口,逐个完成信号映射,同时可直接在连接时添加线网延迟。
wire [15:0] sig_a; wire [7:0] sig_b; abc u_abc ( .\a[15] ( #(2) sig_a[15] ), // 转义符\匹配网表端口名,#(2)添加线网延迟 .\a[14] ( #(2) sig_a[14] ), .\a[13] ( #(2) sig_a[13] ), // ... 依次写完a[12]至a[0] .\b[7] ( #(1) sig_b[7] ), .\b[6] ( #(1) sig_b[6] ), // ... 依次写完b[5]至b[0] // 其余端口按同样方式映射 );
方案2:SystemVerilog数组端口隐式连接
若使用支持SystemVerilog的仿真器(如VCS、QuestaSim),可利用数组通配符简化映射,自动按位匹配拆分端口:
wire [15:0] sig_a; wire [7:0] sig_b; abc u_abc ( .\a[*] (sig_a), // *匹配所有\a[N]端口,按高位到低位对应sig_a .\b[*] (sig_b), // 其余端口正常映射 );
注:需确保网表中端口的位序(如\a[15]到\a[0])与总线sig_a的位序一致,避免信号错位。
方案3:添加中间封装模块
保留原eee模块的总线式实例化逻辑,新增一个封装模块将拆分端口的网表重新包装为总线接口:
封装模块代码
module abc_wrap ( input [15:0] a, output [7:0] b // 其余端口按原模块定义声明 ); abc u_abc ( .\a[15] (a[15]), .\a[14] (a[14]), // ... 完成所有a端口的逐位映射 .\b[7] (b[7]), .\b[6] (b[6]), // ... 完成所有b端口的逐位映射 // 其余端口映射 ); // 可在此统一添加延迟,例如: // assign #(2) b = {u_abc.\b[7], u_abc.\b[6], ..., u_abc.\b[0]}; endmodule
eee模块中实例化封装模块
wire [15:0] sig_a; wire [7:0] sig_b; abc_wrap u_abc_wrap ( .a(sig_a), .b(sig_b), // 其余端口按原写法连接 );
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

