BSV objects and a tour of known BSV problems

Slides:



Advertisements
Similar presentations
COMP 14: Primitive Data and Objects May 24, 2000 Nick Vallidis.
Advertisements

Stmt FSM Richard S. Uhler Computer Science & Artificial Intelligence Lab Massachusetts Institute of Technology (based on a lecture prepared by Arvind)
Computer Architecture: A Constructive Approach Sequential Circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology.
Pipelining combinational circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology February 20, 2013http://csg.csail.mit.edu/6.375L05-1.
September 3, 2009L02-1http://csg.csail.mit.edu/korea Introduction to Bluespec: A new methodology for designing Hardware Arvind Computer Science & Artificial.
Constructive Computer Architecture Combinational circuits-2 Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology.
Multiple Clock Domains (MCD) Continued … Arvind with Nirav Dave Computer Science & Artificial Intelligence Lab Massachusetts Institute of Technology November.
Oct 2, 2014T01-1http://csg.csail.mit.edu/6.175 Constructive Computer Architecture Tutorial 1 BSV Sizhuo Zhang TA.
Constructive Computer Architecture: Guards Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology September 24, 2014.
Constructive Computer Architecture Tutorial 2 Advanced BSV Sizhuo Zhang TA Oct 9, 2015T02-1http://csg.csail.mit.edu/6.175.
Computer Architecture: A Constructive Approach Combinational ALU Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology.
Constructive Computer Architecture Tutorial 4 Debugging Sizhuo Zhang TA Oct 23, 2015T04-1http://csg.csail.mit.edu/6.175.
Constructive Computer Architecture Tutorial 2 Advanced BSV Andy Wright TA September 26, 2014http://csg.csail.mit.edu/6.175T02-1.
September 22, 2009http://csg.csail.mit.edu/koreaL07-1 Asynchronous Pipelines: Concurrency Issues Arvind Computer Science & Artificial Intelligence Lab.
Constructive Computer Architecture Sequential Circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology
6.S078 - Computer Architecture: A Constructive Approach Combinational circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute.
Constructive Computer Architecture Combinational circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology.
Constructive Computer Architecture Tutorial 4: Running and Debugging SMIPS Andy Wright TA October 10, 2014http://csg.csail.mit.edu/6.175T04-1.
Constructive Computer Architecture Sequential Circuits Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology September.
Constructive Computer Architecture Sequential Circuits - 2 Arvind Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology.
Multiple Clock Domains (MCD) Arvind with Nirav Dave Computer Science & Artificial Intelligence Lab Massachusetts Institute of Technology.
October 20, 2009L14-1http://csg.csail.mit.edu/korea Concurrency and Modularity Issues in Processor pipelines Arvind Computer Science & Artificial Intelligence.
February 27, 2006http://csg.csail.mit.edu/6.375/L08-1 Bluespec-2: Types Arvind Computer Science & Artificial Intelligence Lab Massachusetts Institute of.
Overview Logistics Last lecture Today HW5 due today
Functions and Types in Bluespec
Types CSCE 314 Spring 2016.
Bluespec-3: A non-pipelined processor Arvind
Lesson #6 Modular Programming and Functions.
Introduction to Verilog
Folded Combinational Circuits as an example of Sequential Circuits
Lesson #6 Modular Programming and Functions.
Folded “Combinational” circuits
Scheduling Constraints on Interface methods
Sequential Circuits - 2 Constructive Computer Architecture Arvind
Sequential Circuits Constructive Computer Architecture Arvind
Sequential Circuits: Constructive Computer Architecture
Combinational ALU Constructive Computer Architecture Arvind
BSV Tutorial 1 Ming Liu Feb 12, 2016
Combinational circuits-2
Combinational Circuits in Bluespec
Stmt FSM Arvind (with the help of Nirav Dave)
Introduction to Verilog
Lesson #6 Modular Programming and Functions.
Combinational Circuits in Bluespec
Pipelining combinational circuits
Multirule Systems and Concurrent Execution of Rules
Constructive Computer Architecture: Guards
BSV Types Constructive Computer Architecture Tutorial 1 Andy Wright
Sequential Circuits Constructive Computer Architecture Arvind
Pipelining combinational circuits
6.375 Tutorial 2 Guards and Scheduling Ming Liu
Debugging BSV and Typeclasses. Constructive Computer Architecture
Combinational circuits
Modules with Guarded Interfaces
Pipelining combinational circuits
Sequential Circuits - 2 Constructive Computer Architecture Arvind
Bluespec-3: A non-pipelined processor Arvind
Stmt FSM Arvind (with the help of Nirav Dave)
Combinational Circuits in Bluespec
Constructive Computer Architecture: Guards
Simple Synchronous Pipelines
Lesson #6 Modular Programming and Functions.
Introduction to Bluespec: A new methodology for designing Hardware
Introduction to Verilog
Modular Refinement Arvind
Simple Synchronous Pipelines
ECE 352 Digital System Fundamentals
CS295: Modern Systems Bluespec Introduction – More Topics
CS295: Modern Systems Introduction To Bluespec – Types
Constructive Computer Architecture Tutorial 1 Andy Wright 6.S195 TA
Presentation transcript:

