//**************************************************************************************
//ALU1.TST
//By F. Itami and M. Thomson January 29, 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 1: Check initial conditions and the Suspend flip-flop control
let Test1() be
[
SpeakTest(1) //set initial conditions (see notes at end of ALU.TST)
//Repeat the SpeakTest initialization sequence with WCompares monitoring the process.
//See SpeakTest (in ALU.TST) for all input edge-pin signals (not redundantly entered here)
//The "//WCompares" are optional breakpoints. To activate, delete the leading "//". Restore to normal by re-inserting "//".
{clkbus}=#27; //LT=1, LR=0, Abort'=1, LoadMIR=1, Cycle0=0
{aluf}=3; //for prom f2 outputs = 1111 (page 16)
{LoadAd'}=0; //for MC1XferWord←1, MC1XWdly←1
{EdgeClockFeed'}=0
//WCompare(1,0,1000)
{EdgeClockFeed'}=1; //load MIR with MemInst=0, RMOD=1, RSEL=01 11 11 for R←NBR (i.e. open Cycle0 R bus sources), Suspend←0, AbortDly'←1, MC1XferWord←1, MC1XWdly←1
WCompare({Suspend-a},0,1001)
WCompare({MemInst-a},0,1002)
{clkbus}=#24; //LT=1, LR=0, Abort'=1, LoadMIR=0, Cycle0=1
WCompare({EnableR},0,1004) //check test-clip b6.6
WCompare({R←NBR'},0,1005)
{ALUF.2}=0; //makes {aluf}=1 for ALUOUT←ALUA.IN
{LoadAd'}=1; //de-activate
{AdvancePipe'}=0; //for MC2XferWord←1, MC2XWdly←1
{EdgeClockFeed'}=0
//WCompare(1,0,1006)
{EdgeClockFeed'}=1; //reset cycler/masker bypass flip-flop, H2←(F1F2=0) (i.e. H2'←#177777), ALUF()←1 for ALUOUT←(ALUA.IN=ALUA), MC2XferWord←1, MC2XWdly←1
WCompare({H2},0,1007)
WCompare({MC2XferWord},1,1008)
{Cycle0Feed'}=1; //Cycle0=0
{MASK}=#177777; //ALUA←0's
WCompare({ALUA},0,1009)
{EdgeClockFeed'}=0
//WCompare(1,0,1010)
{EdgeClockFeed'}=1; //Stkp←(ALUA=0), RSA,B←3,3(Stkp), TComing←1, TWPending←1, RComing←0, RWPending←0
{Cycle0Feed'}=0; //Cycle0=1
{rbus}=#177777
{EdgeClockFeed'}=0
WCompare({clkH3P'},0,1011) //check test-clip d7.12
//WCompare(1,0,1012)
{EdgeClockFeed'}=1; //H1←(rbus=#177777), H3P←(ALUOUT=ALUA.IN=ALUA=0), RASAVE←RA←(Stkp=0), reset EnableMask (i.e. route ALUB←H2)
{rbus}=###
{Cycle0Feed'}=1; //Cycle0=0
WCompare({rbus},0,1013) //rbus←H3P
{SALUF←H2'}=0
{EdgeClockFeed'}=0
//WCompare(1,0,1014)
{EdgeClockFeed'}=1; //SALUF←(H2[8:15]=0) (includes MA',MB), WA←(RASAVE=0), RSA,B←3,3(Stkp), SStkp←(Stkp=0)
{Cycle0Feed'}=0; //Cycle0=1
{SALUF←H2'}=1; //keep SALUF=0
{MASK}=0; //ALUA←(H1=#177777)
//Additional check of the SpeakTest initialization sequence
//Edge connector signals:
WCompare({Suspend-a},0,1020)
WCompare({R←NBR'},0,1021)
WCompare({H2},0,1022)
WCompare({ALUA},#177777,1023)
WCompare({SRC/DEST=0'},1,1024)
//Test connector signals (tester socket "B" to test-clips):
WCompare({EnableR},0,1030) //pin 1 to test-clip b6.6
WCompare({clkH3P'},1,1031) //pin 2 to test-clip d7.12
WCompare({RWriteStrobe'},1,1032) //pin 3 to test-clip c7.11
WCompare({TWriteStrobe'},1,1033) //pin 4 to test-clip c7.6
WCompare({RA=WAa},1,1034) //pin 5 to test-clip d10.12
WCompare({RA=WAb},1,1035) //pin 6 to test-clip d10.10
//registers displayable on R bus:
{Stkp←ALUA'}=1; //keep Stkp=0
{mirbus}=#1547; //MemInst=0, RMOD=1, RSEL=00 00 11
ClockMIR() //rbus←SStkp,Stkp'
WCompare({rbus},#377,1040)
{mirbus}=#1557; //MemInst=0, RMOD=1, RSEL=00 01 11
ClockMIR() //rbus[8:15] ← not(MA',MB,SALUF[0:5])
WCompare({rbus}Ź,#377,1041)
//Test the Suspend flip-flop (page 13) and the MemNeedsR gates (page 16)
//Suspend/d = MemNeedsR = MC1NeedsR.MC1XferWord + MC2WillGetR.MC2XferWord
//prom f2 (page 16) contols MC1XferWord; ALUF.2 contols prom f2:
//ALUF.2=0 will mean prom address = 1100 1010 (ouput = 0011)
//ALUF.2=1 will mean prom address = 1100 1110 (ouput = 1111)
//hence, MC1XferWord will follow ALUF.2
//{MemNeedsRbus: ALUF.2,MC1NeedsR,MC2WillGetR}
let t1sb = table [ 0;0;0;0; 0;1;0;1; 0;0;1;1; 0;1;1;1 ]
//Verify condition of signals resulting from SpeakTest
WCompare({MC2XferWord},1,1101)
{Cycle0Feed'}=1; //keep H2=0 and H1=-1 for prom f2 address = 1100 1x10
{LoadAd'}=0; //all clocks in loop will cause MC1XferWord←ALUA.2
for i = 0 to 15 do
[
{MemNeedsRbus}=i
EClock() //MC1XferWord←(ALUF.2=i[13])
{ALUF.2} = i rshift 3
ClockMC2() //MC2XferWord←(MC1XferWord=i[13])
//MC1XferWord←(ALUF.2=i[12])
WCompare({MC2XferWord},(i rshift 2)&1,1103,i)
//Status: (MC1XferWord,MC2XferWord,MC1NeedsR,MC2WillGetR)=i
EClock() //Suspend←MemNeedsR
WCompare({Suspend-a},t1sb!i,1105,i)
]
//Check that RUN=0 D.C. resets Suspend
{RUN}=0
WCompare({Suspend-a},0,1006) //DC reset
{RUN}=1; //return to normal
WCompare({Suspend-a},0,1007) //should remain reset
]
//**************************************************************************************
//Test 2: Check all outputs generated on page 19.
// The test sends all possible values of the inputs
// and calculates what the result should be.
and Test2() be
[
SpeakTest(2) //set initial conditions (see notes at end of ALU.TST)
//{t2drive: MC1NeedsR, Cycle0Feed',MemInst/d,RMOD/d, RSEL.0/d',RSEL.1/d',RSEL.2/d, RSEL.3/d,RSEL.4/d,RSEL.5/d}
//{t2out: MemInst-a, R←NBR',R←DBSB',R←PCXF', R←SpareR',ReadErrors',ReadSyn', EnCtrlAuxRa,EnCtrlAuxRb,RSEL-Parity}
for i = 0 to #1777 do
[
{t2drive}=i
//set values which are combinatorial functions of other inputs
{RSEL4and5/d} = i<<w.b14 & i<<w.b15
{RMOD/d'} = not i<<w.b9
{MemInst/d'} = not i<<w.b8
ClockMIR() //Load MIR, Suspend←MC1NeedsR
WCompare({t2out},t2sb(i),2000,i)
]
]
and t2sb(i) = valof
[
let suspendprime = not i<<w.b6
let d16enabled = (i<<w.b9 & i<<w.b14 & i<<w.b15) & i<<w.b10 & ((not i<<w.b8) & suspendprime & (not i<<w.b7))
let rsel123 = ((i rshift 2) xor 4) & 7
let sb = 0
sb<<w.b6 = i<<w.b8 //MemInst-a
sb<<w.b7 = (d16enabled & (rsel123 eq 7))? 0,1 //R←NBR'
sb<<w.b8 = (d16enabled & (rsel123 eq 6))? 0,1 //R←DBSB'
sb<<w.b9 = (d16enabled & (rsel123 eq 5))? 0,1 //R←PCXF'
sb<<w.b10 = (d16enabled & (rsel123 eq 4))? 0,1 //R←SpareR'
sb<<w.b11 = (d16enabled & (rsel123 eq 3))? 0,1 //ReadErrors'
sb<<w.b12 = (d16enabled & (rsel123 eq 2))? 0,1 //ReadSyn'
sb<<w.b13 = (not i<<w.b8) & suspendprime & i<<w.b14 & i<<w.b15 //EnCtrlAuxRa
sb<<w.b14 = i<<w.b9 & (not i<<w.b10) & i<<w.b11 //EnCtrlAuxRb
sb<<w.b15 = i<<w.b8 xor i<<w.b9 xor i<<w.b10 xor i<<w.b11 xor i<<w.b14 xor i<<w.b15 //c17 output
resultis sb
]
//**************************************************************************************
//Test 3: Test EnableR when MC2WritingR' is inactive (high) (page 6)
// MC2WritingR = MC2HasR.MC2AllowWrite.MC2XWdly = 00x for this test
// (For MC2WritingR' active cases, see Test 4)
and Test3() be
[
SpeakTest(3) //set initial conditions (see notes at end of ALU.TST)
//{t3drive: MemInst/d,RMOD/d', MC1WriteR,MC1NeedsR,Cycle0Feed', RSEL.0/d',RSEL.1/d',RSEL4and5/d}
for i = 0 to #377 do
[
{t3drive}=i
ClockMIR()
WCompare({EnableR},t3sb(i),3000,i)
]
]
and t3sb(i) = valof
[
let suspendprime = not i<<w.b11
let GoCycle0 = suspendprime & (not i<<w.b12)
let EnAuxR = (not i<<w.b9) & i<<w.b15
let EnableR = (GoCycle0 & (not i<<w.b13) & (not i<<w.b14)) % ((not i<<w.b10) & (not suspendprime)) % (GoCycle0 & (not EnAuxR)) % (i<<w.b8 & suspendprime)
resultis EnableR & 1
]
//**************************************************************************************
//Test 4: Test the R and T Write Strobes and clkH3P' (pages 6,15)
// Test EnableR (page 6) when MC2WritingR' is active
// Test EnableRDlyd2 (page 18). (CheckRParity'=0)
and Test4() be
[
SpeakTest(4) //set initial conditions (see notes at end of ALU.TST)
//{t4drive: RamClockFeed',Cycle0Feed', MC1WriteR,MC1NeedsR,MemInst/d, Abort',LR,LT}
//PART 1: Test the MC2WritingR' gate (page 16). (Input to RWrite and EnableR)
// MC2WritingR = MC2HasR.MC2AllowWrite.MC2XWdly
//ALUF.2 addresses prom f2 which contols MC1XferWord and MC1XWdly (page 16):
//ALUF.2=0 will mean prom address = 1100 1010 (ouput = 0011)
//ALUF.2=1 will mean prom address = 1100 1110 (ouput = 1111)
//hence: MC1XferWord, MC2XferWord and MC2XWdly will follow ALUF.2
//{t4MC2bus: MC2WillGetR,MC2AllowWrite,ALUF.2}
let t4sb = table [ 1;1;1;1; 1;1;1;0; 1 ]
{t4drive}=#125; //for: RamClock=1 (enable RWriteStrobe'), Cycle0=0 (keeps H1=-1, H2=0),
//MC1WriteR=0, MC1NeedsR=1 (for set Suspend), SRC/DEST=0' =1 (for f2 prom)
{LoadAd'}=0; //all clocks to the end of TEST 4 will cause MC1XferWord←ALUF.2
for i = 0 to 8 do //(MC2HasR,MC2AllowWrite,MC2XWdly)←i[13:15]
[
{t4MC2bus} = i
EClock() //MC1XferWord←(ALUF.2=i[15]), MC1XWdly←(prom f2, pin 9 =1)
{ALUF.2}=1
ClockMC2() //MC2XferWord←(MC1XferWord=i[15])
//MC1XferWord←(ALUF.2=1) (for Suspend←1)
WCompare({MC2XferWord},i&1,4040+i)
ClockMC2() //MC2XWdly←(MC2XferWord=i[15]) (effective revision-J)
//h2.15 ff ←(MC1XWdly=1)
//(MC2XWdly WAS the h2.15 ff (=1) before revision-J)
//MC2XferWord←(MC1XferWord=1) (don't care)
//Suspend←1 (since MC1NeedsR=1 and MC1XferWord=1)
//MC2HasR←(MC2WillGetR=i[13])
WCompare({RWriteStrobe'},t4sb!i,4060+i)
WCompare({EnableR},t4sb!i,4080+i)
EClock() //c16b ff ← EnableR' (Page 16)
EClock() //EnableRDlyd2 ← (not c16b ff).(CheckRParity=1)
WCompare({EnableRDlyd2},t4sb!i,4100+i)
]
//PART 2: Test all cases in which MC2WritingR' remains high (inactive since inputs =000)
let t4dval = table [
#105;#004;#106;#004; #103;#047;#117;#014; #104;#114;#107;#127; #024;#104;#307 ]
//internal signals: RComing',TComing', (RComing+TComing),RWPending,TWPending
// #25; #25; #16; #16; #30; #30; #07; #33; #33; #30; #30; #07; #07; #07; #07
//{t4out: Suspend-a,MemInst-a, clkH3P',RWriteStrobe',TWriteStrobe'}
let t4outval = table [
#06; #03; #05; #03; #07; #05; #17; #17; #04; #17; #07; #27; #27; #04; #07 ]
//Note: since ALUF.2=1, the prom f2 address = xxxx x1x0 for output = 1111,
//and since LoadAd'=0, all clocks will cause MC1XferWord←1,
//hence, Suspend←1 when MC1NeedsR=1
{LoadMIR}=1; //for MemInst←MemInst/d when Cycle0=0
{MC1NeedsR}=0
EClock() //Suspend←0, MC1XferWord←1 (for Suspend control)
for i = 0 to 14 do
[
{t4drive}=t4dval!i
EClock() //load control flip-flops
{EdgeClockFeed'}=0; //for observe clkH3P'
WCompare({t4out},t4outval!i,4200+i,t4dval!i)
{EdgeClockFeed'}=1; //return to normal
]
]