system-verilogmodelsim

-svinputport option in modelsim


I am using modlesim for my design and in this we are passing an option -svinputport=var, what is the use of this option? we are passing `default_nettype none before compiling each design files. Does these both are dependent? Could anyone help me with an example.

The description is as below for the option

svinputport=net|var|compat|relaxed
                     Select the default kind for an input port that is
                     declared with a type, but without the var keyword.
                     Select 'net' for strict LRM compliance, where the
                     kind always defaults to wire. Select 'var' for
                     non-compliant behavior, where the kind always defaults
                     to var. Select 'compat', where only types compatible with
                     net declarations default to wire. The default is 'relaxed',
                     where only a type that is a 4-state scalar or 4-state single
                     dimension vector type defaults to wire.

Question (2)

Thank you very much for the detailed explanation. I have one more doubt related to this. I am getting a warning when I run the following code:

`default_nettype none

module test(
input  reg sig1,
output logic sig2);
reg [1:0] ab;
endmodule

xmvlog: *W,NODNTW (test.sv,4|14): Implicit net port (sig1) is not allowed since `default_nettype is declared as 'none'; 'wire' used instead [19.2(IEEE 2001)]. why it is referring input reg sig1 as an implicit net port, I already explicitly declared it as reg? As per the message it is changing to wire so will the statement be like "input wire reg sig1" ?

Can we declare input reg a; in systemverilog(input port with reg type) ? Is this implicitly equivalent to input wire reg a; (if I dont use `default_nettype none)


Solution

  • Verilog is littered with implicit defaults all over the place. When you write

    module m(a);
      initial $display(a);
    endmodule
    

    this is implicitly the same as

       //    direction kind type  range  signal
    module m(inout     wire logic [0:0]  a);
      initial $display(a);
    endmodule
    

    For inout and input directions, if you omit the kind the default is wire or taken from the `default_nettype setting. The none setting generates an error. However, the default kind for an output is different. As soon as you add a datatype to an output, the default kind goes to var, which is similar to non-port declarations. See this post for more details and examples.

    However, very early versions of SystemVerilog/Superlog had input and inout with the same kind default as output. The -svinputport=var switch was added for a very large microprocessor developer customer whose name I cannot mention who did not want to change their code. The =net options is the behavior I mentioned above and is the way current LRM is defined.

    The other two options are hybrids between the var/net options, mainly for lazy people using the default_nettype none options and don't want to see errors in their port declarations.