Abstrak—Dari praktikum modul 5, mahasiswa dalam kode VHDL untuk membuat top level design dari
diharapkan akan mempraktikkan beberapa percobaan mikroprosesor Single-Cycle MIPS32® yang
mengenai Synthesizable MIPS32® Microprosesor tentang synthesizable dan dapat disimulasikan dengan Altera®
top level design and testbench. Pada modul ini mahasiswa Quartus® II v9.1sp2.
akan melakukan dua percobaan dengan menggunakan 5. Praktikan dapat membuat testbench untuk menguji
Quartus sebagai software pembantu, PCSpim sebagai desain mikroprosesor Single-Cycle MIPS32® dalam
simulatornya dan Notepad++ sebagai text editornya. kode VHDL dan dapat disimulasikan dengan Altera®
Adapun percobaan yang akan dilakukan yaitu Quartus® II v9.1sp2.
mengimplementasikan top-level design dari MIPS32® dan
pengujian menggunakan testbench. Praktikan juga II. LANDASAN TEORETIS
diharapkan secara mandiri untuk membuat testbench dan 1. Datapath dan Control
dapat menggabungkan komponen-komponen yang telah Dalam desain mikroprosesor Single-Cycle MIPS32®,
dibuat pada praktikum sebelumnya dalam kode VHDL rangkaian digital dapat dikelompokkan menjadi dua macam,
untuk membuat top-level design dari mikroprosesor single yaitu datapath (jalur data) dan control (kontrol). Datapath
cycle MIPS32 yang synthesizable dan dapat disimulasikan merupakan komponen dari mikroprosesor yang melakukan
secara fungsional dan timing dengan software Quartus operasi aritmetik serta melakukan penyimpanan data. Dalam
datapath pula kelima tahap pemrosesan instruksi meliputi
Kata Kunci—synthesizable, MIPS32®, VHDL, top-level design
instruction fetch, instruction decode, execute, memory access,
dan write back dilaksanakan. Sedangkan control merupakan
I. PENDAHULUAN komponen dari mikroprosesor yang mengatur datapath
berdasarkan instruksi yang sedang dieksekusi.
Pada praktikum modul kelima ini, praktikan akan melakukan Bagian kontrol telah direpresentasikan oleh control unit yang
percobaan perancangan pada mikroprosesor MIPS32®. telah kita desain pada praktikum sebelumnya. Untuk bagian
Kemudian praktikum ini merupakan lanjutan dari praktikum
datapath, kita perlu menggabungkan komponen-komponen
sebelumnya. Dalam praktikum ini akan melakukan 2 percobaan
yang telah kita buat meliputi multiplexer, ALU, register, data
yaitu mengimplementasikan top-level design MIPS32® dan
memory, instruction memory, dan sebagainya untuk
pengujian menggunakan testbench. Hal yang penting dalam
praktikum ini adalah penguasaan terhadap Bahasa VHDL baik membentuk sebuah jalur yang dapat dilewati oleh data. Dengan
secara behavioral maupun structural. demikian, control dan datapath tidak dapat dipisahkan dalam
Adapun tujuan dari praktikum ini yaitu desain sebuah mikroprosesor. Datapath dan control akan
1. Praktikan memahami arsitektur mikroprosesor membentuk sebuah desain mikroprosesor Single-Cycle
MIPS32® beserta datapath eksekusinya. MIPS32® yang disebut sebuah top-level design (desain paling
2. Praktikan memahami instruction set dari MIPS32® dan atas). Top-level design pada umumnya hanya berisi port
dapat membuat program sederhana dalam bahasa mapping dari satu komponen ke komponen lain.
assembly yang dapat dieksekusi pada MIPS32®.
3. Praktikan dapat melakukan simulasi eksekusi program
MIPS32® pada program simulasi SPIM dan memahami
cara setiap instruksi dieksekusi.
4. Praktikan dapat menggabungkan komponen-komponen
desain yang telah dibuat dari praktikum sebelumnya
didefinisikan dalam std_logic. Untuk menggunakan nilai sinyal
standar std_logic, kita dapat menggunakan library yang telah
tersedia yaitu ieee.std_logic_1164.all.
4. Altera® Quartus® II
Versi Altera® Quartus® II yang disarankan untuk digunakan
dalam praktikum ini adalah Altera® Quartus® II v9.1sp2
karena pada versi ini terdapat simulator fungsional dan timing
yang telah terintegrasi. Versi Altera® Quartus® II yang lebih
baru tidak terdapat simulator fungsional dan timing sehingga
praktikan harus menggunakan Mentor Graphics® ModelSim®
untuk melakukan simulasi.
Langkah pertama untuk menggunakan Altera® Quartus® II
adalah membuat project terlebih dahulu. Untuk membuat
project, gunakan new project wizard kemudian ikuti petunjuk-
petunjuk yang ada. Beri lokasi dan nama project yang
diinginkan. Pilih dokumen-dokumen yang akan dimasukkan ke
dalam project (kita dapat melewati langkah ini terlebih dahulu).
Kemudian pilih device yang akan digunakan. Untuk praktikum
ini, kita tidak akan melakukan implementasi pada FPGA karena
praktikum ini hanya berupa simulasi saja. Oleh karena itu, kita
dapat memilih FPGA dengan spesifikasi tertinggi baik untuk
Altera® Cyclone™ maupun Altera® Stratix™. Setelah project
Penggunaan Latch dalam implementasi rangkaian
dibuat, kita dapat mulai bekerja di dalamnya.
menggunakan bahasa VHDL sebaiknya dihindari kecuali kita
Untuk melakukan simulasi, kita harus melakukan kompilasi
mengetahui apa yang kita lakukan. Dalam proses sintesis,
terhadap project yang kita buat. Kompilasi yang dilakukan bisa
implementasi Latch ini akan memberikan kita warning.
kompilasi penuh maupun hanya Analysis & Synthesis saja.
Sebagian besar perangkat FPGA milik Altera tidak memiliki
Kompilasi penuh akan memakan waktu yang lebih lama karena
elemen dasar berupa Latch. Dengan demikian sebuah Latch
semua proses meliputi Analysis & Synthesis, Fitter, dan
harus dibuat menggunakan Logic Cell. Sayangnya, hal ini
Assembler akan dilakukan. Kompilasi penuh ini akan memberi
membutuhkan sebuah feedback pada Logic Cell untuk
kita gambaran terutama dari sisi timing analysis. Sedangkan
mengimplementasikan fungsi memory. Hal ini akan
dengan Analysis & Synthesis, kita telah mendapat rangkaian
menyebabkan analisis timing statis tidak dapat dilakukan.
yang kita buat dan dapat dilakukan simulasi fungsional.
5. Mikroprosessor MIPS32® operasi baca dan/atau tulis pada data memory dapat
MIPS32® (Microprocessor without Interlocked Pipeline dilakukan
Stages) merupakan sebuah mikroprosesor 32-bit yang • Write Back (WB) Tahap terakhir ini digunakan untuk
dikembangkan oleh MIPS Technologies. Mikroprosesor ini mengalirkan data dari data memory atau hasil
merupakan reduced instruction set computer (RISC). perhitungan arithmetic and logical unit (ALU) ke
Mikroprosesor ini sering digunakan sebagai bahan register untuk dapat menjalankan instruksi
pembelajaran mata kuliah Arsitektur Sistem Komputer selanjutnya.
diberbagai universitas dan sekolah teknik. Dalam kehidupan Dalam praktikum ini, kita akan melakukan implementasi
nyata, arsitektur mikroprosesor MIPS® sering digunakan mikroprosesor MIPS32® yang sederhana. Mikroprosesor
dalam sistem embedded seperti perangkat Windows™ CE, MIPS32® yang akan diimplementasikan tidak memiliki
router, residential gateway, dan konsol video game seperti pipeline dan semua instruksi selesai dieksekusi dalam satu
Sony® PlayStation®, Sony® PlayStation® 2 (PS2™), dan siklus clock. Dengan demikian, kita akan membuat
Sony® PlayStation® Portable (PSP®). mikroprosesor Single-Cycle MIPS32® menggunakan bahasa
VHDL yang synthesizable. Diagram arsitektur mikroprosesor
Single-Cycle MIPS32® yang akan kita buat diberikan sebagai
berikut.
Adapun code untuk membetuk susunan komponen diatas adalah sebagai berikut :
• InstructMem
-- Praktikum 14S3102 Arsitektur Sistem Komputer
-- Modul : 3
-- Percobaan : 1
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : instrucMEM.vhd
-- Deskripsi : Implementasi instruction memory
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE
IEEE.STD_LOGIC_ARITH.ALL; USE
IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.ALL;
• Instruction memory
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 3
-- Percobaan : 2
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : instruction_memory.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY instruction_memory IS
PORT (
ADDR : IN STD_LOGIC_VECTOR (15 DOWNTO 0); -- alamat
clock : IN STD_LOGIC := '1'; -- clock
INSTR : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- output
);
END ENTITY;
• Data_memory
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY data_memory IS
PORT (
ADDR : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
WR_EN : IN STD_LOGIC;
RD_EN : IN STD_LOGIC;
clock : IN STD_LOGIC := '1';
RD_Data : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
WR_Data : IN STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END ENTITY;
COMPONENT altsyncram
GENERIC (
init_file : STRING;
operation_mode : STRING;
widthad_a : NATURAL;
width_a : NATURAL
);
PORT (
wren_a : IN STD_LOGIC;
clock0 : IN STD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END COMPONENT;
BEGIN
altsyncram_component : altsyncram
GENERIC MAP (
init_file => "dmemory.mif", operation_mode
=> "SINGLE_PORT",
widthad_a => 8,
width_a => 8
)
PORT MAP (
wren_a => WR_EN and not RD_EN,
clock0 => clock,
address_a => ADDR,
q_a => RD_Data,
data_a => WR_Data
);
END STRUCTURAL;
• Reg_file
ENTITY reg_file IS
PORT (
clock : IN STD_LOGIC; -- clock
WR_EN : IN STD_LOGIC; -- write enable
ADDR_1 : IN STD_LOGIC_VECTOR (4 DOWNTO 0); -- Input 1
ADDR_2 : IN STD_LOGIC_VECTOR (4 DOWNTO 0); -- Input 2
ADDR_3 : IN STD_LOGIC_VECTOR (4 DOWNTO 0); -- Input 3
WR_Data_3 : IN STD_LOGIC_VECTOR (31 DOWNTO 0);-- write data
RD_Data_1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);-- read data 1
RD_Data_2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- read data 2
);
END ENTITY;
• Program_counter
-- Praktikum Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 1
-- Tanggal : 18 November 2021
-- Nama (NIM) : Frans Wesly Sagala (14S19018)
-- Nama File : program_counter.vhd
-- Deskripsi : Program counter yang berupa satu buah register dengan lebar 32
bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY program_counter IS
PORT (
clk : IN std_logic; PC_in: IN std_logic_vector (31 DOWNTO 0);
PC_out : OUT std_logic_vector (31 DOWNTO 0)
);
END program_counter;
ENTITY lshifter_32_32 IS
PORT (
D_IN : IN std_logic_vector (31 DOWNTO 0);
D_OUT: OUT std_logic_vector (31 DOWNTO 0)
);
END lshifter_32_32;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cla_32 IS
PORT (
OPRND_1 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 1
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 2
C_IN : IN STD_LOGIC; -- Carry in
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); -- RESULT
C_OUT : OUT STD_LOGIC -- Overflow
);
END cla_32;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ALU IS
PORT (
OPERAND_1 : IN std_logic_vector (31 DOWNTO 0); --Data Input 1
OPERAND_2 : IN std_logic_vector (31 DOWNTO 0); --Data Input 1
OP_SEL : IN std_logic_vector (1 DOWNTO 0); --Operation Selector
OUTPUT : OUT std_logic_vector (31 DOWNTO 0) --Data Output
);
END ALU;
ARCHITECTURE behavior OF ALU IS
signal op_a : std_logic_vector (31 DOWNTO 0);
signal op_b : std_logic_vector (31 DOWNTO 0);
signal c_in : std_logic;
signal c_out : std_logic;
signal hasil : std_logic_vector (31 DOWNTO 0);
COMPONENT
PORT ( cla_32
OPRND_1 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 1
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 2
C_IN : IN STD_LOGIC; -- Carry in
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); -- RESULT
C_OUT : OUT STD_LOGIC -- Overflow
);
END COMPONENT;
BEGIN
componentcarry: cla_32
PORT MAP(
OPRND_1 => op_a,
OPRND_2 => op_b,
C_IN => c_in,
C_OUT => c_out,
RESULT => hasil
);
PROCESS (OP_SEL)
BEGIN
if OP_SEL = "00" then
op_a <= OPERAND_1;
op_b <= OPERAND_2;
c_in <= OP_SEL(0);
OUTPUT <= hasil;
elsif OP_SEL = "01" THEN
op_a <= OPERAND_1;
op_b <= (not OPERAND_2);
c_in <= OP_SEL(0);
OUTPUT <= hasil;
END IF;
END PROCESS;
END behavior;
• CU
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 6
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : cu.vhd
-- Deskripsi : Suato Control Unit yang melalakukan assignment sinyal kontrol
terhadap opcode dan func.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cu IS
PORT (
OP_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
FUNCT_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
Sig_Jmp : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_Bne : OUT STD_LOGIC;
Sig_Branch : OUT STD_LOGIC;
Sig_MemtoReg : OUT STD_LOGIC;
Sig_MemRead : OUT STD_LOGIC;
Sig_MemWrite : OUT STD_LOGIC;
Sig_RegDest : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_RegWrite : OUT STD_LOGIC;
Sig_ALUSrc : OUT STD_LOGIC;
Sig_ALUCtrl : OUT STD_LOGIC_VECTOR (1 DOWNTO 0)
);
END cu;
ARCHITECTURE behavior OF cu IS
BEGIN
PROCESS (OP_In,FUNCT_In)
BEGIN
--Sig_Jmp
IF OP_In = "000010" THEN
Sig_Jmp <= "01";
ELSE
Sig_Jmp <= "00";
END IF;
--Sig_Bne
IF OP_In = "000101" THEN
Sig_Bne <= '1';
ELSE
Sig_Bne <= '0';
END IF;
--Sig_Branch
IF OP_In = "000100" THEN
Sig_Branch <= '1';
ELSE
Sig_Branch <= '0';
END IF;
--Sig_MemWrite
IF OP_In = "101011" THEN
Sig_MemWrite <= '1';
ELSE
Sig_MemWrite <= '0';
END IF;
--Sig_RegDest
IF (OP_In = "000000" AND (FUNCT_In = "100000" OR FUNCT_In = "100010")) THEN
Sig_RegDest <= "01";
ELSE
Sig_RegDest <= "00";
END IF;
--Sig_RegWrite
IF (OP_In = "000000" AND (FUNCT_In = "100000" OR FUNCT_In = "100010")) OR
OP_In =
"001000" OR OP_In = "100011" THEN
Sig_RegWrite <= '1';
ELSE
Sig_RegWrite <= '0';
END IF;
--Sig_ALUSrc
IF OP_In = "001000" OR OP_In = "100011" OR OP_In = "101011" THEN
Sig_ALUSrc <= '1';
ELSE
Sig_ALUSrc <= '0';
END IF;
--Sig_ALUCtrl
IF (OP_In = "000000" AND FUNCT_In = "100010") THEN
Sig_ALUCtrl <= "01";
ELSE
Sig_ALUCtrl <= "00";
END IF;
END PROCESS;
END behavior;
Dan berikut adalah hasil simulasi functional dan timing dari masing-masing program VHDL diatas :
Dan berukut adalah code bahasa C SUM (penjumlahan)
int sum = 0; //addi $t0, $0, 0
int i =0; //addi $t1, $0, 0
Pada gambar diatas praktikan telah melakukan praktikum dan dapat dilihat bahwa nilai instruksinya masing-masing
diupdate saat rising clock pada clock cycle yang bersesuaian dengan instruction memory yang telah dibuat. Sinyal akan
bernilai 0 pada instruksi pertama dikarenakan instruksi nop pertama yang tidak dilakukan. Nilai register dan memori tidak
akan mengalami perubahan pada instruksi nop. Pada mem(4) instruksi berubah menjadi 0x20080000. Pada instruksi ini,
nomor register destination adalah 8 dan nomor target dan source adalah 0. Sgnaddress_regout = 8, berarti register yang
dipilih sebagai register write back adalah register 8=$t0. Nilai rd1out dan rd2out =0 karena nilai $0 =0.
ALUresult=rd1out+rd2out=0. Mem(8)
Mem(12)
mem(12) <= X"212afff6"; -- addi $t2, $t1,
Mem(16)
Mem(28)
Mem(32)
Mem (36)
Mem(40)
• Percobaan 2 : Pengujian Menggunakan TestBench
Pada percobaan ini, kita akan membuat sebuah testbench yang digunakan untuk melakukan pengujian top-level design yang telah
kita buat. Lakukan simulasi fungsional dan timing terhadap testbench ini.
Berdasarkan TP No.2 didapatkan kode assembly sebagai berikut :
Instruksi Arti
addi $s0,$0, 19 $s0 <= 0+19
addi $s1,$0, 21 $s1 <= 0+21
bne $s2,$s3, 8 Fungsi if, apabila $s!2 = $3, maka instruksi akan berlanjut
kedua intruksi berikutnya
Nop Jeda satu siklus untuk instruksi branching
sub $s3,$s0, $s1 $s3 <= $s0 - $s1
addi $s3,$s3, 0 $s3 <= $s3 + 0
addi $s4,$s0, 4 $s4 <= $s0 + 4
sw $s1 ($s4) Menyimpan nilai pada register $s1 kedalam nilai alamat
register $s4
lw $s5 ($s4) Data pada memory $s4 diambill dan disimpan ke $s5
addi $s5, $s5, $s0 $s5 <= $s5 + $0
J 00000000 Jump ke address 0x00000000
Nop Jeda satu siklus untuk instruksi branching
Setelah dilakukan kompilasi, hasil simulasi fungsional diamati untuk menganalisis pengujian desain.Hasil simulasi
fungsional menunjukkan hasil yang sesuaidengan cara kerja mikroprosesor single-cycle MIPS32sehingga dapat
disimpulkan top-level desain telah diimplementasikan dengan benar. Hasil simulasi timing menunjukkan adanya
delay pada rangkaian logika
IV. KESIMPULAN
Dari praktikum yang dilakukan maka, didapat kesimpulan
berupa;
• Single-Cycle MIPS32 dapat dibuat dengan cara
menggabungkan komponen-komponen seperti
ALU, multiplexer, register file, instruction
memory, datamemory, dan komponen lainnya ke
dalam suatu top-level design. Deklarasi
komponen, definisi sinyal penghubungantar
komponen, serta port mapping yang sesuai
makaakan dapat menghasilkan suatu Single-
Cycle MIPS32yang utuh.
• Pengujian Single-Cycle MIPS32 dapat dilakukan
denganmemberikan instruksi-instruksi dalam
Bahasa MIPS yang dapat dieksekusi oleh
mikroprosesor. Instruksi-instruksi tersebut
diubah ke dalam format instruksi MIPS32
bit(opcode, func, rt, rs, rd) yang kemudian diubah
menjadi suatu bilangan hexadecimal 8 bit, yang
disimpan pada instruction memory sebelum
akhirnya dieksekusi.
REFERENSI