BSV objects and a tour of known BSV problems Constructive Computer Architecture Tutorial 1 BSV objects and a tour of known BSV problems Thomas Bourgeat From Andy Wright’s tutorial 11/21/2018 http://csg.csail.mit.edu/6.175

Outline Tour of BSV objects Double write – the truth A useful construction in BSV Tour of problems 11/21/2018 http://csg.csail.mit.edu/6.175

Only modules module makerName(nameInterface); // State instances //(submodules) // Rules (mind of the module) // Implem. of the interface // (methods) endmodule 11/21/2018 http://csg.csail.mit.edu/6.175

The primitive module Register Methods: method Action _write(t newvalue); method t _read(); 11/21/2018 http://csg.csail.mit.edu/6.175

More usual Bluespec add notations: Total saving: 13 characters! myreg <= newvalue; // equiv myreg._write(newvalue); let currentvalue = myreg; let currentvalue = myreg._read(); Total saving: 13 characters! Remark: myreg._read; is valid as well. You can do the same thing, name your methods _write and read. 11/21/2018 http://csg.csail.mit.edu/6.175

Interfaces They are the types of modules Differences: Gcd instanceGcd <- mkGcd(); Bit#(32) sum = add(a,b); Differences: The meaning of = and <-? The parameters? What is this <- ? Complicated. 11/21/2018 http://csg.csail.mit.edu/6.175

Meaning of = It is just naming (with type)! function Bit#(5) add4( Bit#(4) a, Bit#(4) b, Bit#(1) c_in );     Bit#(4) sum = 0;     Bit#(1) carry = c_in;     for (Integer i = 0; i < 4; i = i + 1) begin         sum[i] = fa_sum(a[i], b[i], carry);         carry = fa_carry(a[i], b[i], carry);     end     return {carry, sum}; Endfunction What is carry? 11/21/2018 http://csg.csail.mit.edu/6.175

Meaning of = We really defined 5 names, and carry is just a name, that evolved with the unfolding and that at the end is: carry=fa_carry(a[3],b[3],fa_carry(a[2],b[2],fa_carry(…))) Sum[0]= fa_sum(a[0],b[0],c_in); sum[1]= fa_sum(a[1],b[1],fa_carry(a[0],b[0],c_in)); 11/21/2018 http://csg.csail.mit.edu/6.175

Abuse in naming Reg#(Bool) myReg <- mkReg(1); Wait, what, mkReg(1)? What is myReg? What is mkReg? What is mkReg(1)? Wait, what, mkReg(1)? myReg is the module mkReg is a partially applied module constructor mkReg(1) is a completely applied module constructor that just what the compiler to be told build it “do it”. 11/21/2018 http://csg.csail.mit.edu/6.175

