0% found this document useful (0 votes)
115 views

Assignment 3: 1. Given The MIPS Assembly Code

The document contains two assembly code samples and instructions to compile and explain them. Sample 1 adds and subtracts values stored in registers and stores the result in memory. Sample 2 loads values into registers, performs arithmetic operations, and conditionally branches based on register values. Students are asked to compile both samples into machine code, explain their meanings, and implement a processor datapath and testbench to execute the instructions.

Uploaded by

Phan Tan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
115 views

Assignment 3: 1. Given The MIPS Assembly Code

The document contains two assembly code samples and instructions to compile and explain them. Sample 1 adds and subtracts values stored in registers and stores the result in memory. Sample 2 loads values into registers, performs arithmetic operations, and conditionally branches based on register values. Students are asked to compile both samples into machine code, explain their meanings, and implement a processor datapath and testbench to execute the instructions.

Uploaded by

Phan Tan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 12

Assignment 3

1. Given the MIPS Assembly code :


Assume the code start from address PC=0x00000000, one instruction is store in
one memory location.
Assembly Code sample 1:
Instruction Meaning

addi $s0, $zero, 33 load immediate value 33 to register $s0


addi $s1, $zero, 66 load immediate value 66 to register $s1
add $s2, $s0, $s1 $s2 = $s0 + $s1
sub $s3, $s1, $s0 $s3 = $s1 – $s0
sw $s3, 10($s2) Memory[$s2+10] = $s3
lw $s1, 10($s2) $s1 = Memory[$s2+10]

Assembly Code sample 2:

Instruction Meaning
addi $s2, $zero, 55 load immediate value 55 to register $S2
addi $s3, $zero, 22 load immediate value 22 to register $S3
addi $s5, $zero, 33 load immediate value 55 to register $S3
add $s4,$s2,$s3 $s4 = $s2 + $s3
sub $s1,$s2,$s3 $s1 = $s2 – $s3
sw $s1,100($s2) Memory[$s2+100] = $s1
lw $s1,100($s2) $s1 = Memory[$s2+100]
bne $s1,$s5,End Next instr. is at End if $s4 !=$s5
addi $s6, $zero, 10 load immediate value 10 to register $s6
beq $s4,$s5, End Next instr. is at End if $s4 = $s5
addi $s6, $zero, 20 load immediate value 20 to register $s6
End: j End jump Here

a) Compile the Assembly Assembly Code sample 1 into machine code (decimal
code and binary code)
b) Explain briefly the meaning of Assembly Code sample 1
c) Compile the Assembly Assembly Code sample 2 into machine code (decimal
code and binary code)
d) Explain briefly the meaning of Assembly Code sample 2
Solve:

a)

addi $s0,$zero,33
Machine code:
Op Rs Rt Address
Decimal 8 0 16 33
Binary 001000 00000 10000 0000 0000 0010 0001
=> 0x20100021

addi $s1, $zero, 66


Machine code:
Op Rs Rt Address
Decimal 8 0 17 66
Binary 001000 00000 10001 0000 0000 0100 0010
=> 0x20110082

add $s2, $s0, $s1


Machine code:
Op Rs Rt Rd Shamt Funct
Decimal 0 16 17 18 0 32
Binary 00000 10000 10001 10010 00000 100000
=> 0x02119020
sub $s3, $s1, $s0
Machine code:
Op Rs Rt Rd Shamt Funct
Decimal 0 17 16 19 0 34
Binary 00000 10001 10000 10011 00000 100010
=> 0x02309822

sw $s3, 10($s2)
Machine code:
Op Rs Rt Address
Decimal 43 18 19 10
Binary 101011 10010 10011 0000 0000 0000 1010
=> 0xAE53000A

lw $s1, 10($s2)
Machine code:
Op Rs Rt Address
Decimal 35 18 17 10
Binary 100011 10010 10001 0000 0000 0000 1010
=> 0x8E51000A

b) I think the meaning of the code is explained already.

c)

addi $s2, $zero, 55


Machine code:
Op Rs Rt Address
Decimal 8 0 18 55
Binary 001000 00000 10010 0000 0000 0011 0111
=> 0x20120037
addi $s3, $zero, 22
Machine code:
Op Rs Rt Address
Decimal 8 0 19 22
Binary 001000 00000 10011 0000 0000 0001 0110
=> 0x20130016
addi $s5, $zero, 33
Machine code:
Op Rs Rt Address
Decimal 8 0 21 33
Binary 001000 00000 10101 0000 0000 0010 0001
=> 0x20150021

add $s4,$s2,$s3
Machine code:
Op Rs Rt Rd Shamt Funct
Decimal 0 18 19 20 0 32
Binary 000000 10010 10011 10100 00000 100000
=> 0x0253A020

sub $s1,$s2,$s3
Machine code:
Op Rs Rt Rd Shamt Funct
Decimal 0 18 19 17 0 34
Binary 000000 10010 10011 10001 00000 100010
=> 0x02538822

