Anda di halaman 1dari 28

Percobaan V

Synthesizable MIPS32® Microprocessor


Bagian III: Top Level Design and
Testbench
FRANS WESLY SAGALA (14S19018)
Dosen: Indra Hartarto Tambunan, Ph.D. (0128048403)
Asisten : Basry Answar Sihotang S.T
Tanggal Percobaan : 18/11/2021
14S3102 - Praktikum Arsitektur Sistem Komputer
Laboratorium Dasar Teknik Elektro
Institut Teknologi Del

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.

VHDL merupakan bahasa yang case insensitive. Abstraksi


utama dalam bahasa VHDL disebut entitas desain (design
entity) yang terdiri atas input, output, dan fungsi yang
didefinisikan secara benar. Entitas desain dalam VHDL terdiri
2. Menggunakan Testbench untuk Simulasi atas dua bagian, yaitu :
Dalam melakukan simulasi sebuah rangkaian digital, • Deklarasi Entitas (entity declaration) yang
biasanya kita memberikan sinyal input secara manual melalui mendefinisikan antarmuka entitas tersebut terhadap
sebuah waveform editor. Cara ini boleh dibilang sederhana dunia luar (contohnya port input dan port output).
namun akan sangat tidak efektif apabila kita melakukan • Arsitektur Entitas (entity architecture) yang
simulasi secara berulang-ulang. Cara lain untuk melakukan mendefinisikan fungsi dari entitas (contohnya
simulasi suatu rangkaian digital tanpa memberikan input satu rangkaian logika di dalam entitas tersebut).
per satu menggunakan waveform editor adalah menggunakan Pendefinisian arsitektur dapat dilakukan secara
testbench. behavioral maupun secara structural.
Setiap entitas desain harus disimpan dalam file VHDL yang
terpisah dengan nama file sesuai dengan nama entitas yang
dideklarasikan(contohnya nama_entity.vhd ). Berikut ini
template deklarasi sebuah entitas dan arsitektur entitas tersebut
dalam bahasa VHDL.

Pada dasarnya, testbench terdiri atas kode VHDL atau


Verilog HDL, tergantung pada implementasi. Testbench sendiri
dapat berisi sebuah desain yang menyimpan nilai-nilai sinyal
input yang harus diberikan kepada desain yang sedang diuji
(design under test). Kemudian, testbench ini akan
mengeluarkan masingmasing input yang harus diberikan Setiap entitas desain dalam file VHDL yang berbeda dapat
kepada desain yang sedang diuji berdasarkan suatu trigger, dipanggil dan dirangkai menjadi rangkaian yang lebih besar.
misalnya clock. Hal ini sangat penting dilakukan dalam melakukan desain
hardware. Pertama, hardware yang akan didesain harus kita
3. Bahasa VHDL pecah-pecah menjadi komponen-komponen logika yang cukup
VHDL (Very High Speed Integrated Circuit Hardware) kecil, contohnya menjadi multiplexer, adder, flip-flop, dan
Description Language) atau VHSIC Hardware Description sebagainya. Kemudian, kita mendesain masing-masing
Language merupakan bahasa untuk mendeskripsikan perangkat komponen logika tersebut dan melakukan simulasi fungsional
keras yang digunakan dalam desain elektronik digital dan dan simulasi timing untuk setiap komponen untuk meyakinkan
mixed-signal, contohnya Field-Programmable Gate Array bahwa setiap komponen dapat berfungsi dengan baik. Setelah
(FPGA) atau Integrated Circuit (IC). Sistem digital sangat erat itu, kita menggabungkan masing-masing komponen untuk
kaitannya dengan sinyal. Sinyal dapat dianalogikan sebagai membentuk entitas desain yang lebih besar (top level entity).
wire dan dapat berubah ketika input berubah. Dalam VHDL, Langkah pertama dalam membentuk top level entity adalah
terdapat definisi sinyal bernama std_logic yang sesuai dengan dengan mendefinisikan top level entity tersebut seperti halnya
standar IEEE 1164. Terdapat sembilan jenis nilai sinyal yang
kita membuat entitas desain biasa. Kemudian, pada arsitektur (PROCESS) dapat dianalogikan sebagai bagian dari rangkaian
top level entity, kita memanggil desain entitas lain yang dapat aktif dan dapat nonaktif. Sebuah proses akan
menggunakan construct component. Construct component ini diaktifkan ketika sinyal-sinyal (SIGNAL) dalam daftar
memiliki isi yang sama persis dengan deklarasi entitas desain sensitivitas (sensitivity list) mengalami perubahan nilai. Ketika
yang akan dipanggil oleh top level entity. Kemudian, kita harus diaktifkan, semua ekspresi dan pernyataan (statement) akan
melakukan instansiasi masing-masing komponen dan dieksekusi secara sekuensial hingga akhir dari proses tersebut.
menghubungkan port input dan port output dari masing-masing
komponen dengan top level design atau dengan komponen lain.

