由于模块是用单独的端口定义的,因此必须单独连接每个端口。Verilog 不提供自动连接端口的内置方式。
SystemVerilog 有.*
连接,但它仅在 net/var 名称与端口名称匹配时才有效。因此,使用 SystemVerilog,您可以连接中间分配。(注意:所有现代 Verilog 模拟器都支持大多数(如果不是全部)SystemVerilog 功能。只需将文件灭绝从.v
更改.sv
为启用)
logic clock;
logic [15:0] inputs;
wire [22:0] outputs;
wire m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16;
wire S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24;
assign {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16} = inputs;
assign outputs = {S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24};
mymodule tc( .* );
对于更简洁的解决方案,我推荐使用 Emacs 插件Verilog-Mode ( vim wrapper exists )。该工具是专门为简化 Verilog 项目中常见的长端口列表连接和其他重复性任务而创建的。例如,下面将扩展为索引到索引连接
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[\1]),
.S@ (outputs[\1]),
); */
mymodule dut (/*AUTOINST*/);
以下两个模板将扩展一个偏移量,但m18
明确连接到inputs[13]
. (我之所以选择m18
,是因为我注意到没有m14
,它是在 and 之间定义m13
的m15
)
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[@"(- \1 1)"]),
.S@ (outputs[@"(- \1 6)"]),
); */
mymodule dut (
.m18 (inputs[13]),
/*AUTOINST*/);
或者
/* mymodule AUTO_TEMPLATE (
.m18 (inputs[13]),
.m@ (inputs[@"(- \1 1)"]),
.S@ (outputs[@"(- \1 6)"]),
); */
mymodule dut (/*AUTOINST*/);