Greetings All:
Tricky, I used the same source code and changed only the fitter seed several times to see if it was possible to stabilize the feedback oscillation under simulation. You are correct, any change will cause a different result, which is why I posted the Quartus version and chip target. I guessing changing the temperature range may change the propagation time for simulation. In real life, the chip's path times will change over temperature, voltage, other logic switching, and another chip of the same type, just as you have mentioned.
I have taken a couple screenshot, one shows the layout using seed 5, and the other using seed 9. That's what I expected, it would fit them in a different place. Since I didn't assign the pins used, it also placed the ports to different pins, that surprised me. Here are the propagation times listed under both positions...
Using Seed 5
+--------------------------------------------------------------+
; tpd ;
+-------+-------------------+-----------------+-------+--------+
; Slack ; Required P2P Time ; Actual P2P Time ; From ; To ;
+-------+-------------------+-----------------+-------+--------+
; N/A ; None ; 11.836 ns ; clock ; qn_out ;
; N/A ; None ; 11.737 ns ; k_in ; qn_out ;
; N/A ; None ; 11.677 ns ; reset ; qn_out ;
; N/A ; None ; 10.784 ns ; j_in ; q_out ;
; N/A ; None ; 10.709 ns ; j_in ; qn_out ;
; N/A ; None ; 10.674 ns ; clock ; q_out ;
; N/A ; None ; 10.390 ns ; k_in ; q_out ;
; N/A ; None ; 10.330 ns ; reset ; q_out ;
+-------+-------------------+-----------------+-------+--------+
Using seed 9
+--------------------------------------------------------------+
; tpd ;
+-------+-------------------+-----------------+-------+--------+
; Slack ; Required P2P Time ; Actual P2P Time ; From ; To ;
+-------+-------------------+-----------------+-------+--------+
; N/A ; None ; 13.884 ns ; clock ; q_out ;
; N/A ; None ; 13.608 ns ; j_in ; q_out ;
; N/A ; None ; 13.607 ns ; reset ; q_out ;
; N/A ; None ; 13.153 ns ; reset ; qn_out ;
; N/A ; None ; 13.043 ns ; k_in ; q_out ;
; N/A ; None ; 12.835 ns ; clock ; qn_out ;
; N/A ; None ; 12.589 ns ; k_in ; qn_out ;
; N/A ; None ; 11.718 ns ; j_in ; qn_out ;
+-------+-------------------+-----------------+-------+--------+
...I notice there is no time reported from Q to Qn, or vice-versa, that is the cross-feedback path which causes the oscillation. The simulations has those path timing, so they must be stored somewhere. Perhaps the newer timing analyzer has better capability.
A while ago I did some simulation testing on the latch capability to emulate a real chip that latches the data. I adjusted the time offset between the clock and the data in thousands of times by pico-seconds. It never oscillated, but yes, gives the latch warning. It did however, work in real life in the FPGA, and behaved as expected. If latches are chosen on purpose (which creates the latch warning), to they have any simulation or real life issues?
I hope that's interesting.
David K.