Re: [sv-bc] Treatment of parameters in interfaces.

From: Greg Jaxon <Greg.Jaxon@synopsys.com>
Date: Thu Jul 15 2010 - 11:49:20 PDT
An interface port's parameter is not referenced hierarchically: the root identifier is
a formal interface port name, not an instance, block or hierarchical name.

One question is whether it is constant enough for all purposes - here is a brief analysis
  1. In Kaiming's example 1, the constant expression is just a localparam, and the dependences are shallow.
    Suppose we make "w" a full parameter of "dut", then the interface port is providing w's default value.

    This gets complicated, but it does no fresh harm to the comprehensibility of the design elaboration rules.
    Recall that parameter formulae may refer to each other much like spreadsheet recipes.
    They execute when an instantiation requires elaboration of the module/interface template.
    The "spreadsheet" has to be run as if a fresh elaboration were occurring before the test can be made for whether the identical parameter settings have already been elaborated (in some systems duplicate elaboration is undesirable).
    The interface port parameter is nothing more than a new reference trick in the spreadsheet repertoire.
    So long as the interface type of the actual port is "constant" for each down design instance, parameter
    values within it will be constant enough.

  2. If the interface port is a virtual interface, I'm not sure the expression should be considered constant.
    This would be like using a free variable in a constant expression.
    A simulation semantics expert should weigh in on this.

  3. Whether the reference (to vid_in.w in Kaiming's example) is constant is not an invariant feature of the module in which it occurs.
    It depends on the features of the actual interface type ( intf_vidbus here).
    For a generic interface vid_in.w might be constant at one instantiation and variable at another.
A more practical question is whether the parser can definitively tell that the root identifier of the reference
is a port of some interface type.  A few parsing hazards come to mind:
  1. If the default value is set in a #( parameter_list ) before the port is named, this would not be obvious to a single pass scanner.
  2. If the parameter expression is written before the non-ANSI style declaration of the port's interface_type,
    this would be another forward reference hazard.
  3. If the name space of module instance names contains a homonym of the port, (2) could be genuinely ambiguous.
The "declaration before reference" rule ought to apply here.

Hope this helps the group think this through.
Greg


Gordon Vreugdenhil wrote:
Keep in mind that the primary reason for the hierarchical
reference restrictions on parameters is to have (semi-)comprehensible
rules for design elaboration ...


Rich, Dave wrote:
  
Kaiming,

The answer to question a) is clearly yes. sec 25.10 [... objects that are not permissible to be listed 
in a modport shall remain accessible.] A parameter cannot be listed in a modport, therefore it is always accessible.

The answer to b) depends on the answer to c). If referencing a parameter through an interface port reference is not a hierarchical reference, then the rule that says constant expressions cannot contain hierarchal references does not apply.

In my opinion, an interface port reference is not a hierarchical reference unless the actual interface connection is a hierarchical reference (something I wanted to disallow).

Dave




    
-----Original Message-----
From: owner-sv-bc@eda.org [mailto:owner-sv-bc@eda.org] On Behalf Of
Kaiming Ho
Sent: Thursday, July 15, 2010 8:25 AM
To: sv-bc@eda.org
Subject: [sv-bc] Treatment of parameters in interfaces.

Interfaces which appear on a module's port-list may have parameters
and access to these parameters are an important part of an RTL
design methodology which uses interfaces as opposed to individual
port in/out declarations.

Within the context of the two examples below, I'd like clarification
to the following questions:

(a) access to interface parameters is always permitted, irrespective
     if the interface is connected through a modport or not.
(b) interface parameters are constants.  They can be used in
     constant expressions
(c) access to interface parameters are not considered hierarchical
     references. Therefore, they can be used to define new parameters.

The examples are:
-----------------------------------------------------------------
(1)
   // bus for carrying video samples, of parametrisable width.
interface intf_vidbus;
   parameter w = 8;
   logic valid, last_sample;
   logic [w-1:0] data;
endinterface

