REP blocks and branching issue.

in Propeller 2
I started a new thread to isolate the REP issues "evanh" found from the FPGA files thread.
Here's my current test code demonstrating the Jxxx instruction issue.
And here's the results from my debugger.
Version1 & 3 work correctly, but version2 with the "JATN" instruction restarts the cancelled REP block again.
Version1 results
PA = $7788 shows correct REP block cancel.
Version2 results
Version3 results
So a "rel9" branch works OK.
I'll keep digging......
FYI: These test were done on FPGA becuase sadly I fried my P2 silicon this morning.
Here's my current test code demonstrating the Jxxx instruction issue.
test_code
mov pa,#0
mov pb,#0
cogid cog
decod cog
{
'In version1 the ATN flag is polled and a branch cancels the REP
loop if C=1. This works corretly.
}
{
version1 rep @rep_end,#0
incmod pb,#7 wz
if_z cogatn cog
add pa,#1
add pa,#$10
pollatn wc
if_c jmp #escape
add pa,#$100
add pa,_1000
rep_end
}
{
In version 2 a JATN is used.
This cancels the REP block but then restarts the REP block again.
}
{
version2 rep @rep_end,#0
incmod pb,#7 wz
if_z cogatn cog
add pa,#1
add pa,#$10
jatn #escape
add pa,#$100
add pa,_1000
rep_end
}
{
To check relative (rel9) branches work, this version uses a TJZ instruction.
It cancels correctly too.
}
'{
version3 rep @rep_end,#0
incmod pb,#7 wz
add pa,#1
add pa,#$10
tjz pb,#escape
add pa,#$100
add pa,_1000
rep_end
'}
escape jmp #$
_1000 long $1000
cog long 0
And here's the results from my debugger.
Version1 & 3 work correctly, but version2 with the "JATN" instruction restarts the cancelled REP block again.
Version1 results
<LOG>>step
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
001: F607EE00 MOV PB,#test_code
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
002: FD601E01 COGID cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
003: F9C01E0F DECOD cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
004: FCDC1000 version1 REP #$8,#test_code
005: F70FEE07 INCMOD PB,#$7 WZ
006: AD601E3F IF_z COGATN cog
007: F107EC01 ADD PA,#$1
008: F107EC10 ADD PA,#$10
009: FD701C24 POLLATN WC
00A: CD900008 IF_c JMP #rep_end
00B: F107ED00 ADD PA,#$100
00C: F103EC0E ADD PA,_1000
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: C Z BRK:00
00D: FD9FFFFC rep_end JMP #rep_end
<LOG>(step) >pa
pa COG $1F6: $00007788 %0000_0000000_000_000111011_110001000 30600
<LOG>>logoff
PA = $7788 shows correct REP block cancel.
Version2 results
<LOG>>step
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
001: F607EE00 MOV PB,#test_code
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
002: FD601C01 COGID cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
003: F9C01C0E DECOD cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
004: FCDC0E00 version2 REP #$7,#test_code
005: F70FEE07 INCMOD PB,#$7 WZ
006: AD601C3F IF_z COGATN cog
007: F107EC01 ADD PA,#$1
008: F107EC10 ADD PA,#$10
009: FBCC1C02 JATN ,#$2 (+2)
00A: F107ED00 ADD PA,#$100
00B: F103EC0D ADD PA,_1000
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc Z BRK:00
004: FCDC0E00 version2 REP #$7,#test_code
005: F70FEE07 INCMOD PB,#$7 WZ
006: AD601C3F IF_z COGATN cog
007: F107EC01 ADD PA,#$1
008: F107EC10 ADD PA,#$10
009: FBCC1C02 JATN ,#$2 (+2)
00A: F107ED00 ADD PA,#$100
00B: F103EC0D ADD PA,_1000
<LOG>(step) >pa
pa COG $1F6: $00007788 %0000_0000000_000_000111011_110001000 30600
<LOG>>step
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc Z BRK:00
004: FCDC0E00 version2 REP #$7,#test_code
005: F70FEE07 INCMOD PB,#$7 WZ
006: AD601C3F IF_z COGATN cog
007: F107EC01 ADD PA,#$1
008: F107EC10 ADD PA,#$10
009: FBCC1C02 JATN ,#$2 (+2)
00A: F107ED00 ADD PA,#$100
00B: F103EC0D ADD PA,_1000
<LOG>(step) >pa
pa COG $1F6: $0000EF10 %0000_0000000_000_001110111_100010000 61200
<LOG>>logoff
Note that the REP cancels correctly with PA = $7788, but then restarts the REP block again.Version3 results
<LOG>>step
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
001: F607EE00 MOV PB,#test_code
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
002: FD601A01 COGID cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
003: F9C01A0D DECOD cog
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc nz BRK:00
004: FCDC0C00 version3 REP #$6,#test_code
005: F70FEE07 INCMOD PB,#$7 WZ
006: F107EC01 ADD PA,#$1
007: F107EC10 ADD PA,#$10
008: FB97EE02 TJZ PB,#$2 (+2)
009: F107ED00 ADD PA,#$100
00A: F103EC0C ADD PA,_1000
<LOG>(step) >
~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~
TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Cog #1 FLAGS: nc Z BRK:00
00B: FD9FFFFC rep_end JMP #rep_end
<LOG>(step) >pa
pa COG $1F6: $00007788 %0000_0000000_000_000111011_110001000 30600
<LOG>>logoff
REP block cancels correctly woth PA = $7788.So a "rel9" branch works OK.
I'll keep digging......
FYI: These test were done on FPGA becuase sadly I fried my P2 silicon this morning.

