=====================
= Lec-4-HW-hintsOnTesting.html
====================
When you start working on your LC3 design, you will make a few small changes
and then test the result. You could write your own testbench, but I wrote
one that is probably all you'll need for a while, test:top_rtl_testInstr{sch}.
Here is the output you should get when you run that testbench before you've
made any changes:
----------------------------(3)----
---((( 18 )))-----[ ]----[ ]--
PC[0200] MAR[0000] MDR[0000] IR[0000 000 000 000 000] PSR[0--000--000]
R0[0000] R1[0000] R2[0000] R3[0000] R4[0000] R5[0000] R6[0000] R7[0000]
----------------------------(24)----
---((( 33 )))-----[ ]----[ ]--
PC[0200] MAR[0000] MDR[0000] IR[0000 000 000 000 000] PSR[0--000--000]
R0[0000] R1[0000] R2[0000] R3[0000] R4[0000] R5[0000] R6[0000] R7[0000]
STOPPED AT 1002 ==============
The first 4 lines are to be read together.
1st: time when all 4 display lines were generated, "---(3)---" for tick 3.
2nd: current state "---((( 18 )))---", non-zero control signals "---[]---",
non-zero mux selects "---[]---".
3rd: current values of the PC, MAR, MDR, IR, and PSR (last two shown as
bits, others as hex.)
4th: current values in REG_FILE registers (in hex).
Since the control signals are mostly all set to all zeroes in the version
of uStore you use as a starting point in your project, nothing is shown in
the first pair of brackets "---[]---" in Line 2. If some control signal was
non-zero (ie., equal 1) the name of that signal would appear in the brackets.
For instance, having figured out that the LD_MAR and LD_PC should be 1 in
state 18, Joe makes that change in uStore and tests again:
----------------------------(3)----
---((( 18 )))-----[ LD_MAR LD_PC ]----[ ]--
...
The second pair of brackets is for all MUX select control signals. If any
MUX select signal is non-zero in that state, the signal's name and value will
appear inside the second pair of brackets.
So, here is the work cycle:
1. Fix something (a wire or bus connection, a control signal setting).
2. Generate the top_rtl_testInstr.v testbench
3. Do "iverilog top_rtl_testInstr.v", and "vvp a.out"
4. Inspect the output to see if the correct registers changed as they
should have. Go back to 1 if not.
Note that registers capture their input and change their output accordingly
on the rising edge of the clock signal, if their write-enable "we" is 1.
LD_MAR is the name of the wire (aka, net) connected to the MAR's "we" input.
In Joe's case, he checks the MAR's value in state-33 to see if the MAR was
correctly written into by state-18: he looks at the value of the PC in
state-18, and checks that that value appears in the MAR in state-33 as
required by the RTL for state-18: "MAR <== PC".
Note also that only two state changes are shown over the entire 1002
simulation ticks. The display is only triggered when the state-changes.
We conclude that the controller repeatedly looped back to state-33, ie.,
after entering state-33, the controller remained in state-33. If we look at
the LC3's state diagrams in PP, appendix C, we see that state-33 is waiting
for the memory's ready signal, R. Apparently, it never became a 1. We can
confirm this by looking at the state display "---((( 33 )))---". If a
controller input signal is non-zero in some state, that signal will appear
next to the state number. Those input signals are R, BEN, IR[15:12], INT, and
PSR[15]. The IR bits are not shown since they already appear in the display
of the IR's content. Since the display is only triggered when the
controller's state changes, any signals changing value before the next state
change will not appear until that next state's display comes out. If state-33
does receive the R=1 signal sometime after entering state-33, the R signal
will show up in the next state's display. In this case, state-35:
---((( 35 R )))-----[ ]----[ ]--
However, this display will never appear unless the controller actually moves
out of state 33. And that will only occur if all the wire connections and
controls are correct, at least for having the Memory-IO bus generate the
R=1 signal in state 33.
A final note on wire connections. Some wire or bus connections are missing.
You can check on connectivity by selecting a device's input or output port
crosshair. If you have selected it, the icon will change to have a white
border, and the selected port's crosshair will also appear in white. Any
wires (busses) connected to that port will also become highlighted in white.
Zoom out to see all the connections. The highlighting does not go through
devices though. All the control signals are properly connected, but it's a
good idea to check nevertheless.