`timescale 1ns/1ns //`include "op_codes.svh" import op_codes::*; /* typedef enum logic [3:0] { MMU_NOP, // 0000 MMU_LOADB, // 0001 MMU_LOADH, // 0010 MMU_LOADW, // 0011 MMU_LOADD, // 0100 MMU_STOREB, // 0101 MMU_STOREH, // 0110 MMU_STOREW, // 0111 MMU_STORED, // 1000 MMU_FETCH, // 1001 MMU_CAS, // 1010 MMU_TLBCLEAR, // 1011 MMU_TLBFLUSH, // 1100 MMU_FENCE // 1101 } MMU_COMMAND; */ module MB_TestBench (); reg myClock, myReset; logic [63:0] cycle_count; always begin #1 myClock = ~myClock; end always_ff @(posedge myClock) begin if (myReset) cycle_count <= 0; else cycle_count <= cycle_count + 1; end /***************************************************************/ reg [15:0] cycle_num; // reg want_write; // logic [2:0] q; wire [63:0] digital_output; wire [35:0] pc_curr; wire halt; wire Transmit_pin; logic [63:0] prev_digital_out; always_ff @(posedge myClock) begin if (myReset) begin cycle_num <= 0; prev_digital_out <= 0; end else begin cycle_num <= cycle_num + 1; if (prev_digital_out != digital_output) $display ("DIGITAL OUTPUT: %16h", digital_output); prev_digital_out <= digital_output; end end initial begin $display ("********** MB_TestBench (CORE VERSION) Running **********"); myClock = 1; myReset = 1; #3 myReset = 0; end CONTROL MyControl ( .clock (myClock), .reset_in (myReset), .digital_input (64'h0000_0000_0000_0047), .digital_output (digital_output), .clk50MHz (myClock), // Serial I/O only for FPGA .clk125MHz (myClock), // not used .UART_RX (1'b1), // . .UART_TX (Transmit_pin), // . .state_out (), // For debugging LEDs on FPGA .pc_of_current_inst (pc_curr), // . .csr_prevpc_out (), // . .csr_cause_out () // . ); /***************************************************************/ /*************************************************************** // localparam MMU_NOP = 4'b0000; // localparam MMU_LOADB = 4'b0001; // localparam MMU_LOADH = 4'b0010; // localparam MMU_LOADW = 4'b0011; // localparam MMU_LOADD = 4'b0100; // localparam MMU_STOREB = 4'b0101; // localparam MMU_STOREH = 4'b0110; // localparam MMU_STOREW = 4'b0111; // localparam MMU_STORED = 4'b1000; // localparam MMU_FETCH = 4'b1001; // localparam MMU_CAS = 4'b1010; // localparam MMU_TLBCLEAR = 4'b1011; // localparam MMU_TLBFLUSH = 4'b1100; // localparam MMU_FENCE = 4'b1101; reg [43:0] root_addr_in; reg [15:0] asid_in; reg mode_in; reg [35:0] address_in; MMU_COMMAND command_in; reg is_checkaddr_in; reg [63:0] cas_old_data_in; reg [63:0] st_data_in; wire [63:0] result_data_out; wire [15:0] result_code_out; wire done_out; wire ready_out; int error_count = 0; // MMU_0 MyMMU MMU_SHELL MyMMUShell ( .clock (myClock), .clock_enable (1'b1), .reset (myReset), .root_addr_in (root_addr_in), .asid_in (asid_in), .mode_in (mode_in), .address_in (address_in), .command_in (command_in), .is_checkaddr_in (is_checkaddr_in), .cas_old_data_in (cas_old_data_in), .st_data_in (st_data_in), .result_data_out (result_data_out), .result_code_out (result_code_out), .done_out (done_out), .ready_out (ready_out) ); task do_op; input MMU_COMMAND command; input [35:0] address; input [63:0] st_data; input [63:0] expected_result_data; input [15:0] expected_result_code; input [15:0] asid; input mode; input [43:0] root_addr; input [63:0] cas_old_data; input is_checkaddr; string str; begin case (command) MMU_NOP: str = "NOP "; MMU_LOADB: str = "LOADB "; MMU_LOADH: str = "LOADH "; MMU_LOADW: str = "LOADW "; MMU_LOADD: str = "LOADD "; MMU_STOREB: str = "STOREB "; MMU_STOREH: str = "STOREH "; MMU_STOREW: str = "STOREW "; MMU_STORED: str = "STORED "; MMU_FETCH: str = "FETCH "; MMU_CAS: str = "CAS "; MMU_TLBCLEAR: str = "TLBCLEAR "; MMU_TLBFLUSH: str = "TLBFLUSH "; MMU_FENCE: str = "FENCE "; MMU_TLBDEBUG: str = "TLBDEBUG "; default: str = "xxx"; endcase // Wait for READY before sending the next command to the MMU. while (ready_out == 0) #1 ; if (command == MMU_FETCH) $display ("%s Address %9h inst %16h time = %0t except = %4h", str, address, expected_result_data, $time+1, expected_result_code); else if ((command == MMU_LOADB) | (command == MMU_LOADH) | (command == MMU_LOADW) | (command == MMU_LOADD)) $display ("%s Address %9h data %16h time = %0t except = %4h", str, address, expected_result_data, $time+1, expected_result_code); else if (command == MMU_NOP) // $display ("cycle %0t %0t ns", ($time+4) / 2, (($time+4) / 2) * 2); $display (" --- NOP at time %0t ---", $time+1); else if (command == MMU_TLBDEBUG) ; else if (command == MMU_TLBCLEAR) $display ("%s ASID %4h time = %0t except = %4h", str, asid, $time+1, expected_result_code); else if (command == MMU_TLBFLUSH) $display ("%s ASID %4h address = %9h time = %0t except = %4h", str, asid, address, $time+1, expected_result_code); else if (command == MMU_FENCE) $display ("%s time = %0t", str, $time+1); else if (command == MMU_CAS) $display ("%s Address %9h st_data %16h casExpectedOld %16h result %0h time = %0t except = %4h", str, address, st_data, cas_old_data, expected_result_data, $time+1, expected_result_code); else if ((command == MMU_STOREB) | (command == MMU_STOREH) | (command == MMU_STOREW) | (command == MMU_STORED)) $display ("%s Address %9h st_data %16h time = %0t except = %4h", str, address, st_data, $time+1, expected_result_code); else begin $display ("************************* %s time = %0t *************************", str, $time+1); error_count++; end // Send the command for exactly 1 clock cycle (2 ticks). address_in = address; command_in = command; root_addr_in = root_addr; mode_in = mode; asid_in = asid; st_data_in = st_data; cas_old_data_in = cas_old_data; is_checkaddr_in = is_checkaddr; #2 ; // Send bogus data to MMU to try to confuse it. address_in = 36'h2_3232_3232; command_in = MMU_INVALID; mode_in = 0; // root_addr_in = 44'h000_0000_0000; // Must hold constant thru entire command! asid_in = 16'h6666; st_data_in = 64'h6565_6565_6565_6565; cas_old_data_in = 64'h6565_6565_6565_6565; is_checkaddr_in = 0; if (command != MMU_NOP) begin // Wait for mmu "done" to go high while (done_out == 0) #1 ; if (is_checkaddr & ( (command == MMU_LOADB) | (command == MMU_LOADH) | (command == MMU_LOADW) | (command == MMU_LOADD) | (command == MMU_STOREB) | (command == MMU_STOREH) | (command == MMU_STOREW) | (command == MMU_STORED) )) begin if (result_code_out == expected_result_code) // Test == and not != to detect uninitialized values ; else begin $display (" ************************** -Result code %4h Expected code %4h ********************", result_code_out, expected_result_code); error_count++; end end else if ( (command == MMU_FETCH) | (command == MMU_LOADB) | (command == MMU_LOADH) | (command == MMU_LOADW) | (command == MMU_LOADD) | (command == MMU_CAS) ) begin if (result_code_out == expected_result_code) // Test == and not != to detect uninitialized values ; else begin $display (" ************************** Result code %4h Expected code %4h ********************", result_code_out, expected_result_code); error_count++; end if ((expected_result_code != 0) | (result_data_out == expected_result_data)) ; else begin $display (" ************************** Result data %16h Expected result %16h ********************", result_data_out, expected_result_data); error_count++; end end else if (command == MMU_TLBDEBUG) begin $display ("TLB-%0h: %16h asid %4h VPN %9h PPN %9h C=%1b D=%1b W=%1b X=%1b V=%1b time = %0t", st_data, result_data_out, result_data_out[63:48], // ASID (result_data_out[47:27] << 14) + 36'h8_0000_0000, // VPN converted to address result_data_out[26:5] << 14, // PPN converted to address result_data_out[4], result_data_out[3], result_data_out[2], result_data_out[1], result_data_out[0], $time-1); if (result_code_out == 0) // Test == and not != to detect uninitialized values ; else begin $display (" ************************** Result code %4h Expected zero ********************", result_code_out); error_count++; end if (result_data_out == expected_result_data) ; else begin $display (" ************************** Result data %16h Expected result %16h ********************", result_data_out, expected_result_data); error_count++; end end else if ( (command == MMU_STOREB) | (command == MMU_STOREH) | (command == MMU_STOREW) | (command == MMU_STORED) | (command == MMU_FENCE) | (command == MMU_TLBCLEAR) | (command == MMU_TLBFLUSH) ) begin if (result_code_out == expected_result_code) // Test == and not != to detect uninitialized values ; else begin $display (" ************************** Result code %4h Expected code %4h ********************", result_code_out, expected_result_code); error_count++; end end else begin $display (" ************************** TestBench - unexpected command ********************"); error_count++; end end end endtask initial begin $display ("********** MB_TestBench Running (MMU TESTER) **********"); myClock = 1; myReset = 1; address_in = 36'h000000000; command_in = MMU_NOP; #1 // Transitions from test bench will be on NEG-edge of clock myReset = 0; // address, st_data, expected_result, expected_code, ASID, mode, root_addr do_op (MMU_STORED, 36'h000000100, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h000000100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 1, 0, 0, 0); $display (" -----Loading page table root into memory at PPN 1 (at 0_0000_4000)..."); do_op (MMU_STORED, 36'h0_0000_4000, 64'h0000_000b_ffff_ffff, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 1st PTE in root page - valid do_op (MMU_STORED, 36'h0_0000_4008, 64'h0000_0008_7600_0000, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 2nd PTE in root page - invalid do_op (MMU_STORED, 36'h0_0000_5ff8, 64'h0000_0010_0000_0001, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // last PTE in root page - valid $display (" -----Loading index page into memory at PPN 2 (at 0_0000_8000)..."); do_op (MMU_STORED, 36'h0_0000_8000, 64'h0000_000f_ffff_fffd, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 1st PTE in index page // 8_0000_0000 maps to 0_0000_c000 - valid, not executable do_op (MMU_STORED, 36'h0_0000_8008, 64'h0000_123c_0000_001e, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 2nd PTE in index page // 8_0000_4000 maps to ??? - invalid do_op (MMU_STORED, 36'h0_0000_8010, 64'h0000_000f_ffff_ffff, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 3rd PTE in index page // 8_0000_8000 maps to 0_0000_c000 - valid, executable do_op (MMU_STORED, 36'h0_0000_8018, 64'h0000_000c_0000_001b, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0000_c000 maps to 0_0000_c000 - Copy, Dirty, !Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8020, 64'h0000_000c_0000_0007, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0001_0000 maps to 0_0000_c000 - !Copy, !Dirty, Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8028, 64'h0000_000c_0000_000f, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0001_4000 maps to 0_0000_c000 - !Copy, Dirty, Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8030, 64'h0000_000c_0000_0017, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0001_8000 maps to 0_0000_c000 - Copy, !Dirty, Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8038, 64'h0000_000c_0000_001f, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0001_c000 maps to 0_0000_c000 - Copy, Dirty, Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8040, 64'h0000_000c_0000_000f, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0002_0000 maps to 0_0000_c000 - !Copy, Dirty, Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8048, 64'h0000_0018_0000_000f, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0002_4000 maps to 0_0001_8000 - !Copy, Dirty, Writable, eXecutable, Valid $display (" -----Loading index page into memory at PPN 4 (at 0_0001_0000)..."); do_op (MMU_STORED, 36'h0_0001_3ff8, 64'h0000_0014_0000_000f, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // last PTE in index page // f_ffff_c000 maps to 0_0001_4000 - valid, executable, not writable $display (" -----Storing data into PPN 3 (at 0_0000_c000)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1212_3434_5656_7878, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into first dword of first virt page do_op (MMU_STORED, 36'h0_0000_c008, 64'h9090_abab_cdcd_efef, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into second dword of first virt page do_op (MMU_STORED, 36'h0_0000_c100, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into offset 100 in first virt page do_op (MMU_STORED, 36'h0_0000_c108, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into offset 108 in first virt page $display (" -----Store data into PPN 5 (at 0_0001_4000)..."); do_op (MMU_STORED, 36'h0_0001_4000, 64'h1122_3344_5566_7788, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into first dword of last virt page do_op (MMU_STORED, 36'h0_0001_7ff8, 64'h9900_aabb_ccdd_eeff, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // Store into last dword of last virt page $display (" -----Retreive data from first and last dwords of virtual address space..."); do_op (MMU_LOADD, 36'h8_0000_0000, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0008, 0, 64'h9090_abab_cdcd_efef, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_c000, 0, 64'h1122_3344_5566_7788, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_fff8, 0, 64'h9900_aabb_ccdd_eeff, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Test STORED - Store data into first and last dwords of virtual address space..."); do_op (MMU_STORED, 36'h8_0000_0000, 64'h2121_4343_6565_8787, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0000_0008, 64'h0909_baba_dcdc_fefe, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'hf_ffff_c000, 64'h2211_4433_6655_8877, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'hf_ffff_fff8, 64'h0099_bbaa_ddcc_ffee, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Retreive data from first and last dwords of virtual address space to check..."); do_op (MMU_LOADD, 36'h8_0000_0000, 0, 64'h2121_4343_6565_8787, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0008, 0, 64'h0909_baba_dcdc_fefe, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_c000, 0, 64'h2211_4433_6655_8877, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_fff8, 0, 64'h0099_bbaa_ddcc_ffee, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREB - Store some bytes into first and last dwords of virtual address space..."); do_op (MMU_STOREB, 36'h8_0000_0000, 64'h0000_0000_0000_007f, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREB, 36'h8_0000_000e, 64'h0000_0000_0000_0056, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREB, 36'hf_ffff_c001, 64'h0000_0000_0000_00f7, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREB, 36'hf_ffff_ffff, 64'h0000_0000_0000_0089, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Retreive data from first and last dwords of virtual address space to check..."); do_op (MMU_LOADD, 36'h8_0000_0000, 0, 64'h7f21_4343_6565_8787, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0008, 0, 64'h0909_baba_dcdc_56fe, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_c000, 0, 64'h22f7_4433_6655_8877, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_fff8, 0, 64'h0099_bbaa_ddcc_ff89, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREH - Store some bytes into first and last dwords of virtual address space..."); do_op (MMU_STOREH, 36'h8_0000_0000, 64'h0000_0000_0000_9595, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'h8_0000_0005, 64'h0000_0000_0000_0056, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'h8_0000_0006, 64'h0000_0000_0000_8484, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'hf_ffff_c000, 64'h0000_0000_0000_7373, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'hf_ffff_fffe, 64'h0000_0000_0000_6262, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Retreive data from first and last dwords of virtual address space to check..."); do_op (MMU_LOADD, 36'h8_0000_0000, 0, 64'h9595_4343_6565_8484, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_c000, 0, 64'h7373_4433_6655_8877, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'hf_ffff_fff8, 0, 64'h0099_bbaa_ddcc_6262, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Test STORED - Store data into some dwords of kernel space..."); do_op (MMU_STORED, 36'h0_0000_0008, 64'h1234_1234_1234_1234, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0003_fff8, 64'h4321_4321_4321_4321, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // With RAM_MEMORY_SIZE_IN_DWORDS = 256 KiBytes, 0_0004_0000 is just beyond the usable RAM. $display (" -----Test STOREB - Store some bytes into some dwords of kernel space..."); do_op (MMU_STOREB, 36'h0_0000_0008, 64'h0000_0000_0000_00b4, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_STOREB, 36'h0_0000_000f, 64'h0000_0000_0000_00c6, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_STOREB, 36'h0_0003_fff8, 64'h0000_0000_0000_00d7, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_STOREB, 36'h0_0003_ffff, 64'h0000_0000_0000_00e8, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); $display (" -----Retreive data from some dwords of kernel space to check..."); do_op (MMU_LOADD, 36'h0_0000_0008, 0, 64'hb434_1234_1234_12c6, 16'h0000, 16'h3333, 1, 0, 0, 0); do_op (MMU_LOADD, 36'h0_0003_fff8, 0, 64'hd721_4321_4321_43e8, 16'h0000, 16'h3333, 1, 0, 0, 0); $display (" -----FETCH data from first virtual page, which is not executable (TLB hit)..."); do_op (MMU_FETCH, 36'h8_0000_0000, 0, 64'h9595_4343_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0000, 0, 64'h9595_4343_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Test STORED - Store into virtual address space (testing exceptions)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STORED, 36'h0_0000_c010, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c020, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c030, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c040, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0000_c000, 64'h3535_3535_3535_3535, 0, 16'h2038, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_STORED, 36'h8_0000_c004, 64'h3535_3535_3535_3535, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception & unaligned do_op (MMU_STORED, 36'h8_0001_0010, 64'h4646_4646_4646_4646, 0, 16'h2050, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_STORED, 36'h8_0001_4020, 64'h5757_5757_5757_5757, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0001_8030, 64'h6868_6868_6868_6868, 0, 16'h2048, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_STORED, 36'h8_0001_c040, 64'h7979_7979_7979_7979, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0001_c044, 64'h7979_7979_7979_7979, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Unaligned do_op (MMU_LOADD, 36'h0_0000_c000, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_LOADD, 36'h0_0000_c010, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_LOADD, 36'h0_0000_c020, 0, 64'h5757_5757_5757_5757, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c030, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_LOADD, 36'h0_0000_c040, 0, 64'h7979_7979_7979_7979, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREW - Store into virtual address space (testing exceptions)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STORED, 36'h0_0000_c010, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c020, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c030, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c040, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREW, 36'h8_0000_c000, 64'h3535_3535_3535_3535, 0, 16'h2038, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_STOREW, 36'h8_0000_c002, 64'h3535_3535_3535_3535, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception & unaligned do_op (MMU_STOREW, 36'h8_0001_0010, 64'h4646_4646_4646_4646, 0, 16'h2050, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_STOREW, 36'h8_0001_4020, 64'h5757_5757_5757_5757, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREW, 36'h8_0001_8030, 64'h6868_6868_6868_6868, 0, 16'h2048, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_STOREW, 36'h8_0001_c040, 64'h7979_7979_7979_7979, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREW, 36'h8_0001_c042, 64'h7979_7979_7979_7979, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Unaligned do_op (MMU_LOADD, 36'h0_0000_c000, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_LOADD, 36'h0_0000_c010, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_LOADD, 36'h0_0000_c020, 0, 64'h5757_5757_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c030, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_LOADD, 36'h0_0000_c040, 0, 64'h7979_7979_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREH - Store into virtual address space (testing exceptions)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STORED, 36'h0_0000_c010, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c020, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c030, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c040, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'h8_0000_c000, 64'h3535_3535_3535_3535, 0, 16'h2038, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_STOREH, 36'h8_0000_c001, 64'h3535_3535_3535_3535, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception & unaligned do_op (MMU_STOREH, 36'h8_0001_0010, 64'h4646_4646_4646_4646, 0, 16'h2050, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_STOREH, 36'h8_0001_4020, 64'h5757_5757_5757_5757, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'h8_0001_8030, 64'h6868_6868_6868_6868, 0, 16'h2048, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_STOREH, 36'h8_0001_c040, 64'h7979_7979_7979_7979, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREH, 36'h8_0001_c041, 64'h7979_7979_7979_7979, 0, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Unaligned do_op (MMU_LOADD, 36'h0_0000_c000, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_LOADD, 36'h0_0000_c010, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_LOADD, 36'h0_0000_c020, 0, 64'h5757_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c030, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_LOADD, 36'h0_0000_c040, 0, 64'h7979_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREB - Store into virtual address space (testing exceptions)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STORED, 36'h0_0000_c010, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c020, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c030, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h0_0000_c040, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREB, 36'h8_0000_c000, 64'h3535_3535_3535_3535, 0, 16'h2038, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_STOREB, 36'h8_0001_0010, 64'h4646_4646_4646_4646, 0, 16'h2050, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_STOREB, 36'h8_0001_4020, 64'h5757_5757_5757_5757, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STOREB, 36'h8_0001_8030, 64'h6868_6868_6868_6868, 0, 16'h2048, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_STOREB, 36'h8_0001_c040, 64'h7979_7979_7979_7979, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c000, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Write exception do_op (MMU_LOADD, 36'h0_0000_c010, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // First dirty do_op (MMU_LOADD, 36'h0_0000_c020, 0, 64'h5713_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c030, 0, 64'h1313_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Copy-on-write do_op (MMU_LOADD, 36'h0_0000_c040, 0, 64'h7913_1313_1313_1313, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); $display (" -----Test STOREB - Store into virtual address space (Page walk leads to STATE_FINISH_OP)..."); do_op (MMU_STORED, 36'h0_0000_c000, 64'h1313_1313_1313_1313, 0, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STOREB, 36'h8_0002_0007, 64'hfefe_fefe_fefe_fefe, 0, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0000_c000, 0, 64'h1313_1313_1313_13fe, 16'h0000, 16'h3333, 1, 44'h000_0000_4000, 0, 0); // Verify $display (" -----Test STOREB - Store into virtual address space (Page walk leads to STATE_FINISH_OP - uses new PPN)..."); do_op (MMU_STORED, 36'h0_0001_8000, 64'h2424_2424_2424_2424, 0, 16'h0000, 16'h1234, 1, 44'h000_0000_4000, 0, 0); // Initialize do_op (MMU_STOREH, 36'h8_0002_4002, 64'hffff_ffff_ffff_7878, 0, 16'h0000, 16'h1234, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h0_0001_8000, 0, 64'h2424_7878_2424_2424, 16'h0000, 16'h1234, 1, 44'h000_0000_4000, 0, 0); // Verify $display (" -----Test TLBDEBUG..."); do_op (MMU_TLBDEBUG, 0, 0, 64'h12340000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h333300004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h333300003800007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h333300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h3333000030000077, 0, 0, 0, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Test TLBCLEAR..."); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h1234, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h12340000480000ce, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h333300004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h333300003800007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h333300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h3333000030000077, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h3333, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h12340000480000ce, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h333300004000006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h333300003800007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h333300002800006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h3333000030000076, 0, 0, 0, 0, 0, 0); $display (" Load TLBs with various entries..."); do_op (MMU_STORED, 36'h8_0000_00a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7701, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0000_80a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7702, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0001_40a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7703, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0002_00a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7702, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0002_40a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7703, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h7702, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h7707, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h7701, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007c, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBCLEAR, 0, 0, 0, 0, 16'h7703, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000ce, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007c, 0, 0, 0, 0, 0, 0); $display (" -----Test TLBFLUSH..."); $display (" Load TLBs with various entries..."); do_op (MMU_STORED, 36'h8_0000_00a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7701, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0000_80a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7702, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0001_40a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7703, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0002_00a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7702, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h8_0002_40a0, 0, 64'h1212_3434_5656_7878, 16'h0000, 16'h7703, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBFLUSH, 36'h8_0000_80ff, 0, 0, 0, 16'h7702, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBFLUSH, 36'h8_0000_00a0, 0, 0, 0, 16'h7703, 0, 0, 0, 0); // Address matches, but not ASID do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBFLUSH, 36'h8_0000_00a0, 0, 0, 0, 16'h7701, 0, 0, 0, 0); // now ASID matches do_op (MMU_TLBDEBUG, 0, 0, 64'h77030000480000cf, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h770200004000006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h770300002800006f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h770200001000007e, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h770100000000007c, 0, 0, 0, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); //****************************** $display (" -----Testing LOAD, virtual address, user mode, asid = 3333 (TLB loaded, then used..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // saves in TLB[0] do_op (MMU_TLBDEBUG, 0, 0, 64'h333300000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Uses TLB[0] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // Pushes new TLB[0] do_op (MMU_TLBDEBUG, 0, 0, 64'h222200000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h333300000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // Uses TLB[0], no push do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // Uses TLB[1], reverses them do_op (MMU_TLBDEBUG, 0, 0, 64'h333300000000007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h222200000000007d, 0, 0, 0, 0, 0, 0); $display (" -----Store bad data, so memory has something..."); do_op (MMU_STORED, 36'h0_0000_200, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0000_208, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0000_210, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0000_218, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0000_220, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_STORED, 36'h0_0000_228, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Test storing into virtual memory..."); do_op (MMU_STORED, 36'h8_0000_0200, 64'h1111_eeee_ffff_1111, 0, 16'h0000, 16'h6666, 1, 44'h000_0000_4000, 0, 0); // Store data using TLB[0] 6 do_op (MMU_STORED, 36'h8_0000_0208, 64'h2222_eeee_ffff_2222, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Add new, pushing 5 6 do_op (MMU_STORED, 36'h8_0000_0210, 64'h3333_eeee_ffff_3333, 0, 16'h0000, 16'h4444, 1, 44'h000_0000_4000, 0, 0); // Add new, pushing 4 5 6 do_op (MMU_STORED, 36'h8_0000_0218, 64'h4444_eeee_ffff_4444, 0, 16'h0000, 16'h4444, 1, 44'h000_0000_4000, 0, 0); // Promote top element 4 5 6 do_op (MMU_STORED, 36'h8_0000_0220, 64'h5555_eeee_ffff_5555, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Promote 2nd element 5 4 6 do_op (MMU_STORED, 36'h8_0000_0228, 64'h6666_eeee_ffff_6666, 0, 16'h0000, 16'h6666, 1, 44'h000_0000_4000, 0, 0); // Promote last element 6 5 4 do_op (MMU_LOADD, 36'h0_0000_c200, 0, 64'h1111_eeee_ffff_1111, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored do_op (MMU_LOADD, 36'h0_0000_c208, 0, 64'h2222_eeee_ffff_2222, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored do_op (MMU_LOADD, 36'h0_0000_c210, 0, 64'h3333_eeee_ffff_3333, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored do_op (MMU_LOADD, 36'h0_0000_c218, 0, 64'h4444_eeee_ffff_4444, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored do_op (MMU_LOADD, 36'h0_0000_c220, 0, 64'h5555_eeee_ffff_5555, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored do_op (MMU_LOADD, 36'h0_0000_c228, 0, 64'h6666_eeee_ffff_6666, 16'h0000, 16'h0000, 1, 0, 0, 0); // Verify data was stored $display (" -----Fill all TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 4444..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Fill all TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 3333..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Fill all TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 2222..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Fill all TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 1111..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Fill all TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 0000 - no change..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_FENCE, 0, 0, 0, 0, 0, 0, 0, 0, 0); $display (" -----Fill all TLBs..."); do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 4444..."); do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] $display (" -----Fill all TLBs..."); do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h4444, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h2222, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h1111, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Promote 0000..."); do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h0000, 0, 44'h000_0000_4000, 0, 0); // TLB[0] $display (" -----Fill all TLBs with unusable TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0014, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0013, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0012, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0011, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0010, 0, 44'h000_0000_4000, 0, 0); // TLB[0] do_op (MMU_FENCE, 36'h0_0000_0000, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // FENCE (to clear FETCH_UNIT) $display (" -----Testing LOADx/FETCH, virtual address, user mode, asid = 3333, root_addr is null..."); do_op (MMU_FENCE, 36'h0_0000_0000, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // FENCE (to clear FETCH_UNIT) do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0000, 16'h2028, 16'h3333, 0, 44'h000_0000_0000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0000, 16'h2028, 16'h3333, 0, 44'h000_0000_0000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0000, 16'h2028, 16'h3333, 0, 44'h000_0000_0000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0000, 16'h2028, 16'h3333, 0, 44'h000_0000_0000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0000, 16'h2028, 16'h3333, 0, 44'h000_0000_0000, 0, 0); do_op (MMU_FENCE, 36'h0_0000_0000, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // FENCE (to clear FETCH_UNIT) do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Testing LOADx, FETCH, virtual address, user mode, asid = 3333 (some alignement issues)..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADB, 36'h8_0000_0101, 0, 64'h0000_0000_0000_0034, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADB, 36'h8_0000_0106, 0, 64'hffff_ffff_ffff_ffcd, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADB, 36'h8_0000_0107, 0, 64'hffff_ffff_ffff_ffef, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0100, 0, 64'h0000_0000_0000_1234, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0101, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0102, 0, 64'h0000_0000_0000_5678, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0103, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0104, 0, 64'hffff_ffff_ffff_90ab, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0105, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0106, 0, 64'hffff_ffff_ffff_cdef, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADH, 36'h8_0000_0107, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0100, 0, 64'h0000_0000_1234_5678, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0101, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0102, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0103, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0104, 0, 64'hffff_ffff_90ab_cdef, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0105, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0106, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADW, 36'h8_0000_0107, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0100, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0101, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0102, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0103, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0104, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0105, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0106, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h8_0000_0107, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Fill all TLBs with unusable TLBs..."); do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0014, 0, 44'h000_0000_4000, 0, 0); // TLB[4] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0013, 0, 44'h000_0000_4000, 0, 0); // TLB[3] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0012, 0, 44'h000_0000_4000, 0, 0); // TLB[2] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0011, 0, 44'h000_0000_4000, 0, 0); // TLB[1] do_op (MMU_LOADB, 36'h8_0000_0100, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h0010, 0, 44'h000_0000_4000, 0, 0); // TLB[0] do_op (MMU_FENCE, 36'h0_0000_0000, 64'h0000_0000_0000_0000, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // FENCE (to clear FETCH_UNIT) $display (" -----1 - Testing FETCH, First page (at 8_0000_0000) is valid but not executable..."); do_op (MMU_FETCH, 36'h8_0000_0100, 0, 64'h1234_5678_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0101, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0102, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0103, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0104, 0, 64'h90ab_cdef_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0105, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0106, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_0107, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----2 - Testing FETCH, Second page (at 8_0000_4000) is invalid..."); do_op (MMU_FETCH, 36'h8_0000_4100, 0, 64'h1234_5678_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4101, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4102, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4103, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4104, 0, 64'h90ab_cdef_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4105, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4106, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_4107, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----3 - Testing FETCH, Third page (at 8_0000_8000) is executable..."); do_op (MMU_FETCH, 36'h8_0000_8100, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8101, 0, 64'h3456_7890_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8102, 0, 64'h5678_90ab_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8103, 0, 64'h7890_abcd_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8104, 0, 64'h90ab_cdef_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8105, 0, 64'habcd_effe_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8106, 0, 64'hcdef_fedc_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h8_0000_8107, 0, 64'heffe_dcba_0000_0000, 16'h0000, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Testing LOADB, virtual address, user mode, asid = 3333, page invalid..."); // This is an address needing the 2nd PTE in the root, which is invalid do_op (MMU_LOADB, 36'h8_0200_0100, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); // This is an address needing the 2nd PTE in the index page, which is invalid do_op (MMU_LOADB, 36'h8_0000_4100, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3333, 0, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, from kernel space, in kernel mode..."); do_op (MMU_STORED, 36'h000000100, 64'h1111_5678_2222_cdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_STORED, 36'h000000108, 64'h3333_5678_4444_cdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_STORED, 36'h000000110, 64'h5555_5678_6666_cdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_STORED, 36'h000000118, 64'h7777_5678_8888_cdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000104, 0, 64'h2222_cdef_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000108, 0, 64'h3333_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010c, 0, 64'h4444_cdef_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000110, 0, 64'h5555_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000110, 0, 64'h5555_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000108, 0, 64'h3333_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000109, 0, 64'h33_5678_440000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010e, 0, 64'hcdef_5555_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000116, 0, 64'hcdef_7777_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Set up page table and initialize some dwords..."); do_op (MMU_STORED, 36'h0_0000_8000, 64'h0000_000f_ffff_ffff, 0, 16'h0000, 16'h3377, 1, 0, 0, 0); // 8_0000_0000 --> 0_0000_c000 - CDWXV do_op (MMU_STORED, 36'h0_0000_8008, 64'h0000_123c_0000_001e, 0, 16'h0000, 16'h3377, 1, 0, 0, 0); // 8_0000_4000 --> ??? - invalid do_op (MMU_STORED, 36'h0_0000_8010, 64'h0000_000f_ffff_ffff, 0, 16'h0000, 16'h3377, 1, 0, 0, 0); // 8_0000_8000 --> 0_0000_c000 - CDWXV do_op (MMU_STORED, 36'h0_0000_8018, 64'h0000_000c_0000_001d, 0, 16'h0000, 16'h3377, 1, 0, 0, 0); // 8_0000_c000 --> 0_0000_c000 - CDW!XV do_op (MMU_STORED, 36'h0_0000_8020, 64'h0000_000c_0000_001f, 0, 16'h0000, 16'h3377, 1, 0, 0, 0); // 8_0001_0000 --> 0_0000_c000 - CDWXV do_op (MMU_STORED, 36'h800003ff8, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800008000, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h80000bff8, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h80000c000, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h80000fff8, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800010000, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'hffffffff8, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h000000008, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_TLBDEBUG, 0, 0, 64'h3377fffff80000af, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 1, 64'h337700002000007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 2, 64'h337700001800007d, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 3, 64'h337700001000007f, 0, 0, 0, 0, 0, 0); do_op (MMU_TLBDEBUG, 0, 4, 64'h337700000000007f, 0, 0, 0, 0, 0, 0); $display (" -----Testing FETCH, memory wrap around..."); // 1234567890abcdef || 0000000000000000 fedcba0987654321 do_op (MMU_FETCH, 36'hf_ffff_fff8, 0, 64'h 12345678_0000_0000, 16'h0000, 16'h3380, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_fff9, 0, 64'h 34567890_0000_0000, 16'h0000, 16'h3381, 1, 44'h000_0000_4000, 0, 0); // Different ASIDs to reload dword_1 & _2 do_op (MMU_FETCH, 36'hf_ffff_fffa, 0, 64'h 567890ab_0000_0000, 16'h0000, 16'h3382, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_fffb, 0, 64'h 7890abcd_0000_0000, 16'h0000, 16'h3383, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_fffc, 0, 64'h 90abcdef_0000_0000, 16'h0000, 16'h3384, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_fffd, 0, 64'h 00000000_0000_0000, 16'h2010, 16'h3385, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_fffe, 0, 64'h 00000000_0000_0000, 16'h2010, 16'h3386, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'hf_ffff_ffff, 0, 64'h 00000000_0000_0000, 16'h2010, 16'h3387, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, Must load dword_1 and dword_2 to get result (hits CASE_4)..."); // 1234_5678_90ab_cdef fedc_ba09_8765_4321 do_op (MMU_STORED, 36'h800002000, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800002008, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800002005, 0, 64'habcd_effe_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800002000, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3378, 1, 44'h000_0000_4000, 0, 0); // again, different ASID do_op (MMU_STORED, 36'h800002008, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3378, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800002006, 0, 64'hcdef_fedc_0000_0000, 16'h0000, 16'h3378, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800002000, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h3379, 1, 44'h000_0000_4000, 0, 0); // again, different ASID do_op (MMU_STORED, 36'h800002008, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h3379, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800002007, 0, 64'heffe_dcba_0000_0000, 16'h0000, 16'h3379, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h800002000, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h337a, 1, 44'h000_0000_4000, 0, 0); // again, different ASID do_op (MMU_STORED, 36'h800002008, 64'hfedc_ba09_8765_4321, 0, 16'h0000, 16'h337a, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800002008, 0, 64'hfedc_ba09_0000_0000, 16'h0000, 16'h337a, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, page boundary VALID-INVALID ..."); // 1234_5678_90ab_cdef xxxx_xxxx_xxxx_xxxx do_op (MMU_FETCH, 36'h800003ff8, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ff9, 0, 64'h3456_7890_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ffa, 0, 64'h5678_90ab_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ffb, 0, 64'h7890_abcd_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ffc, 0, 64'h90ab_cdef_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ffd, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003ffe, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800003fff, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004001, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004002, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004003, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004004, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004005, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004006, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004007, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800004008, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, page boundary INVALID-VALID ..."); // xxxx_xxxx_xxxx_xxxx fedc_ba09_8765_4321 do_op (MMU_FETCH, 36'h800007ff8, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ff9, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ffa, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ffb, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ffc, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ffd, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007ffe, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800007fff, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800008000, 0, 64'hfedc_ba09_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800008001, 0, 64'hdcba_0987_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800008002, 0, 64'hba09_8765_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800008003, 0, 64'h0987_6543_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800008004, 0, 64'h8765_4321_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, page boundary VALID-Not executable ..."); // xxxx_xxxx_xxxx_xxxx fedc_ba09_8765_4321 do_op (MMU_FETCH, 36'h80000bff8, 0, 64'h1234_5678_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bff9, 0, 64'h3456_7890_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bffa, 0, 64'h5678_90ab_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bffb, 0, 64'h7890_abcd_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bffc, 0, 64'h90ab_cdef_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bffd, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bffe, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000bfff, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c000, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c001, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c002, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c003, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c004, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c005, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c006, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c007, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000c008, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, page boundary NOT EXECUTABLE-VALID ..."); // xxxx_xxxx_xxxx_xxxx fedc_ba09_8765_4321 do_op (MMU_FETCH, 36'h80000fff8, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fff9, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fffa, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fffb, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fffc, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fffd, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000fffe, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h80000ffff, 0, 64'h0000_0000_0000_0000, 16'h2040, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800010000, 0, 64'hfedc_ba09_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800010001, 0, 64'hdcba_0987_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800010002, 0, 64'hba09_8765_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800010003, 0, 64'h0987_6543_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_FETCH, 36'h800010004, 0, 64'h8765_4321_0000_0000, 16'h0000, 16'h3377, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing FETCH, Null address..."); do_op (MMU_FETCH, 36'h0_0000_0000, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0001, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0002, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0003, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0004, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0005, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0006, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h0_0000_0007, 0, 64'h9999_9999_9999_9999, 16'h2010, 16'h5555, 1, 0, 0, 0); $display (" -----Testing FETCH, case 3..."); // 1111_5678_2222_cdef 3333_5678_4444_cdef 5555_5678_6666_cdef do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010d, 0, 64'h44cd_ef55_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010e, 0, 64'hcdef_5555_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010f, 0, 64'hef55_5556_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000110, 0, 64'h5555_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000111, 0, 64'h5556_7866_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000112, 0, 64'h5678_6666_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000113, 0, 64'h7866_66cd_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000114, 0, 64'h6666_cdef_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Testing FETCH, case 2a..."); // 1111_5678_2222_cdef_3333_5678_4444_cdef do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000101, 0, 64'h1156_7822_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000102, 0, 64'h5678_2222_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000103, 0, 64'h7822_22cd_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000104, 0, 64'h2222_cdef_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000105, 0, 64'h22cd_ef33_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000106, 0, 64'hcdef_3333_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000107, 0, 64'hef33_3356_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000108, 0, 64'h3333_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000109, 0, 64'h3356_7844_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010a, 0, 64'h5678_4444_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010b, 0, 64'h7844_44cd_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h00000010c, 0, 64'h4444_cdef_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_STORED, 36'h000000018, 64'h1234567890abcdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h000000019, 0, 64'h0000_0000_0000_0034, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Restore page table..."); do_op (MMU_STORED, 36'h0_0000_8000, 64'h0000_000f_ffff_fffd, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 1st PTE in index page // 8_0000_0000 maps to 0_0000_c000 - valid, not executable do_op (MMU_STORED, 36'h0_0000_8008, 64'h0000_123c_0000_001e, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 2nd PTE in index page // 8_0000_4000 maps to ??? - invalid do_op (MMU_STORED, 36'h0_0000_8010, 64'h0000_000f_ffff_ffff, 0, 16'h0000, 16'h3333, 1, 0, 0, 0); // 3rd PTE in index page // 8_0000_8000 maps to 0_0000_c000 - valid, executable do_op (MMU_STORED, 36'h0_0000_8018, 64'h0000_000c_0000_001b, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0000_c000 maps to 0_0000_c000 - Copy, Dirty, !Writable, eXecutable, Valid do_op (MMU_STORED, 36'h0_0000_8020, 64'h0000_000c_0000_0007, 0, 16'h0000, 16'h0000, 1, 0, 0, 0); // 8_0001_0000 maps to 0_0000_c000 - !Copy, !Dirty, Writable, eXecutable, Valid $display (" =================================================="); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); $display (" -----Testing LOADB..."); do_op (MMU_LOADB, 36'h000000018, 0, 64'h0000_0000_0000_0012, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h000000019, 0, 64'h0000_0000_0000_0034, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001a, 0, 64'h0000_0000_0000_0056, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001b, 0, 64'h0000_0000_0000_0078, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001c, 0, 64'hffff_ffff_ffff_ff90, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001d, 0, 64'hffff_ffff_ffff_ffab, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001e, 0, 64'hffff_ffff_ffff_ffcd, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADB, 36'h00000001f, 0, 64'hffff_ffff_ffff_ffef, 16'h0000, 16'h5555, 1, 0, 0, 0); $display (" -----Testing LOADH/W/D (including alignment exceptions)..."); do_op (MMU_LOADH, 36'h000000018, 0, 64'h0000_0000_0000_1234, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADH, 36'h000000019, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADH, 36'h00000001a, 0, 64'h0000_0000_0000_5678, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADH, 36'h00000001b, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADH, 36'h00000001c, 0, 64'hffff_ffff_ffff_90ab, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADH, 36'h00000001d, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADH, 36'h00000001e, 0, 64'hffff_ffff_ffff_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADH, 36'h00000001f, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h000000018, 0, 64'h0000_0000_1234_5678, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADW, 36'h000000019, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h00000001a, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h00000001b, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h00000001c, 0, 64'hffff_ffff_90ab_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADW, 36'h00000001d, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h00000001e, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADW, 36'h00000001f, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADD, 36'h000000019, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001a, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001b, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001c, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001d, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001e, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h00000001f, 0, 64'h0000_0000_0000_0000, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception $display (" -----Testing LOADB/H/W/D null address exceptions..."); do_op (MMU_LOADB, 36'h000000000, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000001, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000002, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000003, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000004, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000005, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000006, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADB, 36'h000000007, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000000, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000001, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception -- alignment errors ignored do_op (MMU_LOADH, 36'h000000002, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000003, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000004, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000005, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000006, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADH, 36'h000000007, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000000, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000001, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000002, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000003, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000004, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000005, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000006, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADW, 36'h000000007, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000000, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000001, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000002, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000003, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000004, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000005, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000006, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception do_op (MMU_LOADD, 36'h000000007, 0, 64'h0000_0000_0000_0000, 16'h2010, 16'h5555, 1, 0, 0, 0); // null address exception $display (" -----Testing LOADB/H/W/D Page Invalid exceptions (user and kernel modes)..."); do_op (MMU_LOADB, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADH, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADW, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADD, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADB, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 0, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADH, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 0, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADW, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 0, 44'h000_0000_4000, 0, 0); // Page Invalid exception do_op (MMU_LOADD, 36'h8_0000_4000, 0, 64'h0000_0000_0000_0000, 16'h2030, 16'h5555, 0, 44'h000_0000_4000, 0, 0); // Page Invalid exception $display (" -----Testing STORED alignment exception..."); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_STORED, 36'h000000019, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001a, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001b, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001c, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001d, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001e, 64'hffff_ffff_ffff_ffff, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_STORED, 36'h00000001f, 64'h1fff_ffff_ffff_fff2, 0, 16'h2008, 16'h5555, 1, 0, 0, 0); // alignment exception do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); // Load buffer (case 4) do_op (MMU_FENCE, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); do_op (MMU_FETCH, 36'h000000100, 0, 64'h1111_5678_0000_0000, 16'h0000, 16'h5555, 1, 0, 0, 0); // Re-Load buffer (case 4, again) <-- waveform inspection here $display (" -----Testing CAS..."); // addr st_data expected result except ASID mode root_addr casExpected isCheckaddr $display (" success (kernel mode, kernel space ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000018, 64'h1111_2222_3333_4444, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); // succeed do_op (MMU_LOADD, 36'h000000018, 0, 64'h1111_2222_3333_4444, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" fail ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdee, 0); // fail do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" fail ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); // fail do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" unaligned ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000019, 64'h1111_2222_3333_4444, 1, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" null address ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000000, 64'h1111_2222_3333_4444, 1, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" null address & unaligned ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000004, 64'h1111_2222_3333_4444, 1, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" illegal address (in user mode) ---"); do_op (MMU_STORED, 36'h000000018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h000000018, 64'h1111_2222_3333_4444, 1, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h000000018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS success (kernel mode, virtual space (forcing page table walk)---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 1, 16'h0000, 16'h5599, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); // succeed do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1111_2222_3333_4444, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS failure (kernel mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h55aa, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); // fail do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS success (kernel mode, virtual space (no page table walk)---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 1, 16'h0000, 16'h5599, 1, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); // succeed do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1111_2222_3333_4444, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS failure (kernel mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h55aa, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); // fail do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS success (USER mode, virtual space (forcing page table walk)---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 1, 16'h0000, 16'h55bb, 0, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); // succeed do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1111_2222_3333_4444, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS failure (USER mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h55cc, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); // fail do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS success (USER mode, virtual space (no page table walk)---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 1, 16'h0000, 16'h55cc, 0, 44'h000_0000_4000, 64'h1234_5678_90ab_cdef, 0); // succeed do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1111_2222_3333_4444, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS failure (USER mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800014018, 64'h1111_2222_3333_4444, 0, 16'h0000, 16'h55cc, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); // fail do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - not writable (USER mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h80000c018, 64'h1111_2222_3333_4444, 0, 16'h2038, 16'h55dd, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - not writable (USER mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h80000c018, 64'h1111_2222_3333_4444, 0, 16'h2038, 16'h55dd, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - not writable (KERNEL mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h80000c018, 64'h1111_2222_3333_4444, 0, 16'h2038, 16'h55ee, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - not writable (KERNEL mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h80000c018, 64'h1111_2222_3333_4444, 0, 16'h2038, 16'h55ee, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - first dirty (USER mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800010018, 64'h1111_2222_3333_4444, 0, 16'h2050, 16'h6600, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - first dirty (USER mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800010018, 64'h1111_2222_3333_4444, 0, 16'h2050, 16'h6600, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - first dirty (KERNEL mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800010018, 64'h1111_2222_3333_4444, 0, 16'h2050, 16'h6611, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - first dirty (KERNEL mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800010018, 64'h1111_2222_3333_4444, 0, 16'h2050, 16'h6611, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - copy-on-write (USER mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800018018, 64'h1111_2222_3333_4444, 0, 16'h2048, 16'h6622, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - copy-on-write (USER mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800018018, 64'h1111_2222_3333_4444, 0, 16'h2048, 16'h6622, 0, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - copy-on-write (KERNEL mode, virtual space (forcing page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800018018, 64'h1111_2222_3333_4444, 0, 16'h2048, 16'h6633, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" CAS exception - copy-on-write (KERNEL mode, virtual space (no page table walk) ---"); do_op (MMU_STORED, 36'h00000c018, 64'h1234_5678_90ab_cdef, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_CAS, 36'h800018018, 64'h1111_2222_3333_4444, 0, 16'h2048, 16'h6633, 1, 44'h000_0000_4000, 64'h9234_5678_90ab_cdef, 0); do_op (MMU_LOADD, 36'h00000c018, 0, 64'h1234_5678_90ab_cdef, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" -----Testing CHECKADDR..."); // addr st_data expected result except ASID mode root_addr casExpected isCheckaddr // Store data do_op (MMU_STORED, 36'h000000010, 64'h1111_1111_1111_1111, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_STORED, 36'h00000c010, 64'h1111_1111_1111_1111, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" LOADx that cause NULL_ADDRESS, UNALIGNED exceptions (kernel mode, kernel space) ---"); do_op (MMU_LOADB, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause NULL_ADDRESS, UNALIGNED exceptions (kernel mode, kernel space) ---"); do_op (MMU_STOREB, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause NULL_ADDRESS, UNALIGNED exceptions (user mode, kernel space) ---"); do_op (MMU_LOADB, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause NULL_ADDRESS, UNALIGNED exceptions (user mode, kernel space) ---"); do_op (MMU_STOREB, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000000, 0, 0, 16'h2010, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000011, 0, 0, 16'h2008, 16'h5555, 0, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause ILLEGAL_ADDRESS exceptions (user mode, kernel space) ---"); do_op (MMU_LOADB, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause ILLEGAL_ADDRESS exceptions (user mode, kernel space) ---"); do_op (MMU_STOREB, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 0, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause no exceptions in kernel mode. BUT-->USER MODE: ILLEGAL_ADDRESS) ---"); do_op (MMU_LOADB, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause no exceptions in kernel mode. BUT-->USER MODE: ILLEGAL_ADDRESS) ---"); do_op (MMU_STOREB, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h000000010, 0, 0, 16'h2020, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause no exceptions in user mode (test in kernel and user modes) ---"); $display (" (The first LOAD primes the TLB, so all tests are page-table-hits.)"); do_op (MMU_LOADB, 36'h800000011, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADB, 36'h800000011, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800000012, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800000014, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800000010, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADB, 36'h800000011, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800000012, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800000014, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800000010, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" (Due to the various ASIDs, these will all do page-table-lookups)"); do_op (MMU_LOADB, 36'h800000011, 0, 1, 16'h0000, 16'h5001, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800000012, 0, 1, 16'h0000, 16'h5002, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800000014, 0, 1, 16'h0000, 16'h5003, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800000010, 0, 1, 16'h0000, 16'h5004, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADB, 36'h800000011, 0, 0, 16'h0000, 16'h5005, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800000012, 0, 0, 16'h0000, 16'h5006, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800000014, 0, 0, 16'h0000, 16'h5007, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800000010, 0, 0, 16'h0000, 16'h5008, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause no exceptions in user mode (test in kernel and user modes) ---"); $display (" (The first LOAD primes the TLB, so all tests are page-table-hits.)"); do_op (MMU_LOADB, 36'h800000011, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800000011, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800000012, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800000014, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800000010, 0, 1, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800000011, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800000012, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800000014, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800000010, 0, 0, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" (Due to the various ASIDs, these will all do page-table-lookups)"); do_op (MMU_STOREB, 36'h800000011, 0, 1, 16'h0000, 16'h6001, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800000012, 0, 1, 16'h0000, 16'h6002, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800000014, 0, 1, 16'h0000, 16'h6003, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800000010, 0, 1, 16'h0000, 16'h6004, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800000011, 0, 0, 16'h0000, 16'h6005, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800000012, 0, 0, 16'h0000, 16'h6006, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800000014, 0, 0, 16'h0000, 16'h6007, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800000010, 0, 0, 16'h0000, 16'h6008, 1, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause INVALID EXCEPTION (test in kernel and user modes) ---"); do_op (MMU_LOADB, 36'h800004011, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800004012, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800004014, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800004010, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADB, 36'h800004011, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADH, 36'h800004012, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADW, 36'h800004014, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_LOADD, 36'h800004010, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause INVALID EXCEPTION (test in kernel and user modes) ---"); do_op (MMU_STOREB, 36'h800004011, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800004012, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800004014, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800004010, 0, 1, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800004011, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800004012, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800004014, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800004010, 0, 0, 16'h2030, 16'h5555, 1, 44'h000_0000_4000, 0, 1); $display (" LOADx that cause PAGE TABLE EXCEPTION (test in kernel and user modes) ---"); do_op (MMU_LOADB, 36'h800004011, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADH, 36'h800004012, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADW, 36'h800004014, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADD, 36'h800004010, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADB, 36'h800004011, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADH, 36'h800004012, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADW, 36'h800004014, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_LOADD, 36'h800004010, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); $display (" STOREx that cause PAGE TABLE EXCEPTION (test in kernel and user modes) ---"); do_op (MMU_STOREB, 36'h800004011, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STOREH, 36'h800004012, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STOREW, 36'h800004014, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STORED, 36'h800004010, 0, 1, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STOREB, 36'h800004011, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STOREH, 36'h800004012, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STOREW, 36'h800004014, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); do_op (MMU_STORED, 36'h800004010, 0, 0, 16'h2028, 16'h3700, 1, 44'h000_0000_0000, 0, 1); $display (" STOREx that cause WRITE EXCEPTION (test in kernel and user modes) ---"); $display (" (The first LOAD primes the TLB, so all tests are page-table-hits.)"); do_op (MMU_LOADB, 36'h80000c011, 0, 1, 16'h0000, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h80000c011, 0, 1, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h80000c012, 0, 1, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h80000c014, 0, 1, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h80000c010, 0, 1, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h80000c011, 0, 0, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h80000c012, 0, 0, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h80000c014, 0, 0, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h80000c010, 0, 0, 16'h2038, 16'h7100, 1, 44'h000_0000_4000, 0, 1); $display (" (Due to the various ASIDs, these will all do page-table-lookups)"); do_op (MMU_STOREB, 36'h80000c011, 0, 1, 16'h2038, 16'h7102, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h80000c012, 0, 1, 16'h2038, 16'h7103, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h80000c014, 0, 1, 16'h2038, 16'h7104, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h80000c010, 0, 1, 16'h2038, 16'h7105, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h80000c011, 0, 0, 16'h2038, 16'h7106, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h80000c012, 0, 0, 16'h2038, 16'h7107, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h80000c014, 0, 0, 16'h2038, 16'h7108, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h80000c010, 0, 0, 16'h2038, 16'h7109, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause FIRST DIRTY EXCEPTION (test in kernel and user modes) ---"); $display (" (The first LOAD primes the TLB, so all tests are page-table-hits.)"); do_op (MMU_LOADB, 36'h800010011, 0, 1, 16'h0000, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800010011, 0, 1, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800010012, 0, 1, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800010014, 0, 1, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800010010, 0, 1, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800010011, 0, 0, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800010012, 0, 0, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800010014, 0, 0, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800010010, 0, 0, 16'h2050, 16'h8100, 1, 44'h000_0000_4000, 0, 1); $display (" (Due to the various ASIDs, these will all do page-table-lookups)"); do_op (MMU_STOREB, 36'h800010011, 0, 1, 16'h2050, 16'h8102, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800010012, 0, 1, 16'h2050, 16'h8103, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800010014, 0, 1, 16'h2050, 16'h8104, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800010010, 0, 1, 16'h2050, 16'h8105, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800010011, 0, 0, 16'h2050, 16'h8106, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800010012, 0, 0, 16'h2050, 16'h8107, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800010014, 0, 0, 16'h2050, 16'h8108, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800010010, 0, 0, 16'h2050, 16'h8109, 1, 44'h000_0000_4000, 0, 1); $display (" STOREx that cause COPY-ON-WRITE EXCEPTION (test in kernel and user modes) ---"); $display (" (The first LOAD primes the TLB, so all tests are page-table-hits.)"); do_op (MMU_LOADB, 36'h800018011, 0, 1, 16'h0000, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800018011, 0, 1, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800018012, 0, 1, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800018014, 0, 1, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800018010, 0, 1, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800018011, 0, 0, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800018012, 0, 0, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800018014, 0, 0, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800018010, 0, 0, 16'h2048, 16'h8100, 1, 44'h000_0000_4000, 0, 1); $display (" (Due to the various ASIDs, these will all do page-table-lookups)"); do_op (MMU_STOREB, 36'h800018011, 0, 1, 16'h2048, 16'h8102, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800018012, 0, 1, 16'h2048, 16'h8103, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800018014, 0, 1, 16'h2048, 16'h8104, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800018010, 0, 1, 16'h2048, 16'h8105, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREB, 36'h800018011, 0, 0, 16'h2048, 16'h8106, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREH, 36'h800018012, 0, 0, 16'h2048, 16'h8107, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STOREW, 36'h800018014, 0, 0, 16'h2048, 16'h8108, 1, 44'h000_0000_4000, 0, 1); do_op (MMU_STORED, 36'h800018010, 0, 0, 16'h2048, 16'h8109, 1, 44'h000_0000_4000, 0, 1); $display (" Verify that none of the above STORExs have updated the memory"); do_op (MMU_LOADD, 36'h000000010, 0, 64'h1111_1111_1111_1111, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); do_op (MMU_LOADD, 36'h00000c010, 0, 64'h1111_1111_1111_1111, 16'h0000, 16'h5555, 1, 44'h000_0000_4000, 0, 0); $display (" Perform STORED and LOADD that should work with MMU_0 (kernel mode, kernel space) ---"); // addr st_data expected result except ASID mode root_addr casExpected isCheckaddr do_op (MMU_STORED, 36'h000000010, 64'h1234_abcd_4321_fedc, 0, 16'h0000, 0, 1, 0, 0, 0); do_op (MMU_LOADD, 36'h000000010, 0, 64'h1234_abcd_4321_fedc, 16'h0000, 0, 1, 0, 0, 0); do_op (MMU_NOP, 0, 0, 0, 0, 16'h5555, 1, 0, 0, 0); //*********************************** $display ("\n********************************* *********************************"); if (error_count == 0) $display ("********************************* DONE ********************************* time = %0t ALL GOOD!", $time+1); else $display ("********************************* DONE ********************************* time = %0t ***** error count: %0d *****", $time+1, error_count); $display ("********************************* *********************************"); end /***************************************************************/ /************************************************** wire [63:0] reg1_data; wire [63:0] reg2_data; wire [63:0] reg3_data; reg [3:0] reg1_addr; reg [3:0] reg2_addr; reg [3:0] reg3_addr; reg reg_write_en; reg [3:0] regD_addr; reg [63:0] regD_data; initial begin $display ("********** MB_TestBench Running **********"); myClock = 0; myReset = 1; want_write = 0; reg_write_en = 0; reg1_addr = 0; reg2_addr = 1; reg3_addr = 2; #2 myReset = 0; reg1_addr = 0; reg2_addr = 1; reg3_addr = 2; #2 regD_addr = 1; regD_data = 64'h123456abcd; reg_write_en = 1; #2 reg_write_en = 0; #2 regD_addr = 0; regD_data = 64'h8765432; reg_write_en = 1; #2 reg_write_en = 0; #6 want_write = 1; #2 want_write = 0; // #200 // $display ("********** Test Done **********"); // $finish; // Will terminate ModelSim // $stop; // Will stop when executed end REGS myRegs ( .clock_in(myClock), .reset_in(myReset), .reg_write_en (reg_write_en), .regD_addr (regD_addr), .regD_data (regD_data), .reg1_addr (reg1_addr), .reg2_addr (reg2_addr), .reg3_addr (reg3_addr), .reg1_data (reg1_data), .reg2_data (reg2_data), .reg3_data (reg3_data) ); **************************************************/ /************************************************** reg myClock; reg [15:0] counter; initial begin myClock = 0; counter = 0; $display ("********** Hello, baby!!!! **********"); $display ("Message 1"); #30 $display ("Message 2"); #30 $display ("********** Done!!! **********"); $error ("Whoops"); end always begin #1 counter = counter + 1; end always begin #5 myClock = ~myClock; end **************************************************/ //initial begin // reg_write_en = 1; // #1 // reg_write_en = 0; //end endmodule