constructive computer architecture tutorial 2 debugging ...csg.csail.mit.edu › 6.175 › lectures...

40
Constructive Computer Architecture Tutorial 2 Debugging BSV and Typeclasses. 10/8/2017 http://csg.csail.mit.edu/6.175 T01-1

Upload: others

Post on 09-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Constructive Computer Architecture

Tutorial 2

Debugging BSV andTypeclasses.

10/8/2017 http://csg.csail.mit.edu/6.175 T01-1

Page 2: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Outline

Debugging BSV code

Typeclasses and functional style.

And maybe conflict-Freeness

10/8/2017 L03-2http://csg.csail.mit.edu/6.175

Page 3: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Software DebuggingPrint Statements

See a bug, not sure what causes it

Add print statements

Recompile

Run

Still see bug, but you have narrowed it down to a smaller portion of code

Repeat with more print statements…

Find bug, fix bug, and remove print statements

10/8/2017 L03-3http://csg.csail.mit.edu/6.175

Page 4: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

BSV DebuggingDisplay Statements

See a bug, not sure what causes it

Add display statements

Recompile

Run

Still see bug, but you have narrowed it down to a smaller portion of code

Repeat with more display statements…

Find bug, fix bug, and remove display statements

10/8/2017 L03-4http://csg.csail.mit.edu/6.175

Page 5: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

BSV Display Statements

The $display() command is an action that prints statements to the simulation console

Examples: $display(“Hello World!”);

$display(“The value of x is %d”, x);

$display(“The value of y is “,

fshow(y));

10/8/2017 L03-5http://csg.csail.mit.edu/6.175

Page 6: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Ways to Display ValuesFormat Specifiers

%d – decimal

%b – binary

%o – octal

%h – hexadecimal

%0d, %0b, %0o, %0h

Show value without extra whitespace padding

10/8/2017 L03-6http://csg.csail.mit.edu/6.175

Page 7: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Ways to Display Valuesfshow

fshow is a function in the FShow typeclass

It can be derived for enumerations and structures

Example:

typedef emun {Red, Blue} Colors deriving(FShow);

Color c = Red;

$display(“c is “, fshow(c));

10/8/2017 L03-7http://csg.csail.mit.edu/6.175

Prints “c is Red”

Page 8: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Two big families of bugs

Functional bug

E.g “a*d+b*c” instead of “a*d-b*c”

Liveness bug

Scheduling issue

10/8/2017 L03-8http://csg.csail.mit.edu/6.175

Page 9: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Functional bug

module mkTest(Det);

method ActionValue#(Data) det(Data a,Data

b,Data c,Data c);

let res = a*d + b*c;

$display(“%d %d %d %d %d”, a,b,c,d, res);

return res;

endmethod

Endmodule

10/8/2017 L03-9http://csg.csail.mit.edu/6.175

Page 10: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

Add $display(“Name rule”) in every rule and method of your design.

You get to see what is firing.

There are probably not firing when they should:

Think about the implicit and explicit guards that would prevent a rule/method to fire.

If thinking is not enough?

10/8/2017 L03-10http://csg.csail.mit.edu/6.175

Page 11: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

If thinking is not enough:

You can add an extra rules that just print the explicit guards of all the methods

10/8/2017 L03-11http://csg.csail.mit.edu/6.175

Page 12: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

module mkTest(Det);

[…]

rule problematic (complexExpression);

$display(“Problematic fire”);

[…] //Other stuff (methods called etc…)

endrule

endmodule

10/8/2017 L03-12http://csg.csail.mit.edu/6.175

Page 13: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

module mkTest(Det);

[…]

rule debugRule;

$display(“Guard is %b”,complexExpression);

endrule;

rule problematic (complexExpression);

$display(“Problematic fire”);

endrule

endmodule

10/8/2017 L03-13http://csg.csail.mit.edu/6.175

Page 14: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Liveness

If the guard is false when you expected it to be true:

Well you just found your problem

If the guard is true:

Check the implicit guards with the same technique:

10/8/2017 L03-14http://csg.csail.mit.edu/6.175

Page 15: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

module mkTest(Det);

[…]

rule debugRule;

$display(“Guard is %b”,complexExpression);

endrule;

rule problematic (complexExpression);

$display(“Problematic fire”);

[…]

submodule1.meth1();

endrule

endmodule

10/8/2017 L03-15http://csg.csail.mit.edu/6.175

Page 16: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

module mkSubmodule1(Submodule1);

rule debugRule;

$display(“Guard is %b”,complexExpression);

endrule;

method Action meth1()if(complexExpression);

[…]

endmethod

endmodule

10/8/2017 L03-16http://csg.csail.mit.edu/6.175

Page 17: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Method for debugging liveness

Repeat until you are confident that the problem does not come from a false guard:

Reminder: registers can always be written and read so they don’t pose problem for guards.

