[sv-bc] FW: [sv-ec] Confusing packed struct assignment rules in LRM

From: Arturo Salz <Arturo.Salz_at_.....>
Date: Fri Aug 31 2007 - 10:21:05 PDT
 

 

________________________________

From: owner-sv-ec@eda.org [mailto:owner-sv-ec@eda.org] On Behalf Of
Bryan Bullis (bbullis)
Sent: Friday, August 31, 2007 8:24 AM
To: sv-ec@eda.org
Subject: [sv-ec] Confusing packed struct assignment rules in LRM

 

Committee,

 

Please forgive me if this is directed to the wrong committee.  I am
reading the LRM and find section 6.7 somewhat confusing.  The confusion
arises from mostly the examples.  The text is pretty clear as it says
its "an error to have a packed ....".  I interpret this to mean either
by struct member or by bit reference.  However the first set of examples
seems to suggest otherwise if the reader sees them as a collective
example rather than discrete examples taken on their own.  The next set
of illegal examples I believe are to be read as a set.  Meaning you
can't do both assign types together.  Perhaps this has already been
address, if so my apologies for raising the question.

 

=== Text Snippet from the LRM =====

SystemVerilog variables can be packed or unpacked aggregates of other
types. Multiple assignments made

to independent elements of a variable are examined individually. An
assignment where the left-hand side

contains a slice is treated as a single assignment to the entire slice.
It shall be an error to have a packed structure

or array type written with a mixture of procedural and continuous
assignments. Thus, an unpacked

structure or array can have one element assigned procedurally and
another element assigned continuously.

And, elements of a packed structure or array can be assigned with
multiple continuous assignments, provided

that each bit is covered by no more than a single continuous assignment.
For example, assume the following

structure declaration:

struct {

  bit [7:0] A;

  bit [7:0] B;

  byte C;

} abc;

 

The following statements are legal assignments to struct abc:

assign abc.C = sel ? 8'hBE : 8'hEF;

not (abc.A[0],abc.B[0]),

(abc.A[1],abc.B[1]),

(abc.A[2],abc.B[2]),

(abc.A[3],abc.B[3]);

always @(posedge clk) abc.B <= abc.B + 1;

 

The following additional statements are illegal assignments to struct
abc:

// Multiple continuous assignments to abc.C

assign abc.C = sel ? 8'hDE : 8'hED;

// Mixing continuous and procedural assignments to abc.A

always @(posedge clk) abc.A[7:4] <= !abc.B[7:4];

=====================================================
Bryan Bullis                 
ASIC Design Engineer        phone: (919) 392-3013   
Router Technology Group     fax:   (919) 392-4537    
Cisco Systems, Inc.         email: bbullis@cisco.com

 


-- 
This message has been scanned for viruses and 
dangerous content by MailScanner <http://www.mailscanner.info/> , 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 Fri Aug 31 10:21:31 2007

This archive was generated by hypermail 2.1.8 : Fri Aug 31 2007 - 10:21:59 PDT