Sunday, November 22, 2015
NAND to Tetris - A Personal Journey
From NAND to Tetris (N2T) is the popular name for an open study Computing Science course devised by Shimon Schocken and Noam Nisan. It is accompanied by a book, by the same authors "The Elements Of Computing Systems - Building a Modern Computer from First Principles" and a series of online and downloadable study materials.
For anyone who wishes to get a more in depth understanding of the interaction between hardware, operating system and software application layers of a modern computer, or consolidate existing knowledge - then I would highly recommended purchasing this book, following the course materials and supporting this project - as a whole. We need a whole new generation of Computer Science and Electronic Engineers - who understand this stuff from first principles.
After first hearing about the course from contacts at the London Hackspace, I bought the book last year and I am slowly working my way through it. By this, I mean that I am making my own personal tour of the country that it describes - and not necessarily by the direct linear route outlined in the book. I dip into it occasionally, rather like a travel guide, as if I were planning a trip to the next major city. I believe that I will reach the final destination, but it will be the wealth of experience gained from meandering on the journey, rather than the final destination, that currently is my driving factor.
I embarked on the book, having spent most of career in digital hardware design, but very little real experience of writing software tools. Whilst I found the chapters on hardware were fairly easy to follow, I hoped that the book would lead me gently into picking up new software skills.
The first 5 chapters of the book illustrate and re-enforce the principles of combinatorial and sequential digital logic, by having the student design the logic function of the various "chips" that go up to make a simple cpu. From basic gates you combine ever increasing complex designs to make up the arithmetic logic unit, ALU, the program counter and the various registers that make up the cpu.
A hardware design language package allows the design, simulation and testing of the various logical components and gives the student confidence that their design meets the test spec of the required item. It soon becomes apparent that there is no one way to implement the logic of the ALU - but some ways are quicker, more flexible or have a more efficient use of silicon.
I completed the hardware design chapter exercises of the book during an intensive week of evenings in spring last year. Then got a more than a little bogged down in the software section, as I realised at the time I did not have the programming skills in any language to do justice to the demands of the software exercises - beginning at Chapter 6 "Assembler".
Rather than defeat by a complete road-block, I have spent the last year surveying the surrounding territory for an alternative route to complete the mission. In this, I have invested in FPGA hardware, designed pcbs for ARM processors and written simulator code for simple stack based processors. I have now got to the point where the next logical step is to write an Assembler.
I have picked up enough C skills to put together a simple text interpreter and use it to parse through tables of mnemonics looking for a match and associating a machine instruction with that scanned mnemonic. It is the basis of a "poor mans" assembler, but it has the flexibility to be applied to whatever novel processors instruction set I wish to explore. I can now go back to Chapter 6 - with my new knowledge and software tool and make new progress.
In the intervening year - and at this stage in life we view projects in terms of years of involvement, I have also learned a bit of Verilog and done a bit of FPGA logic design. These are skills I will need to develop if I am to keep up with the modern world. And whilst I may no longer to be able to see (without glasses) some of the hardware I am working with, I can still type, and I have the option of increasing the font size. That should keep me viable in the workplace for the next decade or so - although I do increasingly have my "dinosaur days".
This move was partly inspired by the N2T book, and also my desire to get involved in the new wave of low cost FPGAs that have now become available to the hobbyist. I might be as bold to say that in 2015, they are to the enthusiast what the 6502 was in 1975, and the Arduino was in 2005. User friendly FPGA hardware is definitely going to be a growth area for the next few years.
FPGAs allow you to design your own custom hardware, or recreate vintage or retro-hardware computers from years ago. Soft core processors, featuring custom instruction sets are one area of involvement - and these will require software tools to simulate operation and allow code to be written.
In addition, I have moved on from being constrained by just 1 or 2 microcontrollers. I am now experiencing the portability of software written in C, and discovering how easy it can be to switch between processors - even though I have some concerns about the complexity of modern IDEs.
One of the tasks I set this year was to benchmark several microcontrollers with dhrystone and whetstone benchmarks - in an attempt to get a better understanding of how they perform under different applications.
By characterising the relative performance and resources of a few common cpus - I am now able to make informed decisions about which might be more suitable for a particular job. Currently I am impressed with the ARM Cortex M7, and I am eagerly awaiting 400MHz versions of this M7 core - expected in late 2016-2017.
Whilst 400MHz might appear puny to those who regularly use twin-core 1GHz parts in their mobile phone or Raspberry Pi, to them I offer the challenge of writing from scratch an Assembler!