April 26, 2004
EE3755 EXAM 3:
Do not turn over the page till I say so.
Some problems are very easy so do not spend
Too much time on them.
If you think a problem is difficult, try to solve
The easy ones First.
Name:
SSN:
Problem 01(20pts): 10mins
(how much did you spend? Min)
Problem 02(10pts): 05mins
(how much did you spend? Min)
Problem 03(10pts): 05mins
(how much did you spend? Min)
Problem 04(10pts): 05mins (how much did you spend? Min)
Problem 05(10pts): 06mins
(how much did you spend? Min)
Problem 06(04pts): 02mins
(how much did you spend? Min)
Problem 07(08pts): 03mins
(how much did you spend? Min)
Problem 08(12pts): 02mins
(how much did you spend? Min)
Problem 09(10pts): 10mins
(how much did you spend? Min)
Problem 10(04pts): 01mins (how much did you spend? Min)
Bonus(02pts): 01mins
Total 100pts 50mins
//Solution
Problem 1: MIPS program.(20pts, 10mins)
1-a). Write a MIPS subroutine
program to add two numbers, 16bits at a time
and return
the result (similar to packed bcd).(14pts)
Ignore Carry out.
//C code
Int ADDTWO16_BITS(int a,int b){
Int c;
.. ……..//c= {{left half of a+ left half of b} ,{right
half of a + right half of b}}
return c;
}
For example )… a = 0x0001 0002,
//32 bits data
b = 0x0001
0002, //32 bits data then
c = 0x0002 0004 //add 2 - 16bits….
(checking points for grading: proper usage
of registers, instructions, algorithm, length)
Sol) MIPS code for ADDTWO16_BITS.
Use $a0,$a1 for
passing parameters
Use $v0 for
return value. #(1pts)
.data
newline: .asciiz "\n"
.text
.globl __start # Must be global
__start: li $a0,0x00000002
li $a1,0x00000002
jal
ADDTWO16_BITS
nop
move $a0,$v0
jal
PRINT_SUB
nop
addi
$v0,$0,10
syscall
ADDTWO16_BITS:
li
$t0,0xffff0000 # MASK UPPER 16BITS
and
$t1,$a0,$t0 # MASK
and
$t2,$a1,$t0 # MASK
add
$t3,$t1,$t2 # add UPPER 16bits.lower 16bits contains all zeroes.
add
$t4,$a0,$a1 # don't care about upper
16bits.
li
$t0,0x0000ffff #MASK lower 16BITS
and
$t4,$t4,$t0
or $v0,$t3,$t4 # save return value to $v0.
jr $ra
nop
PRINT_SUB: addi $v0,$0,1
syscall
la
$a0,newline
addi
$v0,$0,4
syscall
jr $ra
nop
syscall
addi $v0,$0,10
syscall
1-b)
Write a MIPS drive program(calling
program) for the above ADDTWO16_BITS
routine.(6pts)
//C code.
…
a = 0x00010002; //line 1
b = 0x00010002; //line 2
c = ADDTWO16_BITS(a,b);//line 3
…
(hint: Write a MIPS code for above line 1, line 2 and line 3)
(checking points for grading: proper usage
of registers, instructions)
sol)
li $a0,0x00000002
li $a1,0x00000002
jal
ADDTWO16_BITS
problem 2: Complete the module(10pts,5min)
###########################################
module three_bit_Booth(prod,ready,multiplicand,multiplier,start,clk);
input [15:0] multiplicand, multiplier;
input start, clk;
output prod;
output ready;
reg [32:0] product;
wire [31:0] prod = product[31:0];
reg [3:0] bit;
wire ready = !bit;
reg d;
initial bit = 0;
wire [16:0] multsx
= {multiplicand[15],multiplicand}; //Fill here
always @( posedge clk )
if( ready && start ) begin
bit = 8;
product = { 17'd0, multiplier }; //Fill here
d = 0;
end else if( bit ) begin
case ( {product[1:0],d} ) //Fill here
3'b001: product[32:16] = product[32:16] + multsx;
3'b010:
product[32:16] = product[32:16] + multsx;
3'b011: product[32:16] = product[32:16]
+ 2 * multiplicand; //Fill here
3'b100: product[32:16] = product[32:16]
- 2 * multiplicand; //Fill here
3'b101: product[32:16] = product[32:16]
- multsx; //Fill
here
3'b110: product[32:16] = product[32:16]
- multsx; //Fill here
endcase
d = product[1];
product = { product[32], product[32], product[32:2]
};//Fill here
bit = bit - 1; //Fill here
end
endmodule
Problem 3: Complete the module(10pts,5mins).
################################################################
// A 5-bit CLA using
five cla slice parts. The generate and
propagate
// signals are used to
produce the carry signals.
module cla_5(sum,cout,
a,b,cin);
input [4:0] a, b;
input cin;
output [4:0] sum;
output
cout;
wire [4:0] g, p, carry;
/// Logic for Carry Signals
// Fill carry[1], carry[2],carry[3] and
sum[0] . DON’T FILL carry[4]
assign carry[0] = g[0] | cin & p[0];
assign carry[1] = g[1]
| g[0] & p[1] | //FILL HERE
cin & p[0] & p[1];
assign carry[2] = g[2]
| g[1] & p[2] | //FILL HERE
g[0] & p[1] & p[2] |
cin & p[0] & p[1]
& p[2];
assign carry[3] = g[3]
| g[2] &p[3] |
//FILL HERE
g[1] &p[2] & p[3] |
g[0] & p[1] & p[2] &p[3] |
cin & p[0]
& p[1] & p[2] & p[3];
assign carry[4] = DON’T
Have to FILL carry[4]
g[4] | g[3] & p[4] |
g[2] & p[3]
& p[4] |
g[1] & p[2] & p[3] & p[4] |
g[0] & p[1] & p[2] &p[3] &
p[4] |
cin
& p[0] & p[1] & p[2] & p[3] & p[4];
assign sum[0]
= p[0]
^ cin; //FILL
HERE
assign sum[1] = p[1] ^ carry[0];
assign sum[2] = p[2] ^ carry[1];
assign sum[3] = p[3] ^ carry[2];
assign sum[4] = p[4] ^ carry[3];
assign cout = carry[4];
//#####################
cla_slice_part s0(g[0],p[0],a[0],b[0]);
cla_slice_part s1(g[1],p[1],a[1],b[1]);
cla_slice_part s2(g[2],p[2],a[2],b[2]);
cla_slice_part s3(g[3],p[3],a[3],b[3]);
cla_slice_part s4(g[4],p[4],a[4],b[4]);
endmodule
Problem 4: Convert the following numbers(10pts,5mins):
Hint (7/8) = 0.875
a) Decimal 11 to 8-bit Binary:
//00001011
b) Decimal -11 to 8-bit Binary:
// 11110101
c) Decimal 11.875 to Binary (as many bits as needed):
//1011.111
d) Decimal -11.875 to IEEE 754 Single
Precision (Show in hexadecimal):
//c13e
Problem
5:
What will be the synthesizer output for
module something?(10pts, 6Mins)
(Draw simple one just
what we did at the class)
module something(x,y,a,b,c);
input a;
input [7:0] b,c;
output [8:0] x,y;
wire [7:0] b, c;
reg [8:0]x, y;
always @( a or b or c ) begin
if( a ) begin
x = b + c;
y = b - c;
end else begin
x = b - c;
end
end
endmodule
//Hw5…Solution..
Problem 6: Name the
four basic steps of synthesis(4pts. 2Mins)
(1)
Synthesize to RTL (Inference)
(2) Technology Mapping
(3) Optimization
(4) Place and Route
Problem7:Convert following pseudo instructions to real
instructions.
(8pts 3Mins).
la
$t0,0x12345678; (2pts)
//lui $t0,0x1234
ori
$t0,$t0,ox5678
move $t0,$t1;(1pts)
// addu $t0,$0,$t1
nop; (1pts)
//sll $0,$0,0
abs $t1,$t0;(3pts)
//take absolute value of $t0 and put it into $t1.
//hint..bgez $reg,
target.
//4instructions .more will
be OK, too.
addu $t1,$0,$t0
bgez $t0 TARGET
nop
sub $t1,$0,$t0
TARGET:
mul $2, $3, $4 (1pts)
mult $3, $4
mflo $2
Problem 8: True(right ) or False(wrong) (12pts,2Mins).
T F
8-1) addi $t0,0x1234,$t0 F : addi $t0,$t0,0x1234
8-2) subi $t0,$t1,0x1234 F :subi is not a
real instruction (HW)
8-3) jr
$0x123456 F: jr reg..not address
8-4) jal
2500 T : jal address is OK. But since SPIM
complains
about this , also accept F
8-5) j
0x123456789 F: j Max. 26 bits address
(0x123456789 is 33bits).
8-6)
9 decimal digits are enough to
represent the significant field floating
point IEEE754 single precision .
(Hint :
opposite way to HW)
T .: Mantissa field is only (23+1)
24 bits long. So 9 decimal digits is enough.
Problem 9: What is the MIPS assembly code for the following
C code?
(15pits
10Mins)
//c..
# Reg Usage: j, $8;
sum, $9;
for(j = 0, j
< 4;++j){
sum = sum +
j;
}
//sol
.data
newline: .asciiz
"\n"
.text
.globl __start # Must be global
__start:
add $9,$0,$0 # sum = 0; #don't need for the
solution.
##########solution
add $8,$0,$0
addi $10,$0,4 #test j == 4
j TEST
nop
LOOP:
#BODY
add $9,$9,$8 # sum = sum +j
#Increment
addi $8,$8,1 #++j
#Test condition
TEST:
slt $11,$8,$10 #j <4
bne $11,$0,LOOP
nop
#############
move $a0,$9
addi $v0,$0,1 # print $a0
syscall
Problem 10: Fill the
Blank.(4pts. 1mins)
MIPS coding format:
OPCODE field is ( 6 ) bits long.
Each Reg. field is ( 5 ) bits long.
Immediate field is (16 ) bits long.
Jump instruction.
JALR rs $31
<- PC +( 8 )…//return address will be saved at $31.
.// the return
address will be PC +….
Bonus (2pts).
Write
down the time you spent for each problems on the very first page or next to
each problems.