module dut (input clk, intf_vidbus vid_in, vid_out);
     // need to know the width of the connected interface
   localparam sample_width = vid_in.w;
     // register incoming sample
   reg [sample_width:1] samp_reg;
   always @(posedge clk) if (valid) samp_reg <= vid_in.data;
     // do some processing
   reg [2+sample_width:1] samp_new;
   always @(posedge clk) samp_new <= 2*samp_reg + vid_in.data;
endmodule

(2)
   // axi-like soc bus.  request portion
interface intf_axi_req;
   logic [31:0] addr; logic addr_valid;
   logic  [1:0] req_type; logic [7:0] req_size;
   logic   wdata_valid;
   parameter int unsigned wdata_bytes_lg2 = 1;  // 0==8b, 1==16b, 2==32b,
3==64b
   logic [8*(1<<wdata_bytes_lg2):1] wdata;
endinterface

module dut2 (input clk, reset_n, intf_axi_req req_bus);
   // assume that req_bus can only be 8, 16, 32 or 64bits wide
initial $display ("%m: req_bus width %0d", req_bus.wdata_bytes_lg2);
always @* assert(req_bus.wdata_bytes_lg2 <= 3);
   // accumulate 8, 4, 2 or 1 cycles to form 64 bits
reg [4:0] cnt;
reg [63:0] acc_reg; reg acc_reg_valid;
always @(posedge clk or negedge reset_n)
   if (~reset_n) cnt <= 0;
   else if (req_bus.wdata_valid)
     cnt <= (cnt+1 == 8>>req_bus.wdata_bytes_lg2) ? 0 : cnt+1;
always @(posedge clk)
   if (req_bus.wdata_valid)
     begin
     acc_reg <= (acc_reg << 8*(1<<req_bus.wdata_bytes_lg2)) |
                   req_bus.wdata;
     acc_reg_valid <= cnt+1 == 8>>req_bus.wdata_bytes_lg2;
     end
endmodule
//-----------------------------------------------------------------

and have been taken from real designs I've recently dealt with.  They
show realistic examples of where knowledge of a parameter in a connected
interface is important.

Currently, various simulators treat the examples differently, with some
allowing both (1) and (2) while others disallow both (1) and (2).
The synthesis tools I've tried do not allow (1) but allow (2).  For this
reason, I feel that it is important to achieve consensus on this so that
the tools can converge.

This issue, in particular (1), has come up before:
    http://www.eda.org/sv-bc/hm/4269.html
and various followups in
    http://www.eda.org/sv-bc/hm/4282.html
    http://www.eda.org/sv-bc/hm/4308.html
    http://www.eda.org/sv-bc/hm/6497.html
My interpretation of the discussion back then was that while it was
unclear as to what the LRM says about the legality of the construct,
the followups lean towards allowing this. I support allowing the
constructs in (1) and (2), and hope that those examples provide
additional motivation towards this goal.

Several mantis' are potentially related to the questions raised. Mantis
1508 asks what a 'hierarchical reference' is, which is a key component
of question (c).  The approach described in section 23.7 regarding
'member selects' vs. 'hierarchical name', applied to interface variables
can indicate access to parameters inside interface is a member select.
Mantis 2573 relates to part of question (b).

Workarounds to this problem involving the 'typedef backdoor' only
partially resolve the problems the examples show.  They are inconvenient
and sometimes not practical.  Most importantly, synthesis tools don't
support it, and its hard to argue that such a construct is synthesiable.

Finally, if Mantis 2573 resolves to allow:
   reg [vid_in.w:1] samp_reg;
it opens yet another backdoor to question (c), namely:
   localparam sample_width = vid_in.w;
   localparam sample_width_workaround = $bits(samp_reg);


regards,
kaiming
--


--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
      
    

  

--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean. Received on Thu Jul 15 11:49:42 2010

This archive was generated by hypermail 2.1.8 : Thu Jul 15 2010 - 11:52:14 PDT