Parameters for module module mkMyReg#(Bit#(32) init)(Reg#(Bit#(32)); Reg#(Bit#(32)) internal <- mkReg(init+42); method Bit#(32) _read(); return internal; endmethod method Action _write(Bit#(32) newvalue); internal <= newvalue; Endmodule 11/21/2018 http://csg.csail.mit.edu/6.175

More parameters! module mkTestBench#(Fft fft)(); let fft_reference <- mkFftCombinational; // … rule feed; //… generate some data d fft_reference.enq(d); fft.enq(d); endrule endmodule 11/21/2018 http://csg.csail.mit.edu/6.175

Meaning of <- What happens if I do: Bit#(32) one = 1; let whatIsThat = mkReg(one); whatIsThat is a recipe, it contains all the information to build a register of 32 bits, initialized with a one. <- not just naming, instantiating 11/21/2018 http://csg.csail.mit.edu/6.175

And function? A convenient way to do parametrized naming, they are just helpers. They are mostly used for combinational circuits. Technically you can write functions that operates on other functions or even modules (modules are first class values) 11/21/2018 http://csg.csail.mit.edu/6.175

Adder Interface Adder; method Bit#(33) add(Bit#(32) a,Bit#(32) b); endinterface module mkAdder(Adder); return( addFct(a,b)); endmethod endmodule There is only one adder here. 11/21/2018 http://csg.csail.mit.edu/6.175

Something to be careful about, in the future. A bit of concurrency Something to be careful about, in the future. 11/21/2018 http://csg.csail.mit.edu/6.175

Double write – the truth In class we saw that: rule a; myReg <= 2; endrule rule b; myReg <= 1; Are conflicting rules and can’t fire together. 11/21/2018 http://csg.csail.mit.edu/6.175

Double write – the truth But not actually, they can, so be careful! Rule ‘b’ shadows the effect of ‘a’ when they execute in the same clock cycle. Affected method calls: myReg.write 11/21/2018 http://csg.csail.mit.edu/6.175

What is true You cannot write twice a register within a rule, or within a method. Hence: You cannot call twice the same action method within a rule or within an other method. It is actually a convenient thing to have. 11/21/2018 http://csg.csail.mit.edu/6.175

A useful construction 11/21/2018 http://csg.csail.mit.edu/6.175

Maybe#(t) Type: Values: Functions: Maybe#(type t) tagged Invalid tagged Valid x (where x is a value of type t) Functions: isValid(x) Returns true if x is valid fromMaybe(default, m) If m is valid, returns the valid value of m if m is valid, otherwise returns default Commonly used fromMaybe(?, m) 11/21/2018 http://csg.csail.mit.edu/6.175

tagged union Maybe is a special type of tagged union typedef union tagged { void Invalid; t Valid; } Maybe#(type t) deriving (Eq, Bits); Tagged unions are collections of types and tags. The type contained in the union depends on the tag of the union. If tagged Valid, this type contains a value of type t 11/21/2018 http://csg.csail.mit.edu/6.175

tagged union – Continued Values: tagged <tag> value Pattern matching to get values: case (x) matches tagged Valid .a : return a; tagged Invalid : return 0; endcase See BSV Reference Guide (on course website) for more examples of pattern matching 11/21/2018 http://csg.csail.mit.edu/6.175

Tour of problems 11/21/2018 http://csg.csail.mit.edu/6.175

Question 1 What is the type of a? Bit#(n) x = 1; Bit#(m) y = 3; let a = {x,y}; Bit#(TAdd#(n,m)) 11/21/2018 http://csg.csail.mit.edu/6.175

Question 2 What is the type of b? Bit#(n) x = 1; Bit#(m) y = 3; let a = {x,y}; let b = x + y; Type Error! + expects inputs and outputs to all have the same type 11/21/2018 http://csg.csail.mit.edu/6.175