Usually you don’t have to do that recursively because you already know that your submodules are corrects.

10/8/2017 L03-17http://csg.csail.mit.edu/6.175

Page 18: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

All my guards are good,still it does not work

10/8/2017 L03-18http://csg.csail.mit.edu/6.175

Page 19: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

All my guards are good,still it does not work

Scheduling problem: an other rule is preventing the one I want to fire.

10/8/2017 L03-19http://csg.csail.mit.edu/6.175

Page 20: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

All my guards are good,still it does not work

module mkTest();

[…]

rule r1;

[…]

myfifo.enq(1);

endrule

rule r2;

[…]

myfifo.enq(2);

endrule

endmodule

10/8/2017 L03-20http://csg.csail.mit.edu/6.175

Page 21: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Final note: be careful

module mkTest();

[…]

rule r1;

[…]

x <= y;

endrule

rule r2;

[…]

$display(“x is” ,x);

y <=2;

endrule

endmodule

10/8/2017 L03-21http://csg.csail.mit.edu/6.175

Don’t display value within a rule that are not already read by that rule

Page 22: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Typeclasses

10/8/2017 L03-22http://csg.csail.mit.edu/6.175

Page 23: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

TypeclassesA typeclass is a group of functions that can be defined on multiple typesExamples:

typeclass Arith#(type t);

function t \+(t x, t y);

function t \-(t x, t y);

// ... more arithmetic functions

endtypeclass

typeclass Literal#(type t);

function t fromInteger(Integer x);

function Bool inLiteralRange(t target,

Integer literal);

endtypeclass

10/8/2017 http://csg.csail.mit.edu/6.175 T02-23

Page 24: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Instances

Types are added to typeclasses by creating instances of that typeclass

instance Arith#(Bit#(n));

function Bit#(n) \+(Bit#(n) a, Bit#(n) b);

return truncate(csa(a,b));

endfunction

function Bit#(n) \-(Bit#(n) a, Bit#(n) b);

return truncate(csa(a, -b));

endfunction

// more functions...

endinstance

10/8/2017 http://csg.csail.mit.edu/6.175 T02-24

Page 25: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Provisos

Provisos restrict type variables used in functions and modules through typeclasses

If a function or module doesn’t have the necessary provisos, the compiler will throw an error along with the required provisos to add

The add1 function with the proper provisos is shown below:

10/8/2017 http://csg.csail.mit.edu/6.175

