Presentation is loading. Please wait.

Presentation is loading. Please wait.

Verifying a Commercial Microprocessor Design at the RTL level Ken McMillan Cadence Berkeley Labs

Similar presentations


Presentation on theme: "Verifying a Commercial Microprocessor Design at the RTL level Ken McMillan Cadence Berkeley Labs"— Presentation transcript:

1 Verifying a Commercial Microprocessor Design at the RTL level Ken McMillan Cadence Berkeley Labs mcmillan@cadence.com

2 We will consider some of the problems involved in verifying the actual RTL code of a commercial processor design, as opposed to an architectural model. This is a work in progress...

3 Outline Methodology The PicoJava design Verification Strategy Problems

4 Proof Methodology property decomposition model checking abstraction parameterization “circular” assume/guarantee proof divide into “units of work” temporal “case splitting” identify resources used abstract interpretation reduce to finite state

5 q   p p   q Gp  Gq “Circular” assume/guarantee Let p   q stand for “if p up to time t-1, then q at t” Equivalent in LTL of  (p U  q) Now we can reason as follows: That is, if neither p nor q is the first to be false, then both are always true.

6 Using a reference model Ref. Model A B q p q   p p   q Gp  Gq e.g., programmer’s model A and B each perform a “unit of work” refinement relations (temporal properties) “circular” proof:

7 Temporal case splitting p1p1 p2p2 p3p3 p4p4 p5p5 v1v1... Idea: parameterize on most recent writer w at time t.  : I'm O.K. at time t.  i: G((w=i)   ) G 

8 Abstract interpretation Problem: variables range over unbounded set U Solution: reduce U to finite set Û by a parameterized abstraction, e.g., where U\i represents all the values in U except i. Need a sound abstract interpretation, such that: if  is valid in the abstraction, then, for all parameter valuations,  is valid in the original. Û = {{i}, U\i}

9 Data type abstractions in SMV Examples: –Equality –Function symbol application ={i}U\i {i} U\i 1 0 0  ^ ^ x f(x)f(i) {i}U\i  Unbounded array reduced to one fixed element! Note: truth value under abstraction may be  represents “no information”

10 Applying abstraction pipi v1v1...  : I'm O.K. at time t.    ((w=i)   ) abstracted elements i.e, if p i is the most recent to modify v 1, then v 1 is correct. Must verify by model checking:

11 Review By a sequence of three steps: –“circular” assume/guarantee reasoning (restricts to one “unit of work”) –case splitting (adding parameters) (identifies resources used in that unit of work) –abstraction interpretation (abstracts away everything else)...we reduce the verification of an unbounded system of processes to a finite state problem.

12 PicoJava Stack machine architecture Implements Java bytecode interpreter in hardware I$ D$ FoldFold Integer pipe Stack $ BusIntfBusIntf Mem u-Code

13 Instruction path We will concentrate on I$ and Fold units. DecodeDecode Queue 0 15 I$ Align BusIntfBusIntf Mem 8 4 PC FoldFold bytesinsts

14 Specification strategy Since implementation is very large and complex, we need a specification strategy that allows a fine-grain decomposition of the proof. Topics: –Reference Model –Histories –Tags and Refinement Relations –Dealing with Exceptions

15 Reference Model Programmer’s view of Java machine (ISA) –contains only programmer visible state Mem PC SP PSR

16 Relating Impl to Ref Model Specify Impl w.r.t. reference model history Mem PC SP PSR Ref Model... History Complete state Implementation Refinement relation Interleave

17 Correctness criterion Correctness is defined as follows: –There exists some interleaving of Impl and Ref, such that the given relation holds between Impl and history. Must choose a witness interleaving –Any interleaving that ensures reference model “stays ahead of” the implementation. We use this approach because one step of implementation may correspond to many steps of reference model.

18 Multiple histories Instructions are a variable number of bytes Some parts of Impl deal with bytes, some with instructions. Keep two histories: –Byte level history (stream of instruction bytes) –Inst level history (stream of instructions) We could also record history at coarser granularity if needed...

19 Tags and refinement relations Tags are auxiliary state information Tags are pointers into a history (byte or inst) Tags flow with data Refinement relations –Are temporal specifications of data correctness –Use tags to locate correct value of data in history Note, we sometimes have to prove equality of tags to show correct data flow

20 Tags for instruction path DecodeDecode Queue 0 15 I$ Align BusIntfBusIntf Mem 8 4 PC FoldFold bytesinsts byte history tag inst history tag equality proof + ++ + incremented tag derived tag = = =