Comments
Oh no! How did that happen?
Starting grieving process now.
I mourn for you, too. We could send you another glob-top prototype for soldering onto a P2D2.
Update: Fixed my one. Turned out to just be IC sockets. Wriggled the chips and perfect readings again.
Version4 has a relative jump. (Does extra loop)
Version5 has a absolute branch. Works Ok
Version6 is a relative branch with NOP padding to show PC+relative issue.
Version4 results
<LOG>>stat ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 000: F607EC00 test_code MOV PA,#test_code <LOG>>step ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 001: FCDC0C00 version4 REP #$6,#test_code 002: F70FEE07 INCMOD PB,#$7 WZ 003: F107EC01 ADD PA,#version4 004: F107EC10 ADD PA,#$10 005: F107ED00 ADD PA,#$100 006: F103EC09 ADD PA,_1000 007: AD900000 IF_z JMP #rep_end <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 002: F70FEE07 INCMOD PB,#$7 WZ <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 003: F107EC01 ADD PA,#version4 <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 004: F107EC10 ADD PA,#$10 <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 005: F107ED00 ADD PA,#$100 <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 006: F103EC09 ADD PA,_1000 <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 007: AD900000 IF_z JMP #rep_end <LOG>(step) >pa pa COG $1F6: $00009999 %0000_0000000_000_001001100_110011001 39321 <LOG>>logoff
PA = $9999 (1extra loop)
Version5 results
<LOG>>stat ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 000: F607EC00 test_code MOV PA,#test_code <LOG>>step ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 001: FCDC0C00 version5 REP #$6,#test_code 002: F70FEE07 INCMOD PB,#$7 WZ 003: F107EC01 ADD PA,#version5 004: F107EC10 ADD PA,#$10 005: F107ED00 ADD PA,#$100 006: F103EC09 ADD PA,_1000 007: AD800008 IF_z JMP #rep_end <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 008: FD9FFFFC rep_end JMP #rep_end <LOG>(step) >pa pa COG $1F6: $00008888 %0000_0000000_000_001000100_010001000 34952 <LOG>>logoff
With absolute brach PA = $8888 which is the correct result.Version6 result
<LOG>>stat ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 000: F607EC00 test_code MOV PA,#test_code <LOG>>step ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc nz BRK:00 001: FCDC0C00 version6 REP #$6,#test_code 002: F70FEE07 INCMOD PB,#$7 WZ 003: F107EC01 ADD PA,#version6 004: F107EC10 ADD PA,#cog 005: F107ED00 ADD PA,#$100 006: F103EC0F ADD PA,_1000 007: AD900018 IF_z JMP #escape <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 008: 00000000 rep_end NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 009: 00000000 NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 00A: 00000000 NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 00B: 00000000 NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 00C: 00000000 NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 00D: 00000000 NOP <LOG>(step) > ~~~~~~~~~~~~~~~~~~~ Propeller 2 Debugger 3.3 File: demo3.obj ~~~~~~~~~~~~~~~~~~~ TOS: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Cog #1 FLAGS: nc Z BRK:00 00E: FD9FFFFC escape JMP #escape <LOG>(step) >pa pa COG $1F6: $00008888 %0000_0000000_000_001000100_010001000 34952 <LOG>>logoff
Note that the NOP padding "fudges" the relative branch to hit the right address.I think yes, evanh reports erratic exiting, which is a separate issue....
Yes. Version two in Brian's opening post is a branch-on-event. It intermittently fails by falling out the bottom of the "forever" REP block instead of taking the branch. And happens no matter where in the REP block it sits.
It's all good Chip. The smoke is on the way up to you
Other instructions that don't manipulate the program counter seem to execute as if nothing is wrong.
The conditional criteria for event jumps can possibly change within the instruction cycle, causing a bifurcated reaction in the REP/jump circuits. This shouldn't be allowed.
I'm going to fix this and make new FPGA files. This bug should go away, then.
Wendy's holding the door for us on this. I hope a few of you will be able to confirm that, indeed, this bug is gone, after I get the new FPGA images out.
Thanks for doggedly hammering on this. And the LUT problem. They should both be fixed here, shortly.
Cooking up new FPGA files now. Already sent the latest to Wendy at ON.
Just out of interest, could that potentially have gone batty for event branching in general? ie: Beyond REPing cases.
I wondered the same thing. I would need to look more carefully to know, for sure, but my design assumption was certainly that the 'jump' signal would be stable for the duration of the instruction. Hearing that event jumps behaved differently than other conditional jumps, I thought to look at the jump-criteria logic and it kind of jumped out at me. Of course, I jumped when the realization struck. I've been relaxed ever since I fixed it, though. And I'm really glad, too, that we fixed the LUT r+w glitch. That would have been a drag to live with.