function t add1(t x) provisos(Arith#(t), Literal#(t));

return x + 1;

endfunction

T02-25

Page 26: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Special Typeclasses for Provisos

There are some Typeclasses defined on numeric types that are only for provisos:Add#( n1, n2, n3 )

asserts that n1 + n2 = n3

Mul#( n1, n2, n3 )

asserts that n1 * n2 = n3

An inequality constraint can be constructed using free type variables since all type variables are non-negative Add#( n1, _a, n2 )

asserts that n1 + _a = n2 equivalent to n1 <= n2 if _a is a free type variable

10/8/2017 http://csg.csail.mit.edu/6.175 T02-26

Page 27: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

The Bits Typeclasses

The Bits typeclass is defined below

typeclass Bits#(type t, numeric type tSz);

function Bit#(tSz) pack(t x);

function t unpack(Bit#(tSz) x);

endtypeclass

This typeclass contains functions to go between t and Bit#(tSz)

mkReg(Reg#(t)) requires t to have an instance of Bits#(t, tSz)

10/8/2017 http://csg.csail.mit.edu/6.175 T02-27

Page 28: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Custom Bits#(a,n) instance

typedef enum { red, green, blue } Color deriving (Eq); // not bits

instance Bits#(Color, 2);

function Bit#(2) pack(a x);

if( x == red ) return 0;

else if( x == green ) return 1;

else return 2;

endfunction

function Color unpack(Bit#(2) y)

if( x == 0 ) return red;

else if( x == 1 ) return green;

else return blue;

endfunction

endinstance

10/8/2017 http://csg.csail.mit.edu/6.175 T02-28

Page 29: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Typeclasses Summary

Typeclasses allow polymorphism across types Provisos restrict modules type parameters

to specified type classes

Typeclass Examples: Eq: contains == and != Ord: contains <, >, <=, >=, etc. Bits: contains pack and unpack Arith: contains arithmetic functions Bitwise: contains bitwise logic FShow: contains the fshow function to

format values nicely as strings

10/8/2017 http://csg.csail.mit.edu/6.175 T02-29

Page 30: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Conflict-freeness.

Or be careful for what you wish

10/8/2017 L03-30http://csg.csail.mit.edu/6.175

Page 31: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Up/Down CounterConflicting design

module mkCounter( Counter );

Reg#(Bit#(8)) count <- mkReg(0);

method Bit#(8) read;

return count;

endmethod

method Action increment;

count <= count + 1;

endmethod

method Action decrement;

count <= count – 1;

endmethod

endmodule

10/8/2017 http://csg.csail.mit.edu/6.175

Can’t fire in the same cycle

T02-31

Page 32: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Concurrent DesignA general technique

10/8/2017 http://csg.csail.mit.edu/6.175

Replace conflicting registers with EHRsChoose an order for the methodsAssign ports of the EHR sequentially to the methods depending on the desired schedule

Method described in paper that introduces EHRs: “The Ephemeral History Register: Flexible Scheduling for Rule-Based Designs” by Daniel Rosenband

T02-32

Page 33: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Up/Down CounterConcurrent design: read < inc < dec

module mkCounter( Counter );

Ehr#(3, Bit#(8)) count <- mkEhr(0);

method Bit#(8) read;

return count[ ];

endmethod

method Action increment;

count[ ] <= count[ ] + 1;

endmethod

method Action decrement;

count[ ] <= count[ ] – 1;

endmethod

endmodule

10/8/2017 http://csg.csail.mit.edu/6.175

0

1 1

2 2

These two methods can use the same port

T02-33

Page 34: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Up/Down CounterConcurrent design: read < inc < dec

module mkCounter( Counter );

Ehr#(2, Bit#(8)) count <- mkEhr(0);

method Bit#(8) read;

return count[0];

endmethod

method Action increment;

count[0] <= count[0] + 1;

endmethod

method Action decrement;

count[1] <= count[1] – 1;

endmethod

endmodule

10/8/2017 http://csg.csail.mit.edu/6.175

This design only needs 2 EHR ports now

T02-34

Page 35: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Conflict-Free DesignA more or less general technique

10/8/2017 http://csg.csail.mit.edu/6.175

Replace conflicting Action and ActionValuemethods with writes to EHRs representing method call requests If there are no arguments for the method call, the

EHR should hold a value of Bool

If there are arguments for the method call, the EHR should hold a value of Maybe#(Tuple2#(TypeArg1,TypeArg2)) or something similar

Create a canonicalize rule to handle all of the method call requests at the same timeReset all the method call requests to False or tagged invalid at the end of the canonicalize rule

Guard method calls with method call requests If there is an outstanding request, don’t allow a

second one to happen

T02-35

Page 36: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Up/Down CounterConflict-Free design – methods

module mkCounter( Counter );

Reg#(Bit#(8)) count <- mkReg(0);

Ehr#(2, Bool) inc_req <- mkEhr(False);

Ehr#(2, Bool) dec_req <- mkEhr(False);

// canonicalize rule on next slide

method Bit#(8) read = count;

method Action increment if(!inc_req[0]);

inc_req[0] <= True;

endmethod

method Action decrement if(!dec_req[0]);

dec_req[0] <= True;

endmethod

endmodule

10/8/2017 http://csg.csail.mit.edu/6.175 T02-36

Page 37: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Up/Down CounterConflict-Free design – canonicalize rule

module mkCounter( Counter );

// Reg and EHR definitions on previous slide

rule canonicalize;

if(inc_req[1] && !dec_req[1]) begin

count <= count+1;

end else if(dec_req[1] && !inc_req[1]) begin

count <= count-1;

end

inc_req[1] <= False;

dec_req[1] <= False;

endrule

// methods on previous slide

endmodule

10/8/2017 http://csg.csail.mit.edu/6.175 T02-37

Page 38: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Well it’s morally broken

module mkTest();

Reg#(Bit#(8)) r <- mkReg(0);

let myCounter <- mkCounter();

rule r1;

$display(“r”);

myCounter.increment();

endrule

rule r2;

r <= myCounter.read();

endrule

rule display;

$display( r);

endrule

endmodule

10/8/2017 L03-38http://csg.csail.mit.edu/6.175

We can schedule read after increment, but read will always see old Values because it is scheduled before canonicalize.

Page 39: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Fix: but read< {inc,dec}.

module mkCounter( Counter );

Reg#(Bit#(8)) count <- mkReg(0);

Ehr#(2, Bool) inc_req <- mkEhr(False);

Ehr#(2, Bool) dec_req <- mkEhr(False);

// canonicalize rule on next slide

method Bit#(8) read if(!inc_req[0] &&

!dec_req[0]) = count;

method Action increment if(!inc_req[0]);

inc_req[0] <= True;

endmethod

method Action decrement if(!dec_req[0]);

dec_req[0] <= True;

endmethod10/8/2017 L03-39http://csg.csail.mit.edu/6.175

Page 40: Constructive Computer Architecture Tutorial 2 Debugging ...csg.csail.mit.edu › 6.175 › lectures › T02.pdf · Software Debugging Print Statements See a bug, not sure what causes

Interesting questions

Is it possible to write a CF counter?

Is it possible to give an algorithm that will always make a module conflict free, but a non broken one.

10/8/2017 L03-40http://csg.csail.mit.edu/6.175