21 Alignment between histories Comparing tags into byte and inst histories –record byte history position of each inst... Inst history... Byte history

22 Dealing with Exceptions Exceptions (e.g., branch mispredictions) –pipeline may be executing incorrect instructions –incorrect instructions must be flushed Specification strategy –Define tag “max” latest instruction correctly fetched –Data with tag after “max” is unspecified... History max data correctdata unspecified

23 Summary of approach Strategy –Reference model/ Histories/ Tags Localization of verification –Model checking can be localized to very small scale. –State explosion is not a problem.

24 Problems

25 Accidents happen to words Verification depends strongly on abstraction of data types. –Use uninterpreted types and functions. –32-bit word might be abstracted to: { a, b, ~ } where a and b are parameters of a property. Problem: –In RTL descriptions, words are often arbitrarily broken into bits and reassembled.

26 Example accident 8-bit register implemented in cells: module reg8(clk,inp,out); input clk, inp[7:0]; output out[7:0]; reg1 cell0(clk,inp[0],out[0]);... reg1 cell7(clk,inp[7],out[7]); endmodule The state is actually held in bits. How do we abstract the state?

27 Example Accident Verilog can’t make 2-D arrays! module foo(bits,...); input bits[63:0]; byte0 = bits[7:0];... byte7 = bits[63:56];... Instead of an array of bytes, we get 64 bits!

28 A pragmatic approach If possible, verify property at bit level –Words must not index large arrays –Can use “bit slicing” Else, use two-level approach –Make intermediate model at word level –Verify properties using abstractions –Verify intermediate model at bit level This avoids re-modeling the entire design using uninterpreted types and functions.

29 Bit-field abstractions Words are often divided into fields Typical abstraction –property has parameters t ($ Tag) and a ($ Addr) 031 $Tag$ Addr$ Off 414 031 {t,~}{a,~}{0..15} 414

30 But accidents happen... Adresses of many different bit lengths occur 31 $Tag$ Addr 414 Cache line 031 $Tag$ Addr$ Off 414 331 $Tag$ Addr 414 Half cache line 231 $Tag$ Addr 414 Word Byte $ Addr 414 Cache location Since types are not structured, how does a tool know how to divide and abstract these bit vectors?

31 Manual approach Re-model using structured types –i.e., instead of a bit vector, use: struct { tag : $TAG; addr : $ADDR; offset : array 3..0 of boolean; } Prove model correct at bit level Prove property using type-based abstractions –examples: cache contents correctness, aligner output, etc...

32 Mapping between representations Sometimes need to translate between representations with uninterpreted functions –example: 031 $Tag$ Addr$ Off 414 031 $Address ftft fafa fofo f inv (Must manually instantiate injectiveness axiom)

33 What’s needed? Ability to abstract any bit-field of a word –conceptually straightforward Some heuristic method of grouping bits together and assigning them types? –less obvious Essentially, we need to be able to reverse-engineer a bit-level design into a structured design.

34 Incoherence Few processors implement ISA precisely –makes writing a specification difficult Example: three incoherent caches in PicoJava –Instruction (I) –Data (D) –Stack (S) How to handle mismatch between ISA and Impl?

35 Solution (?) Mark every address as valid/invalid for I,D,S Example: –I becomes valid when I$ line explicitly flushed –I becomes invalid when location written as data Assume program never reads invalid addresses PC SP PSR Mem IDS Problem: Pipe delay means address is readable unknown number of clock cycles after flush instruction (???)

36 Accidental correctness Example: –decode not one-hot until first queue load (!) –but, in PSR, Fold unit not enabled at reset –one instruction required to enable Fold unit –hence one-hot when Fold unit enabled! Queue 0 15 PC FoldFold bytesinsts Decode must be one-hot here Note, local property (one-hotness) depends on far away logic (PSR, integer unit, etc...). This is not written anywhere because no one actually knows why circuit works!

37 Conclusions (?) Compositional verification of real processors at RTL level is possible. –Reference model/ Histories/ Tags Several aspects of typical RTL descriptions make it much more difficult: –Bit-level representation of words –Lack of structured data types –Accidental correctness Design for formal verification could largely correct these problems.


Download ppt "Verifying a Commercial Microprocessor Design at the RTL level Ken McMillan Cadence Berkeley Labs"

Similar presentations


Ads by Google