# Having problems with my ALU

9 messages
Open this post in threaded view
|

## Having problems with my ALU

 Hey, everyone my ALU passes all tests until it has to compute y + 1 and then the comparison fails and the output is -32750 in decimal and 1000000000010010 in binary when the output should be 0000000000010010. I can't figure out where that bit is coming from, Here's what my HDL looks like: CHIP ALU {     IN           x[16], y[16],  // 16-bit inputs                 zx, // zero the x input?         nx, // negate the x input?         zy, // zero the y input?         ny, // negate the y input?         f,  // compute (out = x + y) or (out = x & y)?         no; // negate the out output?     OUT         out[16], // 16-bit output         zr,      // if (out == 0) equals 1, else 0         ng;      // if (out < 0)  equals 1, else 0     PARTS:     // x input     Mux16(a=x, b=false, sel=zx, out=x1);     //y input     Mux16(a=y, b=false, sel=zy, out=y1);     Not16(in=x1, out=notx1);     // zx     Mux16(a=x1, b=notx1, sel=nx, out=x2);     Not16(in=y1, out=noty1);     // negate y     Mux16(a=y1, b=noty1, sel=ny, out=y2);     Add16(a=x2, b=y2, out=addout);     And16(a=x2, b=y2, out=andout);     Mux16(a=andout, b=addout, sel=f, out=fout);     Not16(in=fout, out=notfout);     Mux16(a=fout, b=notfout, sel=no, out=out, out[0..7]=out7, out[8..15]=out15, out[15]=isng);     Or8Way(in=out7, out=zr0);     Or8Way(in=out15, out=zr1);     Or(a=zr0, b=zr1, out=zr2);     Not(in=zr2, out=zr);     And(a=isng, b=true, out=ng);       } I also have tried other people's solution and end up with the same error as well, if it matters I'm on an m1 Mac.
Open this post in threaded view
|

## Re: Having problems with my ALU

 Administrator The test files in the distribution have been in a state of flux lately, so I don't know which files you are using. Please attach the .tst and .cmp files you have, along with your .out file, and I'll take a look. The test file that I have uses y=-1 and y=3 when testing y+1. The second time that it tests x+1, it uses x=17. Are you sure that's not the test you are running afoul of? This corresponds to Line 29 of my .cmp file One thing to try is to remove all of the HDL files except your ALU.hdl from the folder (or rename them). This will force the simulator to use the built-in models. If that works, then the problem is with one of the implementations of the lower-level chips.
Open this post in threaded view
|

## Re: Having problems with my ALU

 Hey thanks for the reply, Here is my ALU.cmp |        x         |        y         |zx |nx |zy |ny | f |no |       out        |zr |ng | | 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 | And here is my ALU.out: |        x         |        y         |zx |nx |zy |ny | f |no |       out        |zr |ng | | 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | | 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | | 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | | 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 1000000000010010 | 0 | 1 | It could definitely be that I'm misinterpreting where the problem is but hopefully this clears up my problem
Open this post in threaded view
|

## Re: Having problems with my ALU

 In reply to this post by WBahn Apologies here is my ALU.test // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/2/ALU.tst load ALU.hdl, output-file ALU.out, compare-to ALU.cmp, output-list x%B1.16.1 y%B1.16.1 zx nx zy ny f no out%B1.16.1 zr ng; set x %B0000000000000000,  // x = 0 set y %B1111111111111111;  // y = -1 // Compute 0 set zx 1, set nx 0, set zy 1, set ny 0, set f  1, set no 0, eval, output; // Compute 1 set zx 1, set nx 1, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute -1 set zx 1, set nx 1, set zy 1, set ny 0, set f  1, set no 0, eval, output; // Compute x set zx 0, set nx 0, set zy 1, set ny 1, set f  0, set no 0, eval, output; // Compute y set zx 1, set nx 1, set zy 0, set ny 0, set f  0, set no 0, eval, output; // Compute !x set zx 0, set nx 0, set zy 1, set ny 1, set f  0, set no 1, eval, output; // Compute !y set zx 1, set nx 1, set zy 0, set ny 0, set f  0, set no 1, eval, output; // Compute -x set zx 0, set nx 0, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute -y set zx 1, set nx 1, set zy 0, set ny 0, set f  1, set no 1, eval, output; // Compute x + 1 set zx 0, set nx 1, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute y + 1 set zx 1, set nx 1, set zy 0, set ny 1, set f  1, set no 1, eval, output; // Compute x - 1 set zx 0, set nx 0, set zy 1, set ny 1, set f  1, set no 0, eval, output; // Compute y - 1 set zx 1, set nx 1, set zy 0, set ny 0, set f  1, set no 0, eval, output; // Compute x + y set zx 0, set nx 0, set zy 0, set ny 0, set f  1, set no 0, eval, output; // Compute x - y set zx 0, set nx 1, set zy 0, set ny 0, set f  1, set no 1, eval, output; // Compute y - x set zx 0, set nx 0, set zy 0, set ny 1, set f  1, set no 1, eval, output; // Compute x & y set zx 0, set nx 0, set zy 0, set ny 0, set f  0, set no 0, eval, output; // Compute x | y set zx 0, set nx 1, set zy 0, set ny 1, set f  0, set no 1, eval, output; set x %B000000000010001,  // x = 17 set y %B000000000000011;  // y =  3 // Compute 0 set zx 1, set nx 0, set zy 1, set ny 0, set f  1, set no 0, eval, output; // Compute 1 set zx 1, set nx 1, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute -1 set zx 1, set nx 1, set zy 1, set ny 0, set f  1, set no 0, eval, output; // Compute x set zx 0, set nx 0, set zy 1, set ny 1, set f  0, set no 0, eval, output; // Compute y set zx 1, set nx 1, set zy 0, set ny 0, set f  0, set no 0, eval, output; // Compute !x set zx 0, set nx 0, set zy 1, set ny 1, set f  0, set no 1, eval, output; // Compute !y set zx 1, set nx 1, set zy 0, set ny 0, set f  0, set no 1, eval, output; // Compute -x set zx 0, set nx 0, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute -y set zx 1, set nx 1, set zy 0, set ny 0, set f  1, set no 1, eval, output; // Compute x + 1 set zx 0, set nx 1, set zy 1, set ny 1, set f  1, set no 1, eval, output; // Compute y + 1 set zx 1, set nx 1, set zy 0, set ny 1, set f  1, set no 1, eval, output; // Compute x - 1 set zx 0, set nx 0, set zy 1, set ny 1, set f  1, set no 0, eval, output; // Compute y - 1 set zx 1, set nx 1, set zy 0, set ny 0, set f  1, set no 0, eval, output; // Compute x + y set zx 0, set nx 0, set zy 0, set ny 0, set f  1, set no 0, eval, output; // Compute x - y set zx 0, set nx 1, set zy 0, set ny 0, set f  1, set no 1, eval, output; // Compute y - x set zx 0, set nx 0, set zy 0, set ny 1, set f  1, set no 1, eval, output; // Compute x & y set zx 0, set nx 0, set zy 0, set ny 0, set f  0, set no 0, eval, output; // Compute x | y set zx 0, set nx 1, set zy 0, set ny 1, set f  0, set no 1, eval, output;
Open this post in threaded view
|

## Re: Having problems with my ALU

 Administrator Although your logic of your ALU implementation isn't quite the simplest, I couldn't see anything incorrect output it. I ran your chip and it tested successfully, both on the version of the simulator I have installed and also on the latest version that I just downloaded from the Software page. Have you tested the chip using only the built-in chips for the lower-level parts?
Open this post in threaded view
|

## Re: Having problems with my ALU

 moving the ALU into a different directory and forcing the simulator to use the builtin chips solved the problem for me! Hah I wonder what gate I messed up to cause that bug. That would be a whole other can of worms though.
Open this post in threaded view
|

## Re: Having problems with my ALU

 Administrator Okay, so we are narrowing things down. If I had to guess, I would guess that the problem is the Add16 or one of it's components. So add in just your implementation of the Add16 (leave all of it's building blocks as built-in) and see what happens. If there's no error, then add in the next lower-level chip and keep doing that until the error returns. That's the chip to look at very closely.