// Handel-C version of (simplified) ALU #include "alu.h" extern "C" int printf(const char *fmt, ... ); set clock = external "Dummy"; void main (void) { signed 8 A, B, F; OpCodes 4 Op; unsigned 1 Cout; static unsigned 1 stop = 0; unsigned 1 ready; chan unsigned 1 alu_chan; par { // Stimulus seq { A = 1; B = 2; Op = AplusB; alu_chan ! 1; alu_chan ? ready; A = 2; B = 3; Op = AminusB; alu_chan ! 1; alu_chan ? ready; stop = 1; alu_chan ! 0; } // ALU - Generate F and Cout from A, B and Op while (1) { signed 9 A9, B9; signed 9 Temp; // The stimulus process sends 1 when there is another test pattern // and 0 when there are no more = end of simulation alu_chan ? ready; if (!ready) break; // Write out the inputs printf("A = 0x%x, B = 0x%x, ", A, B); printf("Op = 0x%x\n", Op); // Sign extend A and B A9 = A[7] @ A; B9 = B[7] @ B; switch (Op) { case AplusB : Temp = A9 + B9; break; case AminusB: Temp = A9 - B9; break; case BminusA: Temp = B9 - A9; break; case onlyA: Temp = A9; break; case onlyB: Temp = B9; break; case minusA: Temp = -A9; break; case minusB: Temp = -B9; break; case slA: Temp = A9<<1; break; case srA: Temp = 0@A[7:1]; break; case rlA: Temp = A@A[7]; break; case rrA: Temp = 0@A[0]@A[7:1]; break; case allzeroes: Temp = 0; break; case allones: Temp = 0x1ff; break; default: Temp = 0; break; } Cout = (unsigned 1)Temp[8]; F = Temp[7:0]; // Write out some results printf(" => F = 0x%x, Cout = %d\n", F, Cout); // Signal for the next test pattern alu_chan ! 1; } } }