CS/COE 447: Spring 2010 Lab 13
YOUR NAME: SOLUTION
YOUR PARTNER'S NAME: --------
=====Question 1
Refer to slide 21 of the lecture notes for Chapter 4, Part 1.
Consider the instruction add $s0,$s1,$s2.
First, figure out the machine code for the instruction. Find the
places on the figure where pieces of the instruction are referred to.
Make sure you figure out which bits of the instruction go where in the
figure. Pls ask if you have a question.
Answer: machine code in hex 0x02328020
instruction[31-26] (opcode) 000000
instruction[25-21] (rs = $s1) 10001
instruction[20-16] (rt = $s2) 10010
instruction[15-11] (rd = $s0) 10000
**The subset of MIPS covered in this chapter does not
include the shift instructions. So, none of these figures
will do anything with the "shamt" field of the R instructions**
instruction[15-0] (garbage for R instructions) 1000000000100000
instruction[5-0] (funct) 100000
The Control Unit (the oval in the middle of the figure) generates
control signals, based on the opcode. The ALU Control Unit (the oval
toward the bottom right) also generates control signals (specifically,
the ALU control signals), based on the funct field of the instruction
and an output from the top Control Unit. HOWEVER, these are not
direct mappings, so you won't see a one-to-one correspondence between
bits in the opcode & funct fields, and the control signals.
Nevertheless, you can figure out what values the control signals
should be, by looking at the figure and using your knowledge of
the instructions. (At least, for most of them.)
Write down the values below for the following control signals.
If a control signal turns something on or off, its value is either 1
or 0. E.g., MemRead = 1 if something is read from memory, and 0 if
not.
For "Output of ALU Control" (the control signal generated by the ALU
Control Unit), we haven't yet covered enough for you to know what
particlar binary values these are. So, please just indicate one of
'add', 'sub', 'or', 'and'.
Also, if a signal's value does not matter for that instruction, please
indicate an X. That is, the instruction would execute exactly the
same way, whatever value an X signal has. As you do this lab, it will
be interesting to recognize the X signals. Please ask if you have any
questions.
Signal Value
------ -----
RegDst 1 For R-instructions, rd specifies
the register to be written to.
---------------------------------------
Branch 0 This is not a branch instruction.
---------------------------------------
MemRead 0 There is no memory read for the
add instruction
---------------------------------------
MemToReg 0 The mux controlled by this signal
determines which value is written to
register rd. When this signal is 0,
the output of the ALU is written to rd,
which is what we want (the output of the
ALU is the result of adding rs and rt)
---------------------------------------
(ALUOp - we haven't yet covered enough
to answer this)
---------------------------------------
MemWrite 0 There is no memory write for the add
instruction
---------------------------------------
ALUSrc 0 The mux controlled by this signal
determines the lower input to the ALU.
0 means that the input is rt.
---------------------------------------
RegWrite 1 Yes, a value is written to a register
(namely register rd)
---------------------------------------
Output of ALU Control add
---------------------------------------
Output of the And Since Branch is 0, the output of the And
Gate at the top right 0 gate is 0 (whatever Zero happens to be)
---------------------------------------
Now, assuming that $s1 contains 0x00000007 and $s2 contains
0x00000004, what values are at the following inputs and outputs of the
functional units? If an input or output doesn't matter for the
instruction, then put an X next to the value. (Since combinatorial
logic determines all of these inputs and outputs, there ARE values at
all of them. It's just that some of them may be irrelevant for this
instruction. The same is true for the control signals, but we don't
have enough information at this point to determine what the values of
the X control signals are.)
Input Value
----- -----
Read 10001
register 1
---------------------------------------
Read
register 2 10010
---------------------------------------
Write
register 10000
---------------------------------------
Write
data of 0x0000000b
register file
---------------------------------------
Top input
to ALU 0x00000007
---------------------------------------
Bottom input
to ALU 0x00000004
---------------------------------------
Address The value present at the Address input
of memory 0x0000000b X of memory is 0x0000000b. However, we
mark this as X, because this value
doesn't matter for an add instruction,
which does not involve a memory access
---------------------------------------
Write data 0x0000000b X Similar comment to the above. The
of memory contents of rs are present at the Write
data input to memory, but this value
doesn't matter for an add instruction.
Output Value
------ -----
Read 0x00000007
data 1
---------------------------------------
Read 0x00000004
data 2
---------------------------------------
Output of ALU 0x0000000b
---------------------------------------
Zero of ALU 0 The result of the add operation is not
(1 if ALU a 0; so, Zero is 0 (i.e., false)
output is 0;
0, otherwise)
---------------------------------------
Read Data X We don't care what is at this output
of memory to memory, and we don't even know what
it is. So, it is just X.
=====Question 2
Now, do the same thing for the instruction
sw $t3,-8($t4)
assuming that $t3 contains 0x0000000f and $t4 contains 0x1001002c.
Answer: The machine code for this instruction is 0xad8bfff8
101011 01100 01011 11111 111 1111 1000
instruction[31-26] (opcode) 101011
instruction[25-21] (rs = $t4) 01100
instruction[20-16] (rt = $t3) 01011
instruction[15-11] (rd = NA) 11111 -- meaningless for an sw
instruction[15-0] (imm = -8) 1111 1111 1111 1000
instruction[5-0] (funct = NA) 111000 - meaningless for an sw
Signal Value
------ -----
RegDst X The mux controlled by RegDst chooses
which register to write to. Since there
is no write to a register for a sw
instruction, it doesn't matter what this
signal is.
---------------------------------------
Branch 0 This is not a branch instruction
---------------------------------------
MemRead 0 No memory read for a sw
---------------------------------------
MemToReg X The mux controlled by MemToReg
determines the source of the write data
input to the register file. Since there
is no write to the register file for a
sw, we don't care what this value is.
---------------------------------------
(ALUOp - we haven't yet covered enough
to answer this)
---------------------------------------
MemWrite 1 There is a write to memory for a sw
---------------------------------------
ALUSrc 1 The mux controlled by this signal
determines the lower input to the ALU.
1 means that the input is the immediate
value from the instruction after it has
been sign extended.
---------------------------------------
RegWrite 0
---------------------------------------
Output of ALU Control add The ALU is used to calculate the
effective address -- the address for the
memory access. Specifically, in our
example, $t4 + -8.
---------------------------------------
Output of the And Since Branch is 0, we know the output
Gate at the top right 0 of this and gate is 0
---------------------------------------
Input Value
----- -----
Read
register 1 01100
---------------------------------------
Read
register 2 01011
---------------------------------------
Write There is no write to the register file
register X for a sw. Since we don't know/care about
the value of the mux pointing to this
input, we don't know what the value is,
either.
---------------------------------------
Write
data of
register file X
---------------------------------------
Top input 0x1001002c
to ALU
---------------------------------------
Bottom input
to ALU 0xfffffff8
---------------------------------------
Address 0x10010024
of memory
---------------------------------------
Write data 0x0000000f So, 0x0000000f is written to
of memory M[0x10010024]
Output Value
------ -----
Read
data 1 0x1001002c
---------------------------------------
Read 0x0000000f
data 2
---------------------------------------
Output of ALU 0x10010024
---------------------------------------
Zero of ALU
(1 if ALU 0
output is 0;
0, otherwise)
---------------------------------------
Read Data X There is not a memory read for a sw,
of memory so we don't care (and we don't even
know) what is present at the Read data
output of memory.
*** A suggested exercise on your own: do this exercise for a BEQ instruction