sw $s1,100($s2)
Machine code:
Op Rs Rt Address
Decimal 43 18 17 100
Binary 101011 10010 10001 0000 0000 0110 0100
=> 0xAE510064

lw $s1,100($s2)
Machine code:
Op Rs Rt Address
Decimal 35 18 17 100
Binary 100011 10010 10001 0000 0000 0110 0100
=> 0x8E510064
bne $s1,$s5,End
Machine code:
Op Rs Rt Address
Decimal 5 21 17 3
Binary 000101 10101 10001 0000 0000 0000 0011
=> 0x16B10003

addi $s6, $zero, 10


Machine code:
Op Rs Rt Address
Decimal 8 0 22 10
Binary 001000 00000 10110 0000 0000 0000 1010
=> 0x2016000A

beq $s4,$s5, End


Machine code:
Op Rs Rt Address
Decimal 4 21 20 1
Binary 000100 10101 10100 0000 0000 0000 0001
=> 0x12B40001

addi $s6, $zero, 20


Machine code:
Op Rs Rt Address
Decimal 8 0 22 20
Binary 001000 00000 10110 0000 0000 0001 0100
=> 0x20160014
End: j End
Machine code:
Op Address
Decimal 2 11
Binary 000010 00 0000 0000 0000 0000 0000 1011
=> 0x0800000B
2. The following assembly code is developed to calculate the Equation using
only R-type Instructions:
A = B + C + D – E;
With B = $s0 = 6
C = $s1 = 7
D = $s2 = 8
E = $s3 = 9
A = $s4 = ??

addi $s0, $zero, 6 load immediate value 6 to register $s0


addi $s1, $zero, 7 load immediate value 7 to register $s1
addi $s2, $zero, 8 load immediate value 8 to register $s2
addi $s3, $zero, 9 load immediate value 9 to register $s3
add $s4, $s0, $s1 $s4 = $s0 + $s1
add $s4, $s4, $s2 $s4 = $s4 – $s2
sub $s4, $s4, $s3 $s4 = $s4 – $s3

a) Compile this Code into Machine Binary code and store in the Instruction of
instruction memory of the Single Microprocessor.
b) Implement the Verilog Simple Single Microprocessor Code for R-Type
Instruction Datapath given in the figure 2.1
c) Develop testbench to verify the system.
Figure 2.1 R-type Processor Datapath