Question 2 – BSC Error Error: “File.bsv”, line 10, column 9: … Type error at: y Expected type: Bit#(n) Inferred type: Bit#(m) 11/21/2018 http://csg.csail.mit.edu/6.175

Question 3 What is the type of c? Bit#(8) x = 9; let c = x[0]; Bit#(1) 11/21/2018 http://csg.csail.mit.edu/6.175

Question 4 What is the type of d? Bit#(8) x = 9; let d = zeroExtend(x); Can’t tell, so the compiler gives a type error 11/21/2018 http://csg.csail.mit.edu/6.175

Question 5 What does this function do? How does it work? function Bit#(m) resize(Bit#(n) x) Bit#(m) y = truncate(zeroExtend(x)); return y; endfunction Produces a compiler error! zeroExtend(x) has an unknown type 11/21/2018 http://csg.csail.mit.edu/6.175

Question 5 – Fixed function Bit#(m) resize(Bit#(n) x) Bit#(TMax#(m,n)) x_ext; x_ext = zeroExtend(x); Bit#(m) y = truncate(x_ext); return y; endfunction 11/21/2018 http://csg.csail.mit.edu/6.175

Question 6 What does this code do? // mainQ, redQ, blueQ are FIFOs // redC, blueC let x = mainQ.first; mainQ.deq; if( isRed(x) ) redQ.enq(x); redC <= redC + 1; if( isBlue(x) ) blueQ.enq(x); blueC <= blueC + 1; Not what it looks like 11/21/2018 http://csg.csail.mit.edu/6.175

Question 6 – Rewritten let x = mainQ.first; mainQ.deq; if( isRed(x) ) redQ.enq(x); redC <= redC + 1; if( isBlue(x) ) blueQ.enq(x); blueC <= blueC + 1; Only the first action/expression after the if is done, that’s why we have begin/end 11/21/2018 http://csg.csail.mit.edu/6.175

Question 6 – Fixed let x = mainQ.first; mainQ.deq; if( isRed(x) ) begin redQ.enq(x); redC <= redC + 1; end if( isBlue(x) ) begin blueQ.enq(x); blueC <= blueC + 1; 11/21/2018 http://csg.csail.mit.edu/6.175

Known Problem aNd Solutions Bit#(n) out; for(Integer i=0; i<valueOf(n);i=i+1) begin out[i] = fnc(…); End return out; 11/21/2018 http://csg.csail.mit.edu/6.175

Uninitialized values and KPNS ‘out’ uses uninitialized value […]. If this error is unexpected, please consult KPNS #32.[…] //Solution: Bit#(n) out = 0; 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast //Alright Bit#(32) unshifted = input; Bit#(32) shifted = {0, unshifted[31:12]}; //Boom Integer i = 12; Bit#(32) shifted = {0, unshifted[31:i]}; 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast What is going on? An ambigious type was introduce at […] This type resulted from: The proviso Add#(a__,b__,32) introduced in or at the following locations: […] What is going on? 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast Typechecking is happening before elaboration: That explain why the behavior differs. Then what is the type of unshifted[32:i]? 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast We would like it to be of type TSub#(32,” i”) But i is a value and not a type! We have already valueOf(): numeric type ->Integer We want typeOf(): Integer-> numeric type 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast typeOf does not exist  So really, the “honest” type for this value unshifted[31:i] is not expressible in BSV typesystem. But we want to be able to do selection based on integers! Dependent types! 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast Solution: Don’t type it. Bit#(n) unshifted[31:i]; (Or Bit#(i) unshifted[31:i]; to be confusing) But the {0,unshifted[31:i]} is a concatenation of two things of unknown sizes. Dependent types! 11/21/2018 http://csg.csail.mit.edu/6.175

Question 7 – The beast The simple complex workaround: Bit#(32) shifted = unshifted[31:i]; What if I wanted to add ones instead of 0 in front? See other programming pattern Dependent types! 11/21/2018 http://csg.csail.mit.edu/6.175