[sv-bc] Mantis 1702 unpacked concatenation of arrays

From: Rich, Dave <Dave_Rich_at_.....>
Date: Mon Dec 03 2007 - 23:44:12 PST
During today's sv-ec discussion on this mantis issue, I was asked to
poll users on their opinions about a few subtle but crucial issues
surrounding the implementation of a queue. The implementation may expose
user visible behaviors and will have a direct impact on the direction we
take resolving 1702.

 

The first issue is independent of the concatenation and is general to
queues. This shows up when an element of a queue is passed by reference
to a task and that task later modifies that element after the original
queue has modified the number of elements in the queue. Understanding
the semantics of this example will help explain the dilemma we face. 

 

module top;

   task automatic incr(ref int arg);

      #10 arg++;

   endtask

 

   int q[$];

   initial begin

      q = '{1,3,5,7};

      fork

             incr(q[0]); // front of queue q[0] = 1

             incr(q[$]); // back of queue q[3] = 4

      join_none

      #5 q.push_back(9);

      #10

            $display("q=%p",q);

   end

endmodule : top

 

What should the final contents of the queue be? Section 13.5.2 of draft
indicates that since no elements of the q have been deleted, the
references are still current (not outdated) and q = '{2,3,5,8,9};. I
think there is consensus on this answer.

 

But what if I replace the q.push_back(9) with. Again, using the same
rule, no elements have been deleted and the references are still
current. The LRM is not clear which elements the current references
point to. So is the result

 

a) q = '{9,2,3,5,8}  - the reference is a handle to the element, or

b) q = '{10,1,3,6,7} - the reference is a handle to the queue + an
offset?

 

I believe the intent is answer a), and most implementers prefer a)
because the task that has the reference argument does not need to know
anything about what kind of int reference it has. However I have heard
user expectations either way. Do others agree or disagree?

 

Now to the second issue that is more specific to unpacked concatenation.
What if the queue methods are replaced with concatenation:

 

q = {9,q}; // is this equivalent to a q.push_front(9)?

 

Some possible answers that depend on the implementation details of the
queue are:

 

a) q = '{9,2,3,5,8} - the same as the result of q.push_front(9)

b) q = '{10,1,3,6,7} - unlikely queue is implemented as an array

c) q = '{9,1,3,5,7} - all references become outdated because the queue
is copied in whole

d) Implementation dependent result between a) and c) (already
discounting b))

 

Choice a) is problematic because we are not going to get consensus on
the forms of concatenation that can be recognized as equivalent methods
within the current schedule. Even if we were to get agreement on the
forms that can be recognized, we would still have to agree on the
behavior of the forms that couldn't be recognized. 

 

Choice b) I hope can be eliminated from the discussion. (Same as first
issue)

 

Choice c) is problematic because we will never be able to back to a) in
a later revision of the LRM and it prevents optimizations when dealing
with large queues by forcing a copy of the queue. For example, assume q1
has a large number of elements:

q1 = {q1,q2, q3}; // concatenate multiple queues

q1 = q1[0:$-5]; // delete multiple elements

q1 = q1[n:m]; // take a slice if a queue

We could create more queue methods to address the optimization concerns.

 

Choice d) is problematic because users don't like non-portable results.

 

Do users have any opinions on the choices given? 

 

 

 

 

 

David Rich
Verification Technologist
Design Verification & Test Division
Mentor Graphics Corporation
dave_rich@mentor.com
Office:   408 487-7206
Cell:     510 589-2625

 


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Tue Dec 4 00:16:27 2007

This archive was generated by hypermail 2.1.8 : Tue Dec 04 2007 - 00:18:16 PST