Verilog code:
// PC
module Program_Counter (reset, PC_in, PC_out);
input clk, reset;
input [31:0] PC_in;
output [31:0] PC_out;
reg [31:0] PC_out;
always @ (posedge clk or posedge reset)
begin
if(reset==1'b1)
PC_out<=0;
else
PC_out<=PC_in;
end
endmodule
// Add32
module Adder32Bit(input1, input2, out);
input [31:0] input1, input2;
output [31:0] out;
reg [31:0]out;
always@( input1 or input2)
begin
out <= input1 + input2;
end
endmodule
// In_memory
module Instruction_Memory (read_address, instruction, reset);
input reset;
input [31:0] read_address;
output [31:0] instruction;
reg [31:0] Imemory [63:0];
integer k;
// I-MEM in this case is addressed by word, not by byte
assign instruction = Imemory[read_address];
always @(posedge reset)
begin
for (k=16; k<64; k=k+1)
begin
// here Out changes k=0 to k=16
Imemory[k] = 32'b0;
end
Imemory[0] = 32'b00100000000010000000000000100000;
//addi $t0, $zero, 32
Imemory[1] = 32'b00100000000010010000000000110111;
//addi $t1, $zero, 55
Imemory[2] = 32'b00000001000010011000000000100100;
//and $s0, $t0, $t1
Imemory[3] = 32'b00000001000010011000000000100101;
//or $s0, $t0, $t1
Imemory[4] = 32'b10101100000100000000000000000100;
//sw $s0, 4($zero)
Imemory[5] = 32'b10101100000010000000000000001000;
//sw $t0, 8($zero)
Imemory[6] = 32'b00000001000010011000100000100000;
//add $s1, $t0, $t1
Imemory[7] = 32'b00000001000010011001000000100010;
//sub $s2, $t0, $t1
Imemory[8] = 32'b00010010001100100000000000001001;
//beq $s1, $s2, error0
Imemory[9] = 32'b10001100000100010000000000000100;
//lw $s1, 4($zero)
Imemory[10]= 32'b00110010001100100000000001001000;
//andi $s2, $s1, 48
Imemory[11] =32'b00010010001100100000000000001001;
//beq $s1, $s2, error1
Imemory[12] =32'b10001100000100110000000000001000;
//lw $s3, 8($zero)
Imemory[13] =32'b00010010000100110000000000001010;
//beq $s0, $s3, error2
Imemory[14] =32'b00000010010100011010000000101010;
//slt $s4, $s2, $s1 (Last)
Imemory[15] =32'b00010010100000000000000000001111;
//beq $s4, $0, EXIT
Imemory[16] =32'b00000010001000001001000000100000;
//add $s2, $s1, $0
Imemory[17] =32'b00001000000000000000000000001110;
//j Last
Imemory[18] =32'b00100000000010000000000000000000;
//addi $t0, $0, 0(error0)
Imemory[19] =32'b00100000000010010000000000000000;
//addi $t1, $0, 0
Imemory[20] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[21] =32'b00100000000010000000000000000001;
//addi $t0, $0, 1(error1)
Imemory[22] =32'b00100000000010010000000000000001;
//addi $t1, $0, 1
Imemory[23] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[24] =32'b00100000000010000000000000000010;
//addi $t0, $0, 2(error2)
Imemory[25] =32'b00100000000010010000000000000010;
//addi $t1, $0, 2
Imemory[26] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[27] =32'b00100000000010000000000000000011;
//addi $t0, $0, 3(error3)
Imemory[28] =32'b00100000000010010000000000000011;
//addi $t1, $0, 3
Imemory[29] =32'b00001000000000000000000000011111;
//j EXIT
end
endmodule
// Register file
module Register_File (read_addr_1, read_addr_2, write_addr, read_data_1,
read_data_2, write_data, RegWrite, reset);
input [4:0] read_addr_1, read_addr_2, write_addr;
input [31:0] write_data;
input clk, reset, RegWrite;
output reg [31:0] read_data_1, read_data_2;

reg [31:0] Regfile [31:0];


integer k;

//assign read_data_1 = Regfile[read_addr_1];


always @(read_data_1 or Regfile[read_addr_1])
begin
if (read_data_1 == 0) read_data_1 = 0;
else read_data_1 = Regfile[read_addr_1];
end

//assign read_data_2 = Regfile[read_addr_2];


always @(read_data_2 or Regfile[read_addr_2])
begin
if (read_data_2 == 0) read_data_2 = 0;
else read_data_2 = Regfile[read_addr_2];
end

always @(posedge clk or posedge reset) // Ou combines the block of reset into
the block of posedge clk
begin
if (reset==1'b1)
begin
for (k=0; k<32; k=k+1)
begin
Regfile[k] = 32'b0;
end
end
else if (RegWrite == 1'b1) Regfile[write_addr] = write_data;
end
endmodule
// ALU
module alu(
input [2:0] alufn,
input [31:0] ra,
input [31:0] rb_or_imm,
output reg [31:0] aluout,
output reg zero);
parameter ALU_OP_ADD = 3'b000,
ALU_OP_SUB = 3'b001,
ALU_OP_AND = 3'b010,
ALU_OP_OR = 3'b011,
ALU_OP_NOT_A = 3'b100,
ALU_OP_LW = 3'b101,
ALU_OP_SW = 3'b110,
ALU_OP_BEQ = 3'b111;
always @(*)
begin
case(alufn)
ALU_OP_ADD : aluout = ra + rb_or_imm;
ALU_OP_SUB : aluout = ra - rb_or_imm;
ALU_OP_AND : aluout = ra & rb_or_imm;
ALU_OP_OR : aluout = ra | rb_or_imm;
ALU_OP_NOT_A: aluout = ~ra;
ALU_OP_LW : aluout = ra + rb_or_imm;
ALU_OP_SW : aluout = ra + rb_or_imm;
ALU_OP_BEQ : begin
zero = (ra==rb_or_imm)? 1'b1 : 1'b0;
aluout = ra - rb_or_imm;
end
endcase
end
endmodule
// Tong hop
module R_Type(reset,RegWrite,Zero,ALU_out);
input reset;
input RegWrite;
output [31:0] ALU_out;
output Zero;
wire [31:0] w1, w2, w3, w4, w5, w6, w7;
reg [4:0] w_rs,w_rt,w_rd;
reg [2:0] w_code;
assign ALU_out = w7;
assign w1 = 32'b00100000000010000000000000100000;
always @(*)
begin
w_rs[4:0] <= w3[25:21];
w_rt[4:0] <= w3[20:16];
w_rd[4:0] <= w3[15:11];
w_code[2:0] <= w3[2:0];
end
Program_Counter c1(reset, w1, w2);
Adder32Bit c2(w2,32'd4, w1);
Instruction_Memory c3(w2, w3, reset);
Register_File c4( w_rs, w_rt, w_rd, w5, w6, w7, RegWrite, reset);
alu c5(w_code,w5,w6,ALU_out,Zero);
endmodule
// TEST BENCH
module TBench;
reg reset;
reg RegWrite;
wire [31:0] ALU_out;
wire Zero;
R_Type dut(reset,RegWrite,Zero,ALU_out);
initial begin
$monitor($time," reset=%b RegWrite=%d Zero=%b | ALU_out=%b
",reset, RegWrite,Zero,ALU_out);
reset=0; RegWrite=1;
#5 reset=1; RegWrite=1;
#5 reset=1; RegWrite=0;
#5 $finish;
end
endmodule

You might also like