Sigasi Visual HDL (SVH) has several checks on Verilog port and parameter associations.
Named parameter and port connections have to be used for all instances with many parameters / ports
A long list of positional parameters or port connections is difficult to read and maintain. Therefore, SVH warns if a list of positional connections is longer than 3 items (rules 24 and 26). If the number of associations is larger than 3, named connections should be used.
module sub(input clk, arst, enable, data, output reg data_out); always @(posedge clk or negedge arst) if (~arst) data_out <= 1'b0; else if (enable) data_out <= data; endmodule module badtop; logic clk, arst, en, a, b; sub sub_inst(clk, arst, en, a, b); // 5 ordered associations: difficult to read and maintain endmodule module goodtop; logic clk, arst, en, a, b; sub sub_instance ( .clk(clk), .arst(arst), .enable(enable), .data(a), .data_out(b) ); endmodule
Named and positional associations cannot be mixed
SVH flags an error when attempting to mix named and positional port or parameter associations (rule 25).
module sub#(PARAM_1=2, PARAM_2=3) (); endmodule module badtop; // Syntax error: mix of named (`PARAM_1`) and positional (`3`) association sub#(.PARAM_1(2), 3) sub_inst(); endmodule module ok_top; // All associations are positional: OK but harder to understand and maintain sub#(2, 3) sub_inst(); endmodule module goodtop; // All associations are named: best practice sub#(.PARAM_1(2), .PARAM_2(3)) sub_inst(); endmodule
Unresolved formal names
SVH flags an error for named port and parameter connections if the instantiated module doesn’t have ports with these names.
module sub(i1, i2, o1); parameter WIDTH = 8; input[WIDTH-1:0] i1, i2; output[WIDTH-1:0] o1; endmodule module badtop; logic aa, bb, cc; // parameter `HEIGHT` and ports `a`, `b`, `c` do not exists in module `sub` sub#(.HEIGHT(4)) sub_inst( .a(aa), .b(bb), .c(cc) ); endmodule module goodtop; logic aa, bb, cc; sub#(.WIDTH(4)) sub_inst( .i1(aa), .i2(bb), .o1(cc) ); endmodule
Duplicate port and parameter connections
SVH flags an error for duplicate named port and parameter connections (rule 37).
module sub#(WIDTH=8) (input[WIDTH-1:0] i1=1'b0, i2, output[WIDTH-1:0] o1); endmodule module badtop; logic a, b, c; // parameter `WIDTH` and port `i1` are connected twice sub#(.WIDTH(4), .WIDTH(6)) sub_inst( .i1(a), .i1(b), .o1(c) ); endmodule module goodtop; logic a, b, c; // parameter `WIDTH` and port `i1` are connected once sub#(.WIDTH(4)) sub_inst( .i1(a), .o1(c) ); endmodule
Missing actuals for formals that have no default value
SVH warns about missing port or parameter connections if the ports or parameters don’t have a default value (rule 38).
module sub #(LHS, RHS=0) (input[LHS:RHS] i1=1'b0, i2, output[LHS:RHS] o1); endmodule module badtop; logic[7:0] x; // parameter `LHS` and port `i2` don't have a default value so they must be connected sub sub_inst(.o1(x)); endmodule module goodtop; logic[7:0] x; wire[7:0] y; sub#(.LHS(7)) sub_inst( .i2(y), .o1(x) ); endmodule
Excessive number of actuals in ordered notation
SVH flags an error if the number of positional parameters or port connections is larger than the number of parameters or ports of the instantiated module (rule 39).
module sub#(WIDTH=8) (input[WIDTH-1:0] i1=1'b0, i2, output[WIDTH-1:0] o1); endmodule module badtop; logic a, b, c, d; // Expecting 1 parameter connection and 3 port connections instead of 2 and 4 sub#(4, 6) sub_inst(a, b, c, d); endmodule module goodtop; logic a, b, c; sub#(4) sub_inst(a, b, c); endmodule
Note that if there are too few positional parameters or port connections, an error for missing connections will be flagged.
Named connections are not allowed with blank ports
If an instantiated module contains a null port, the instantiation must use port association by order and not by name (rule 56).
module sub( input clk, , // this is a *null port* input rst ); endmodule module badtop; sub sub_instance( .clk(clk), .rst(rst) ); endmodule module goodtop1; sub sub_instance( ,clk , rst ); endmodule module goodtop2; sub sub_instance( clk, foo, rst ); endmodule
Rule configuration
These rules can be disabled for your project, or their severity and parameters can be modified in the project linting settings. Alternatively, they can be manually configured with the following template:
# Whitespace following a backtick
24/severity/${path}={error|warning|info|ignore}
24/params/max_ordered_port_connections/${path}=${integer}
# Invalid preprocessor syntax
26/severity/${path}={error|warning|info|ignore}
26/params/max_ordered_parameter_overrides/${path}=${integer}