5 Analysis of Design
5. 1 Problem
Here is a section of source code analysis. An example analysis was performed using trace mode-2 in Veritak Simulator. (Off course, you can use another tool).
Load Veritak Project "altera_rtl_trace_count.vtakprj"
Let's look at the instruction "ori $sp,$sp,#$3380". Micro operation is
|$sp | #$3380 => $sp|
It is noted that Register File $sp has not been written yet even at Stage5.
What will be happened if $sp is referenced in any stage of stage2-stage5 ? This is called RAW (Read After Write) Data Hazard.
Forwarding mechanism overcomes this problem.
|Set Register File Address||Read Register File
|Write Register File
|1||Fetch & Decode
|2||Fetch & Decode
|3||Fetch & Decode
|ReadRegisterFile||ALU=LEFT(0) or RIGHT(#$3380);
5.2 "Forwarding" Analysis
Let's look at tool-tip displays "sw $z0, 0($a0)"
This instruction causes RAM Write operation at the address of 0x928 followed by 2 clocks. However, 0x928(=$a0) has been set by the instruction ori $a0,$a0,0x928 prior to 5cycles. So this is the forwarding case.
Pipelined Registers carry 0x928 in forwarding.
Let' trace the situation back in following analysis.
0: 3c1c0000 lui $gp,0x0
To investigate what is driving the Daddress 0x928, Jump to tag file,
Then jump to the tag file which describes entire structure of design by text file.
Move to SourceDriver =>Assigned:
Select the signal,and DBLCLICK
Jumps to the source code where DAddress is assigned.
We realize that DAddress is result of ( not time consuming) add operation between alu_source and IRD2 concerned.
There is another way to jump to the driver.
You can jump to the source code by "Jump to Driver" directly.
Set T1 cursor at write strobe time, select the signal ,and Jump to Driver..
Same result as tag-jump.
Since this assignment is combinational logic, you can view the value by tool tip.
Now, we realize that "alu_source" is 32'h928 which is next target for further analysis.
Add "alu_source " to WaveformView for further analysis.
Jump to Driver for "alu_source"
Expand the signal to bits.
Then jump to driver by any signal activated.
Then jumps to the position. This is combinational circuit which has no time-consumption. We can tool-tip the value in this case.
Add "alu_left_latch " to the WaveformView for further analysis.
Jump to Driver..
Jumps to the position where "alu_left_latch" is assigned by non-blocking statement
Jump to Driver by "DReg" at T1 cursor.
We realize "DReg " is just pipelined register
Let's investigate what is driving "RReg".
NReg is Driving.
What is driving "NReg" ?
"AReg" is driving.
What is driving "AReg"?
"alu_out " is driving.
Then investigate the driver of "alu_out".
We realize alu_out=a | b;
Finally We understand "the value 0x928 is derived from the instruction " ori $a0, $a0,#$928" through pipelined registers ,not from register file's output. You can see block diagram I wrote ,which is a sketch in early design stage.