a programming/specification and verification problem … · 2 the problem i’m going to give you...

17
A programming/specification and verification problem based on the Intel QPI protocol (“QuickPath Interconnect”) Rishiyur S. Nikhil WG 2.8, April 2010, Shirahama © Bluespec, Inc., 2010 www.bluespec.com

Upload: trankhanh

Post on 09-Jul-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

A programming/specification and verification problembased on

the Intel QPI protocol (“QuickPath Interconnect”)

Rishiyur S. Nikhil

WG 2.8, April 2010, Shirahama

© Bluespec, Inc., 2010

www.bluespec.com

Page 2: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

2

The Problem

I’m going to give you an informal (but hopefully clear) description of

a part of a communication protocol, from Intel’s new “QuickPath

Interconnect”.

(Involves concurrency, mutual recursion, “real time”)

How would you formalize it in a programming language or

specification language of your choice?

And, how would you prove correctness properties about it?

If there is interest, I can show BSV code (Bluespec SystemVerilog)

for this, later in the week (rewrite rules).

This code is synthesizable to hardware (via Verilog).

I can share a PDF of this problem description, to remind you of the details

Page 3: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

3

QPI information used in this presentation

Everything in this presentation about QPI is

based only on information from the book

pictured at left, which can be purchased from

Intel Press and Amazon.com.

(no proprietary information)

Page 4: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

4

Where QPI is used

QPI link (point-to-point)

Intel’s FSB (Frontside Bus) was used for the

last 10 years to interconnect multiprocessor

components. QPI replaces FSB, and is

expected to be used for the next 10 years.

Page 5: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

5

QPI Protocol stack

Flits: 80 bits each

Phits: 20/40/80 bits each

Packets: 1-13 Flits

Page 6: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

6

Context

Concerns reliable delivery of bits on

point-to-point wires

Concerns conversion of protocol

packets into fixed-sized “flits”,

scheduling them over “virtual

channels”, and reliable delivery of

flits on point-to-point links,

Concerns communication of protocol

packets for cache-coherence,

uncached memory access, I/O, etc.

Packets need 1 or more flits

Concerns forwarding for multi-hop

communications

Focus of today’s problem

Page 7: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

7

Link Layer (LL) detail (based on QPI book)

put (ProtoPacket)

Format ProtoPacket into Flits,

Enter into a virtual channel (VC) queue

Arbitrate (choose flit to move to PhL),

with possible “interleaving”; add VC credits

Retry buffer

Calculate and check CRC

Send Flit to PhyL

from Retry Buffer (normal)

or LLR.Req, LLR.Ack, Null (special)

with returned VC credits

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Process Returned VC Credits

Accumulate multi-flit packets,

format flits into ProtoPackets,

bypass interleaved flits

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Null

Accum. flit acks

Accum. VC

credits

Maintain TailPtr (+8)

1 queue for each

of up to 13 Virtual

Channels

(6xVN0, 6xVN1,

1xVNA)

Physical Layer

Maintain VC credits

Return VC credits

Return Flit Ack (every 8)

LLR.Req(n)

LL

All this is background

context; now begins today’s

problem descriptionConceptually, every flit has a sequence number

(starting at 0); not actually carried on flits

Page 8: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

8

Link Layer (LL) detail (based on QPI book)

put (ProtoPacket)

Format ProtoPacket into Flits,

Enter into a virtual channel (VC) queue

Arbitrate (choose flit to move to PhL),

with possible “interleaving”; add VC credits

Retry buffer

Calculate and check CRC

Send Flit to PhyL

from Retry Buffer (normal)

or LLR.Req, LLR.Ack, Null (special)

with returned VC credits

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Process Returned VC Credits

Accumulate multi-flit packets,

format flits into ProtoPackets,

bypass interleaved flits

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Null

Accum. flit acks

Accum. VC

credits

Maintain TailPtr (+8)

1 queue for each

of up to 13 Virtual

Channels

(6xVN0, 6xVN1,

1xVNA)

Physical Layer

Maintain VC credits

Return VC credits

Return Flit Ack (every 8)

LLR.Req(n)

LL

Today’s problem is

limited to this part

(details following ...)

sequence of flits in (at one end of a link)

= sequence of flits out (at other end),

in both directions

All this is background

context; now begins today’s

problem descriptionConceptually, every flit has a sequence number

(starting at 0); not actually carried on flits

Page 9: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

9

Moving flits: 1st approximation

put (ProtoPacket)

Move flits from virtual channel queues into

