Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТАМ
Кафедра ЕОМ
Звіт
з лабораторної роботи № 6
з дисципліни: “Комп’ютерні системи”
Львів – 2012
Дослідження програмної моделі блоку Fetch з моделі RISC CPU
Мета роботи: Дослідити програмну модель блоку Fetch, яка входить до складу програмної моделі RISK CPU, створеної на мові SystemC. Побудувати структурну схему блоку Fetch.
Порядок виконання роботи
Дослідити програмну модель блоку FETCH, який входить до складу моделі процесора з архітектурою RISC.
На основі моделі, що досліджується, побудувати структурну схему блоку FETCH.
Дати пояснення функцій, що виконуються елементами схеми.
Хід виконання роботи:
Програмна модель блоку Instruction Fetch Unit (Fetch):
#include <iostream.h>
#include "systemc.h"
#include "fetch.h"
#include "directive.h"
void fetch::entry()
{
unsigned addr_tmp=0;
unsigned datao_tmp=0;
unsigned datai_tmp=0;
unsigned lock_tmp = 0;
addr_tmp = 1;
datao_tmp = 0xdeadbeef;
// Now booting from default values
reset.write(true);
ram_cs.write(true);
ram_we.write(false);
address.write(addr_tmp);
wait(memory_latency); // For data to appear
wait_until((bios_valid.delayed() == true) || (icache_valid.delayed() == true));
if (stall_fetch.read() == true) {
datai_tmp = 0;
} else {
datai_tmp = ramdata.read();
}
cout.setf(ios::hex,ios::basefield);
cout << "-----------------------" << endl;
cout << "IFU :" << " mem=0x" << datai_tmp << endl;
cout << "IFU : pc= " << addr_tmp ;
cout.setf(ios::dec,ios::basefield);
cout << " at CSIM " << sc_time_stamp() << endl;
cout << "-----------------------" << endl;
instruction_valid.write(true);
instruction.write(datai_tmp);
program_counter.write(addr_tmp);
ram_cs.write(false);
wait();
instruction_valid.write(false);
addr_tmp++;
wait();
while (true) {
if (addr_tmp == 5) {
reset.write(false);
}
if (interrupt.read() == true) {
ram_cs.write(true);
addr_tmp = int_vectno.read();
ram_we.write(false);
wait(memory_latency);
datai_tmp = ramdata.read();
printf("IF ALERT: **INTERRUPT**\n");
cout.setf(ios::hex,ios::basefield);
cout << "------------------------" << endl;
cout << "IFU :" << " mem=0x" << datai_tmp << endl;
cout << "IFU : pc= " << addr_tmp ;
cout.setf(ios::dec,ios::basefield);
cout << " at CSIM " << sc_time_stamp() << endl;
cout << "------------------------" << endl;
instruction_valid.write(true);
instruction.write(datai_tmp);
ram_cs.write(false);
interrupt_ack.write(true);
if (next_pc.read() == true) { addr_tmp++; }
wait();
instruction_valid.write(false);
interrupt_ack.write(false);
wait();
}
if (branch_valid.read() == true) {
printf("IFU ALERT: **BRANCH**\n");
lock_tmp ++;
ram_cs.write(true);
addr_tmp = branch_address.read();
ram_we.write(false);
wait(memory_latency);
wait_until((bios_valid.delayed() == true) || (icache_valid.delayed() == true));
datai_tmp = ramdata.read();
cout.setf(ios::hex,ios::basefield);
cout << "------------------------" << endl;
cout << "IFU :" << " mem=0x" << datai_tmp << endl;
cout << "IFU : pc= " << addr_tmp ;
cout.setf(ios::dec,ios::basefield);
cout << " at CSIM " << sc_time_stamp() << endl;
cout << "------------------------" << endl;
instruction_valid.write(true);
instruction.write(datai_tmp);
ram_cs.write(false);
if (next_pc.read() == true) { addr_tmp++; }
wait();
instruction_valid.write(false);
wait();
} else {
lock_tmp = 0;
ram_cs.write(true);
address.write(addr_tmp);
ram_we.write(false);
wait(memory_latency); // For data to appear
wait_until((bios_valid.delayed() == true) || (icache_valid.delayed() == true));
datai_tmp = ramdata.read();
cout.setf(ios::hex,ios::basefield);
cout << "------------------------" << endl;
cout << "IFU :" << " mem=0x" << datai_tmp << endl;
cout << "IFU : pc= " << addr_tmp ;
cout.setf(ios::dec,ios::basefield);
cout << " at CSIM " << sc_time_stamp() << endl;
cout << "------------------------" << endl;
instruction_valid.write(true);
instruction.write(datai_tmp);
program_counter.write(addr_tmp);
branch_clear.write(false);
ram_cs.write(false);
if (next_pc.read() == true) { addr_tmp++; }
wait();
instruction_valid.write(false);
wait();
}
if (lock_tmp == 1) {
branch_clear.write(true);
wait();
}
/* Unless you wanted to write to your instruction cache. Usually Instruction cache is read only.
// Write memory location first
chip_select.write(true);
write_enable.write(true);
address.write(addr);
instruction_write.write(datao);
printf("fetch: Data Written = %x at address %x\n", datao, addr);
wait(memory_latency); // To make all the outputs appear at the interface
// some process functionality not shown here during which chip
// chip select is deasserted and bus is tristated
chip_select.write(false);
instruction_write.write(0);
wait();
*/
}
} // end of entry function
Блок-схему IF:
Висновок: На цій лабораторній роботі я дослідив програмну модель блоку Fetch, яка входить до складу програмної моделі RISС CPU, створеної на мові SystemC та побудував структурну схему блоку Fetch.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!