Terdapat dua jenis construct yang digunakan dalam construct


PROCESS, yaitu construct IF-THEN-ELSE dan construct
CASE. Kedua jenis construct tersebut diberikan sebagai contoh
berikut ini.

Terdapat tiga jenis concurent signal assignment (CSA) dalam


bahasa VHDL, yaitu simple CSA, conditional CSA, dan
selected CSA. Ketiga jenis concurent signal assignment
tersebut dijelaskan menggunakan contoh sebagai berikut.
• Simple CSA. Assignment sinyal dilakukan dengan
ekspresi logika biasa. Hasil implementasi Simple CSA
akan berupa gerbang logika biasa

• Conditional CSA. Assignment sinyal dilakukan


dengan construct WHEN-ELSE. Hasil implementasi
Conditional CSA akan berupa kumpulan 2-to-1
multiplexer yang disusun secara bertahap dengan
boolean_expr sebagai selektor dan value_expr sebagai
nilai sinyal yang dapat dipilih.

• Selected CSA. Assignment sinyal dilakukan dengan


construct WITH-SELECT. Hasil implementasi
Selected CSA akan berupa satu buah n-to-1 Dalam bahasa VHDL, kita juga dapat mendefinisikan beberapa
multiplexer dengan select_expression sebagai selektor jenis elemen memory. Dua jenis elemen memory yang sering
dan value_expr_3 sebagai nilai sinyal yang dapat digunakan dalam bahasa VHDL adalah Gated D Latch dan D
dipilih. Flip-flop. Gated D Latch memiliki karakteristik yaitu output
akan berubah mengikuti input saat clock high (atau clock low,
tergantung implementasi). Sedangkan D Flip-flop memiliki
karakteristik yaitu output akan berubah mengikuti input saat
transisi clock dari low ke high (atau high ke low, tergantung
implementasi). Untuk elemen memory lain seperti Gated S-R
Selain concurent signal assignment, dalam bahasa VHDL Latch, T Flip-flop, dan JK Flip-flop juga dapat
juga dikenal dengan construct PROCESS yang berfungsi diimplementasikan pada bahasa VHDL namun mereka jarang
melakukan assignment sinyal secara se kuensial. Sebuah proses digunakan.
Salah satu komponen memory yang paling sering digunakan
adalah register. Register terdiri atas beberapa buah flip-flop
yang disusun sedemikian rupa sehingga membentuk elemen
penyimpanan. Register juga dipakai untuk
mengimplementasikan rangkaian sekuensial contohnya finite
state machine.

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.

Terdapat lima tahap yang dilakukan ketika mikroprosesor


