110 likes | 192 Views
Project 4 Help. event GO; parameter mem_size = ‘h1000; ………………. `define word_size [15:0] `define byte_size [7:0] `define address_size [15:0] `define num_regs [15:0] ……………. reg `word_size I //instruction register MCR //memory count register ICR //instruction count register …………….
E N D
event GO; parameter mem_size = ‘h1000; ……………….. `define word_size [15:0] `define byte_size [7:0] `define address_size [15:0] `define num_regs [15:0] …………… reg `word_size I //instruction register MCR //memory count register ICR //instruction count register …………… `define sp R[14] // stack pointer `define pc R[15] // program counter `define op2 I[15:14] // upper part of op_code `define m2 I[13:12] // lower part op_code `define Y4 I[11:8] // Y-operand (4 bits) `define Y3 I[10:8] // Y-operand (3 bits) `define X4 I[7:4] // X-operand (4 bits) `define Z4 I[3:0] // X-operand (4 bits)
// main loop initial begin @GO initialize; printmem; forever begin : main_loop #1 $display (“-----------------------------------------------”); fetch; execute; $display (“pc=%h”, `pc); end end
task initialize; …….. endtask task fetch; reg `byte_size I1, I2; begin I1= READ(`pc); // READ is function `pc = `pc +1; I2 = READ(`pc); `pc = `pc +1; I={I1, I2}; ICR= ICR + 1; end endtask
// memory declaration reg `byte_size MB[0 : mem_size]; function `byte_size READ; input `address_size address; begin READ = MB[address]; MCR = MCR +1; end endfunction task write; input `address_size address; input `byte_size D_byte; begin MB[address] = D_Byte; MCR = MCR + 1; end endtask
task execute; begin case (`op2) 2’b00 : load; 2’b01 :`sto_etc; 2’b10 : branch; 2’b11 : arith; endcase endtask task load; // implement ldb, ldw reg `byte_size I1, I2; reg `address_size address; begin case(`m2) 2’b00 : begin //ldb rd c I1 = I[7:0]; I2 = 0; R[`Y4] = {I2, I1}; $ display(“load byte-immediate”); end
// if m2 = 0 immediate ldb // if m2 = 1 indexed ldb // if m2 = 2 immediate ldw // if m2 = 3 indexed ldw 2’b01: 2’b10: 2’b11: ……………..
task sto_etc; // implement stb stw, nop, hlt // if m2 = 0 indexed stb // if m2 = 1 indexed stw // if m2 = 2 nop // if m2 = 3 hlt case (`m2) 2’b00:begin …. end 2’b01: 2’b10: nop; 2’b11: hlt; task hlt; begin $display (“system halted”); $finish; end endtask task nop; ….. …. ….. endtask
task branch; // implement bra, brr // if m2 = 0 absolute branch, reg // if m2 = 1 absolute branch, con // if m2 = 2 relative branch. reg // if m2 = 3 relative branch, con case (`m2) 2’b00 : begin compare(result, , , ); //task compare if (result) begin …… end … … … endtask
task compare; output result; input [15:0] reg1, reg2; input [3:0] opcode; begin case (opcode) 4’b0000 : result =reg1 < reg 2; ……. …….. 4’b1111 : result = reg1[15] != reg2[15] // signs not equal
task arith; // if m2 = 0 & I[11] = 0 - & I[11] = 1 - // if m2 = 1 & I[11] = 0 - & I[11] = 1 - // if m2 = 2 // if m2 = 3