//************************************************************************************** //ALU2.TST //By F. Itami and M. Thomson January 23, 1979 //Sub Test Program for D0 ALU Module //************************************************************************************** get "alu.d" //Edge pin signal busses used by ALU module: //{ALUA: ALUA.00, ALUA.01,ALUA.02,ALUA.03, ALUA.04,ALUA.05,ALUA.06, ALUA.07,ALUA.08,ALUA.09, ALUA.10,ALUA.11,ALUA.12, ALUA.13,ALUA.14,ALUA.15} //{aluf: ALUF.0, ALUF.1,ALUF.2,ALUF.3} //{clkbus: LT,LR, Abort',LoadMIR,Cycle0Feed'} //{CTask: CTask.0, CTask.1,CTask.2,CTask.3} //{F1F2: F1.0,F1.1, F1.2,F1.3,F2.0, F2.1,F2.2,F2.3} //{H2: H2.08,H2.09, H2.10,H2.11,H2.12, H2.13,H2.14,H2.15} //{MASK: MASK.00, MASK.01,MASK.02,MASK.03, MASK.04,MASK.05,MASK.06, MASK.07,MASK.08,MASK.09, MASK.10,MASK.11,MASK.12, MASK.13,MASK.14,MASK.15} //{MC1SA: BSEL.0,BSEL.1, F1.0,F1.1,F1.2, F1.3,LR,LT} //{mcbus: MC1WriteR, MC2AllowWrite,MC1NeedsR,MC2WillGetR} //{mirbus: MemInst/d,MemInst/d', RMOD/d,RMOD/d',RSEL.0/d', RSEL.1/d',RSEL.2/d,RSEL.3/d, RSEL.4/d,RSEL4and5/d,RSEL.5/d} //{rbus: R.00, R.01,R.02,R.03, R.04,R.05,R.06, R.07,R.08,R.09, R.10,R.11,R.12, R.13,R.14,R.15} //{TA: TA.0, TA.1,TA.2,TA.3} //************************************************************************************** //Test 5: Test the ALUA input to the ALU (using ALUOUT = "R") // Check R←H3P←ALUOUT←ALUA.IN←ALUA←MASKER←CYCLER←H1←R let Test5() be [ SpeakTest(5) //set initial conditions (see notes at end of ALU.TST) //{CYCOUNT: CYCOUNT.0, CYCOUNT.1, CYCOUNT.2, CYCOUNT.3 } //{NCYCOUNT: CYCOUNT.0', CYCOUNT.1',CYCOUNT.2',CYCOUNT.3'} //SpeakTest set up: {aluf}=1 ("R"), TComing=1 (for clkH3P'), Cycle0=1 //PART 1: Test H1←R and the CYCLER (MASK=0 for pass all CYCLER bits to ALUA) for i = 0 to 15 do [ let drive = 1 lshift i {rbus}=drive EClock() //H1←(rbus=drive) for j = 0 to 15 do [ {CYCOUNT}=j; //left-cycle H1 output j bit positions {NCYCOUNT}= not j WCompare({ALUA},LCyc(drive,j),5000+j,drive) ] ] //PART 2: Test the MASKER and R←H3P←ALUOUT←ALUA.IN←ALUA for i = 0 to 15 do [ let drive = 1 lshift i {Cycle0Feed'}=0 {rbus}=#177777 EClock() //H1←(rbus=#177777) {MASK} = not drive; //will pass only one H1 bit in "drive" position WCompare({ALUA},drive,5100+i) //check MASKER function EClock() //H3P←(ALUOUT=ALUA.IN=ALUA = (H1=#177777)&(MASK'=drive)) {rbus}=###; //open rbus {Cycle0Feed'}=1; //rbus←(H3P=#177777&drive) WCompare({rbus},drive,5200+i) //check ALUOUT = "R" function ] ] //************************************************************************************** //Test 6: Test the ALUB input to the ALU (Bmux and MASK inputs) // Check R←H3P←ALUOUT←(ALUB = (H2=Bmux) or the MASK) (uses ALUOUT = "T" code) // Check that J-TestResult'=H2.08 when the h19 mux address=3 (page 10) and Test6() be [ SpeakTest(6) //set initial conditions (see notes at end of ALU.TST) {aluf}=0; //ALUOUT←ALUB ("T" code) {Cycle0Feed'}=1; //display H3P {JC.1}=0; {JC.2}=1; {JA.7}=1; //select H2.08' as J-TestResult' mux input //PART 1: Check ALUB←H2←Bmux (EnableMask=0) for i = 0 to 255 do [ {F1F2}=i {BSEL.1}=1; //up align F1F2 ClockCycle0() //H2[0:7]←i, ALUF()←"ALUB" {BSEL.1}=0; //down-align F1F2 ClockCycle0() //H3P←(ALUOUT=H2=i lshift 8), H2[8:15]←i WCompare({rbus},i lshift 8,6000,i) //F1,F2,0,0 WCompare({H2},i,6001,i) //0,0,F1,F2 WCompare({J-TestResult'},i rshift 7,6002,i) //J-TestResult'=H2.08=i[8] (rev. M) ClockCycle0() //H3P←(ALUOUT=H2=i) WCompare({rbus},i,6003,i) //0,0,F1,F2 ] //PART 2: Check ALUB←MASK (EnableMask=1) {BBFA'}=0; //for EnableMask←1 (MA'=0 from SpeakTest) ClockCycle0() //EnableMask←1 (page 6) for i = 0 to 15 do [ let a = 1 lshift i {MASK}=a ClockCycle0() //H3P←(ALUOUT=MASK=a) WCompare({rbus},a,6100+i) ] ] //************************************************************************************** //Test 7: Test the T file write-read functions (pages 1-6,15) // Test the ALUB input to the ALU (T file) // Check R←H3P←ALUOUT←(ALUB = T file) (uses ALUOUT = "T" code) and Test7() be [ SpeakTest(7) //set initial conditions (see notes at end of ALU.TST) //Set up initial conditions {Cycle0Feed'}=1; //for TWrite and rbus←H3P {BSEL.0}=1; //for H2←T {aluf}=0; //for ALUOUT←ALUB //Preliminary data path test (T address is constant: TA=0 from SpeakTest) for i = 0 to 15 do [ {BBFA'}=0; //for ALUB←MASK ClockCycle0() //ALUF()←0 for ALUOUT←ALUB, EnableMask←1 for ALUB←MASK {MASK} = 1 lshift i ClockCycle0() //H3P←(ALUOUT=ALUB=MASK = 1 lshift i) RClock() //T←(rbus=H3P=b) (address =j) {BBFA'}=1; //for ALUB←H2 ClockCycle0() //H2←(T = 1 lshift i) (address =j) //EnableMask←0 for ALUB←H2 ClockCycle0() //H3P←(ALUOUT=ALUB=H2 = 1 lshift i) WCompare({rbus},1 lshift i,7000+i) //(rbus=H3P = 1 lshift i) ] //Main T file test: involves storing both 1's and 0's in every cell of every address for i = 0 to 1 do [ {BBFA'}=0; //for ALUB←MASK ClockCycle0() //ALUF()←0 for ALUOUT←ALUB, EnableMask←1 for ALUB←MASK for j = 0 to 15 do //Write test pattern [ let a = (j*7) rshift 3 //"non-synchronous hex" let b = (a*#10421) xor (-i) //a in all hexes, inverted if i odd {TA}=j {MASK}=b ClockCycle0() //H3P←(ALUOUT=ALUB=MASK=b) RClock() //T←(rbus=H3P=b) (address =j) ] {BBFA'}=1; //for ALUB←H2 for j = 0 to 15 do //Read test pattern [ let a = (j*7) rshift 3 //"non-synchronous hex" let b = (a*#10421) xor (-i) //a in all hexes, inverted if i odd {TA}=j ClockCycle0() //H2←(T=b) (address =j) //EnableMask←0 for ALUB←H2 ClockCycle0() //H3P←(ALUOUT=ALUB=H2=b) WCompare({rbus},b,7100+i,j) //(rbus=H3P=b) ] ] ] //************************************************************************************** //Test 8: Test some basic ALU functions before proceeding to more complex ALU tests and Test8() be [ SpeakTest(8) //set initial conditions (see notes at end of ALU.TST) //Initialization (pages 10,15): //SpeakTest sets up conditions to enable clkH3P' and clkResult' during Cycle0, //also, Restore'=1 for SavALUCyOut←ALUCyOut when clkResult' is active //PART 1: Test the EXCLUSIVE OR functions for i = 0 to 1 do [ {aluf} = 4 % (3*i); //4 if i=0 ("R xor T"), 7 if i=7 ("R xor (not T)") for j = 0 to 15 do [ let a = 1 lshift j {Cycle0Feed'}=0 {rbus} = a EClock() //H1←(rbus = a) (ALUA input) //H2←(Bmux = F1F2 = 0) (ALUB input) //ALUF()←4 if i=0 ("R xor T"), 7 if i=7 ("R xor (not T)") EClock() //H3P←(ALUOUT = a xor 0 if i=0, a xor #177777 if i=1) {rbus}=### {Cycle0Feed'}=1; //rbus←H3P WCompare({rbus},a xor (-i),8000+i,j) ] ] //PART 2: Test Carry propagation and generation using cases involving strings of 1's //Set up conditions for J-TestResult'←SavALUCyOut' (page 10) //(BranchShift'=1 from SpeakTest initialization) {JA.7}=1; //for h19 mux address inputs = 001 (JC.1 = JC.2 = 0 from SpeakTest) for i = 0 to 16 do [ let a = 1 lshift i let b = #177777 lshift i //b = -a, while b' = a-1 let c = i rshift 4 //i=16 for END CARRY WCompares //Test propagation of ALUCarryIn into each bit position {aluf}=10; //for "R+T+1" (R+0+1 since H2=0) {Cycle0Feed'}=0 {rbus} = not b; //propagates ALUCarryIn into bit position "a" EClock() //H1←(rbus=b'=a-1), H2←0, ALUF()←"R+T+1" EClock() //H3P←(ALUOUT=(a-1)+0+1=a) //clkResult': SavALUCyOut←ALUCyOut {rbus}=### {Cycle0Feed'}=1; //rbus←H3P WCompare({rbus},a,8100+i) //sum=a //Check END CARRY =0 until i=16 ((a-1=#177777)+0+1 = #200000) WCompare((not {J-TestResult'})&1,c,8150+i) //Test killing of ALUCarryIn by each bit position //{aluf} still =10; //for "R+T+1" (R+0+1 since H2=0) {Cycle0Feed'}=0 {rbus} = not a; //kills ALUCarryIn at bit position "a" EClock() //H1←(rbus=a'), H2←0, ALUF()←"R+T+1" EClock() //H3P←(ALUOUT=a'+0+1=-a) //clkResult': SavALUCyOut←ALUCyOut {rbus}=### {Cycle0Feed'}=1; //rbus←H3P WCompare({rbus},b,8200+i) //sum=-a //Check END CARRY =0 until i=16 (#177777+0+1 = #200000) WCompare((not {J-TestResult'})&1,c,8250+i) //Test generation of a carry by each bit position //and its propagation into the END CARRY position {aluf}=13; //for "R-T-1" (i.e. R+T') (R+#177777+0 since H2=0) {Cycle0Feed'}=0 {rbus}=a; //generates Carry out of bit position "a" EClock() //H1←(rbus=a), H2←0, ALUF()←"R-T-1" EClock() //H3P←(ALUOUT=a+#177777+0=a-1) //clkResult': SavALUCyOut←ALUCyOut {rbus}=### {Cycle0Feed'}=1; //rbus←H3P WCompare({rbus},a-1,8300+i) //sum=a-1 //Check END CARRY =1 until i=16 (0+#177777+0 = #177777) WCompare({J-TestResult'},c,8350+i) ] ]