MIPS32® melakukan eksekusi suatu instruksi. Kelima tahap
tersebut adalah sebagai berikut.
• Instruction Fetch (IF) Tahap instruction fetch
berfungsi mengatur aliran instruksi yang akan diolah
pada tahap berikutnya. Instruksi yang sedang
dijalankan merupakan instruksi yang berasal dan
disimpan dari memory. Pada arsitektur ini, memory
dipisahkan menjadi dua bagian yaitu instruction
memory yang berfungsi menyimpan instruksi-
instruksi yang akan dieksekusi dan data memory yang
berfungsi untuk menyimpan data untuk menghindari
structural hazard. Dengan demikian, arsitektur ini
menganut Harvard Architecture.
• Instruction Decode (ID) Tahap berikutnya, instruksi
yang telah diambil (fetched) dari instruction memory
berpindah ke tahap instruction decode. Pada tahap ini,
instruksi dengan lebar 32-bit akan dipecah sesuai
format instruksi yang digunakan. Penjelasan mengenai
decoding instruksi ini dapat dilihat pada bagian
selanjutnya.
• Execute / Address Calculation (EX) Tahap ini
merupakan tahap sebagian besar operasi aritmatika
dan logika pada arithmetic and logical unit (ALU)
dilakukan. Pada tahap ini juga terdapat tempat untuk
meneruskan alamat register kembali ke tahap
instruction decode sebagai deteksi hazard.
• Data Memory (MEM) Pada tahap ini, data disimpan
dan/atau diambil dari data memory. Data memory
hanya dapat disimpan atau dibaca jika ada sinyal
MemRead dan/atau MemWrite yang sesuai sehingga
III. HASIL DAN ANALISIS

• Percobaan 1 : Implementasi Top-Level Design MIPS32®


Pada tugas pertama ini, diminta untuk menggabungkan semua komponen yang telah dibuat pada percobaan sebelumnya (port
mapping). Data yang dimasukan berupa kode script komponen-komponen seperti instruction memory,data memory, register file,
ALU, sign extender, comparator,control unit, serta komponen kecil lain seperti multiplexer, program counter dan lain
sebagainya. Output yang dihasilkan pada tugas 1 ini yaitu sebuah top leveldesign MIPS 32 bit, dengan susunan komponen yang
telah diport 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;

ENTITY instrucMEM IS PORT (


ADDR : IN std_logic_vector (31 DOWNTO 0);
clock : IN std_logic;
reset : IN std_logic;
INSTR : OUT std_logic_vector (31 DOWNTO 0)
);
END ENTITY;

ARCHITECTURE behavior OF instrucMEM IS


TYPE ramtype IS ARRAY (31 DOWNTO 0) OF std_logic_vector (31 DOWNTO 0);
SIGNAL mem: ramtype;
BEGIN
PROCESS (reset,ADDR,mem)
BEGIN
IF (reset='1') THEN
INSTR <= (OTHERS => '0');
ELSE
INSTR <= mem(conv_integer (ADDR));
END IF; END
PROCESS;

-- Isi dalam instruction memory


mem(0) <= X"00000022";
mem(1) <= X"8c010000"; mem(2) <=
X"8c020004"; mem(3) <=
X"8c030008"; mem(4) <=
X"00842022"; mem(5) <=
X"00822020"; mem(6) <=
X"0043282a"; mem(7) <=
X"10a00002"; mem(8) <=
X"00411020";
mem(9) <= X"1000fffb";
mem(10) <= X"ac040000";
mem(11) <= X"1000ffff";
END behavior;

• 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;

ARCHITECTURE structural OF instruction_memory IS