Retry Buffer

Retry buffer

If flit available from Retry Buffer, send it;

else send NULL flit.

Add Ack bits as needed

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Process Returned Flit Ack

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer

Return Flit Ack (every 8)

LL

A flit must be sent on every clock; if none available, send a NULL flit

For each 8 flits you receive, send an Ack bit back on a flit going the other way

Null

Page 10: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

10

Moving flits: 2nd approximation

put (ProtoPacket)

Move flits from virtual channel queues into

Retry Buffer

Retry buffer

Calculate and check CRC

If LLR.Req or LLR.Ack needed, send it;

else if flit available from Retry Buffer, send it;

else send NULL flit.

Add Ack bits as needed

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer (noisy)

Return Flit Ack (every 8)

LLR.Req(n)

LL

Flits may be corrupted in the Physical Layer; detect this using a CRC check

For now, assume LLR.Req and LLR.Ack flits are not themselves corrupted

Null

But the

re’s

a bug!

Ackbits

can g

et

lost; ev

entual

ly

the Re

try Buf

fer

will be

come “F

ull”

and ge

t stuck

Page 11: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

11

Moving flits: 2nd approximation (partially fixed)

put (ProtoPacket)

Move flits from virtual channel queues into

Retry Buffer;

Add Ack bit as needed

Retry buffer

Calculate and check CRC

If LLR.Req or LLR.Ack needed, send it;

else if flit available from Retry Buffer, send it;

else send NULL flit.

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer (noisy)

Return Flit Ack (every 8)

LLR.Req(n)

LL

Flits may be corrupted in the Physical Layer; detect this using a CRC check

For now, assume LLR.Req and LLR.Ack flits are not themselves corrupted

Null

Still a

proble

m

Page 12: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

12

Moving flits: 2nd approximation (bug fixed)

put (ProtoPacket)

Retry buffer

Calculate and check CRC

If LLR.Req or LLR.Ack needed, send it;

else if flit available from Retry Buffer, send it;

else send NULL flit.

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Null

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer (noisy)

Return Flit Ack (every 8)

LLR.Req(n)

LL

Flits may be corrupted in the Physical Layer; detect this using a CRC check

For now, assume LLR.Req and LLR.Ack flits are not themselves corrupted

Move flits from virtual channel queues into

Retry Buffer

Add NULL flit with Ack bit as needed

Page 13: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

13

Moving flits: final version (extra credit)

put (ProtoPacket)

Retry buffer

Calculate and check CRC

If LLR.Req or LLR.Ack needed, send it;

else if flit available from Retry Buffer, send it;

else send NULL flit.

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Null

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer (noisy)

Return Flit Ack (every 8)

LLR.Req(n)

LL

Now assume LLR.Req and LLR.Ack flits may also be corrupted (bad CRC).

Eventually, LL must go to “error state”, but invent a mechanism that doesn’t give up too easily

Move flits from virtual channel queues into

Retry Buffer

Add NULL flit with Ack bit as needed

Page 14: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

End

Page 15: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

Slides accompanying a code-walkthroughof the BSV solution to the QPI problem

Rishiyur S. Nikhil

WG 2.8, April 2010, Shirahama

© Bluespec, Inc., 2010

www.bluespec.com

Page 16: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

16

Moving flits

put (ProtoPacket)

Retry buffer

Calculate and check CRC

If LLR.Req or LLR.Ack needed, send it;

else if flit available from Retry Buffer, send it;

else send NULL flit.

Write Ptr

Read Ptr Tail Ptr

get (Flit) put (Flit)

get (ProtoPacket)

Initiate LLR.Req (seqnum)

Initiate LLR.Ack, back

up Read Ptr to flit n

Discard while

waiting for LLR.Ack

LLR.Ack

Stop discard,

resume normal

Process Returned Flit Ack

Bad CRC

Start

discarding

Null

Accum. flit acks

Maintain TailPtr (+8)

Physical Layer (noisy)

Return Flit Ack (every 8)

LLR.Req(n)

LL

Move flits from virtual channel queues into

Retry Buffer

Add NULL flit with Ack bit as needed

Page 17: A programming/specification and verification problem … · 2 The Problem I’m going to give you an informal (but hopefully clear) description of a part of a communication protocol,

17

Testbench

Module structure

Link Layer (LL) Model

Stub to generate

PrL packets

Physical Layer stub transporting Flits

with random CRC “error injection”

Link Layer (LL) Model

Verify TapTap

Stub to generate

PrL packets