如何让verilog-mode的AUTOINST不按输入输出分组展开实例?
Verilog-mode AUTOINST 定制需求解决方案
场景1:普通模块实例按端口声明顺序展开(取消输入输出分组)
原模块定义
module InstModule ( input i1, output [31:0] o1, input i2, output [31:0] o2 ); endmodule
实例声明
InstModule instName (/*AUTOINST*/);
当前展开结果(默认分组)
InstModule instName (/*AUTOINST*/ // Outputs .o1 (o1[31:0]), .o2 (o2[31:0]), // Inputs .i1 (i1), .i2 (i2));
期望展开结果(按原端口顺序,无分组)
InstModule instName (/*AUTOINST*/ .i1 (i1), .o1 (o1[31:0]), .i2 (i2), .o2 (o2[31:0]));
解决方法
内置的verilog-auto-inst-sort仅调整组内端口顺序,无法取消分组。要实现需求,可通过以下两种方式:
- 变量配置尝试:先设置变量取消分组注释并强制保留原顺序,部分版本可生效:
;; 取消AUTOINST的分组注释 (setq verilog-auto-inst-groups nil) ;; 自定义排序函数,直接返回原端口顺序 (defun verilog-auto-inst-sort-function (ports) ports) (setq verilog-auto-inst-sort #'verilog-auto-inst-sort-function) - 修改核心代码:若上述配置无效,需修改
verilog-mode.el:- 找到
verilog-auto-inst-make-port-alist函数,注释掉按输入/输出分组的筛选逻辑,保留模块原端口顺序的列表 - 修改
verilog-auto-inst-print函数,去掉输出/输入的分组注释行,直接遍历端口列表生成连接代码
- 找到
场景2:SystemVerilog Interface实例展开为modport端口而非接口连接
原Interface与模块定义
interface interface_io; modport A( input i1 , output [31:0] o1 ); modport B( input i2 , output [31:0] o2 ); endinterface module_a U_A(/*AUTOINST*/); interface_io U_IF(clk);
当前展开结果
module_a U_A(/*AUTOINST*/ // Interfaces .U_IFA (U_IFA.A), .U_IFB (U_IFB.B));
期望展开结果
module_a U_A(/*AUTOINST*/ // U_IFA Interface .i1 (i1), .o1 (o1[31:0]), // UIFB Interface .i2 (i2), .o2 (o2[31:0]));
解决方法
verilog-mode默认将Interface作为整体实例连接,要展开为modport内的端口,需修改verilog-mode.el的Interface处理逻辑:
- 定位到处理
/*AUTOINST*/中Interface的代码段(通常在verilog-auto-inst-scan或相关函数内) - 修改识别逻辑,当检测到Interface的modport连接时,遍历modport内的所有端口,生成对应的单个端口连接行,而非生成整体Interface实例连接
- 添加对应modport的注释行,匹配期望的格式
内容的提问来源于stack exchange,提问作者sue
相关产品推荐
相关产品推荐