SIGNAL sub_wire0 : STD_LOGIC_VECTOR (31 DOWNTO 0);
-- signal keluaran output
COMPONENT altsyncram
-- komponen memori
GENERIC
(
init_file : STRING; -- name of the .mif file
operation_mode : STRING; -- the operation mode
widthad_a : NATURAL; -- width of address_a[]
width_a : NATURAL; -- width of data_a[]
);
PORT
(
clock0 : IN STD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
END COMPONENT;
BEGIN
INSTR <= sub_wire0;
altsyncram_component : altsyncram
GENERIC MAP
(
init_file => "imemory.mif",
operation_mode => "ROM",
widthad_a => 16,
width_a => 32
)
PORT MAP
(
clock0 => clock,
address_a => ADDR,
q_a => sub_wire0
);
END structural;

• 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;

ARCHITECTURE structural OF data_memory IS

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;

ARCHITECTURE behavior OF instrucMEM IS


TYPE ramtype IS ARRAY (31 DOWNTO 0) OF STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL mem: ramtype;
BEGIN
PROCESS (reset,ADDR,mem)
BEGIN
IF (reset='1') THEN
INSTR <= (OTHERS => '0');
ELSE
INSTR <= mem(conv_integer (ADDR));
END IF; END
PROCESS;

-- Isi dalam instruction memory


mem(0) <= X"00000022";
mem(1) <= X"8c010000"; mem(2) <=
X"8c020004"; mem(3) <=
X"8c030008"; mem(4) <=
X"00842022"; mem(5) <=
X"00822020"; mem(6) <=
X"0043282a"; mem(7) <=
X"10a00002"; mem(8) <=
X"00411020";
mem(9) <= X"1000fffb";
mem(10) <= X"ac040000";
mem(11) <= X"1000ffff";
END behavior;

• 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;

ARCHITECTURE behavior OF program_counter IS


BEGIN
PROCESS (clk)
BEGIN
if clk' EVENT and clk='1' then
PC_out <= PC_in;
end if;
END PROCESS;
END behavior;
• Ishifter 32bit
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 2a
-- Tanggal : 18 Novewmber 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : lshifter_32_32.vhd
-- Deskripsi : Left shifter yang memiliki input data dengan lebar 32 bit dan
output data 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 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;

ARCHITECTURE behavior OF lshifter_32_32 IS


BEGIN
D_OUT (31 DOWNTO 2) <= D_IN (29 DOWNTO 0);
D_OUT (1 DOWNTO 0) <= (others => '0');
END behavior;
• Ishifter 26bit
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 2b
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : lshifter_26_28.vhd
-- Deskripsi : Left shifter yang memiliki input data dengan lebar 26 bit dan
output data dengan lebar 28 bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lshifter_26_28 IS
PORT (
D_IN : IN std_logic_vector (25 DOWNTO 0);
D_OUT: OUT std_logic_vector (27 DOWNTO 0)
);
END lshifter_26_28;

ARCHITECTURE behavior OF lshifter_26_28 IS


BEGIN
D_OUT (27 DOWNTO 2) <= D_IN (25 DOWNTO 0);
D_OUT (1 DOWNTO 0) <= (others => '0');
END behavior;
• Cla_32bit
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 3
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : cla_32.vhd
-- Deskripsi : Mampu menjumlahkan dua buah input dengan lebar data masing-
masing 32 bit dan mengeluarkan hasil penjumlahan dalam bentuk output dengan
lebar data 32 bit

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;

ARCHITECTURE behavioral OF cla_32 IS


signal sum : std_logic_vector (31 DOWNTO 0);
signal carry_a : std_logic_vector (31 DOWNTO 0);
signal carry_b : std_logic_vector (31 DOWNTO 0);
signal carry_in : std_logic_vector (31 DOWNTO 1);
BEGIN
sum <= OPRND_1 XOR OPRND_2;
carry_a <= OPRND_1 AND OPRND_2;
carry_b <= OPRND_1 OR OPRND_2;

PROCESS (carry_a, carry_b, carry_in)


BEGIN
carry_in(1) <= carry_a(0) OR (carry_b(0) AND C_IN);
carry : for i in 1 to 30 loop
carry_in(i+1) <= carry_a(i) or (carry_b(i) and carry_in(i));
END loop;

C_OUT <= carry_a(31) or (carry_b(31) and carry_in(31));


END PROCESS;

RESULT(0) <= sum(0) XOR C_IN;


RESULT(31 DOWNTO 1) <= sum(31 DOWNTO 1) XOR carry_in(31 DOWNTO 1);
END behavioral;
• Sign_extender
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 4
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : sign_extender.vhd
-- Deskripsi : Menerima data input sebesar 16bit dan mengeluarkan data output
sebesar 32-bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY sign_extender IS
PORT (
D_IN : IN std_logic_vector (15 DOWNTO 0); --Data Input
D_OUT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- Data Output
);
END sign_extender;

ARCHITECTURE behavior OF sign_extender IS


BEGIN
PROCESS (D_IN(15))
BEGIN
if D_IN(15) = '1' then
D_OUT(31 DOWNTO 16) <= (others => '1');
else
D_OUT(31 DOWNTO 16) <= (others => '0');
END IF;
END PROCESS;
D_OUT(15 DOWNTO 0) <= D_IN(15 DOWNTO 0);
END behavior;
• ALU
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 4
-- Percobaan : 5
-- Tanggal : 18 November 2021
-- Nama (NIM) 1 : Frans Wesly Sagala (14S19018)
-- Nama File : ALU.vhd
-- Deskripsi : Menerima dua buah operand sebagai input dengan masing-masing
memiliki lebar data 32 bit. ALU akan memberikan data hasil perhitungan melalui
output dengan lebar data 32 bit. ALU juga memiliki selektor untuk memilih
operasi yang akan dilakukan (penjumlahan => 0X00 atau penguarangan 0X01).

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_MemtoReg and Sig_MemRead


IF OP_In = "100011" THEN
Sig_MemtoReg <= '1';
Sig_MemRead <= '1';
ELSE
Sig_MemtoReg <= '0';
Sig_MemRead <= '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

while (i != 10){ //bne $t1, 10, loop, nop


sum = sum + 1; //addi $t0, $t0, 1 i = i+1; //add $t1, $t1, 1
i = i + 1;
}

Hasil code Assembly


main:
addi $t0, $0, 0 addi $t1, $0, 0 loop:
beq $t1, 10, Exit
nop
addi $t0, $t0, 1 add $t1, $t1, 1 bne $t1, 10, loop nop
Exit :
Pada Tugas pendahuluan kita telah memperoleh data kode heksadesimal dari masing-masing instruksi
-- Isi instruction memory
mem(0) <= X"00000000"; -- initializing mem(4) <= X"20080000"; -- add $t0, $0,
$0
mem(8) <= X"20090000"; -- add $t1,$0,$0 mem(12) <= X"3401000a";-- beq $t1, 10,
Exit
mem(16) <= X"00000000"; -- nop mem(20) <= X"21080001"; -- addi $t0,
$t0, 1
mem(24) <= X"21290001"; -- add $t1, $t1, 1
mem(28) <= X"3401000a"; -- bne $t1, 10,
loop
mem(32) <= X"1429fff9"; -- bne $1, $9, - 28 [loop-0x00400044]
mem(36) <= X"00000000"; -- nop

Adapun sinyal kontrol adalah sebagai berikut :


1. sgnregdestout => SIGRegDest
2. sgnregwriteout => SIGRegWrite
3. sgnALUSrcout => SIGALUSrc
4. sgnBranchResult => branch_result
5. sgnMemReadout => SigMemRead
6. sgnMemWriteout => SIGMemWrite
7. sgnMemToRegOut => SIGMemtoReg Mem (0) dan Mem (4)
mem(0) <= X"00000000"; -- initializing
mem(4) <= X"20080000"; -- add $t0, $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

1. Modul Praktikum Arsitektur Sistem Komputer.


Teknik Elektro IT Del Patterson, David, dan John
Hennesy. Computer Organization and Design : The
Hardware/Software Interface. 2012. Waltham :
Elsevier Inc.
2. Kernighan, Brian, dan Dennis Ritchie. The C
Programming Language 2nd edition. 1998.
Englewood Cliffs: Pretince Hall.
3. Bryant, Randal E. dan David R. O’Hallaron. Computer
System: A Programmer’s Perspective.Prentice Hall.
USA.2011
LAMPIRAN

Anda mungkin juga menyukai