diff --git a/cMIPS/bin/elf2mif.sh b/cMIPS/bin/elf2mif.sh index 0ce8139948ea9077d06b9f00c5040d4f36aa37f5..28b7f2f5eb7b286d73cb86d84831167fd7be756f 100755 --- a/cMIPS/bin/elf2mif.sh +++ b/cMIPS/bin/elf2mif.sh @@ -44,11 +44,17 @@ fi elf=$1 + +x_ROM_BASE=$(sed -n '/x_INST_BASE_ADDR/s/.*:= x"\(.*\)".*$/\1/p' $tree/vhdl/packageMemory.vhd) + +ROM_BASE=$((16#$x_ROM_BASE)) + + mif=ROM.mif mips-objdump -z -D -EL --section .text $elf |\ sed -e '1,6d' -e '/^$/d' -e '/^ /!d' -e 's:\t: :g' -e 's#^ *\([a-f0-9]*\): *\(........\) *\(.*\)$#\2;#' |\ - awk 'BEGIN{c=0;} //{ printf "%d : %s\n",c,$1 ; c=c+1; }' > xxxx + awk 'BEGIN{c='$ROM_BASE';} //{ printf "%d : %s\n",c,$1 ; c=c+1; }' > xxxx echo -e "\n-- cMIPS code\n\nDEPTH=4096;\nWIDTH=32;\n\n" > $mif echo -e "ADDRESS_RADIX=DEC;\nDATA_RADIX=HEX;\nCONTENT BEGIN" >> $mif @@ -57,4 +63,23 @@ echo "END;" >> $mif rm -f xxxx + +x_RAM_BASE=$(sed -n '/x_DATA_BASE_ADDR/s/.*:= x"\(.*\)".*$/\1/p' $tree/vhdl/packageMemory.vhd) + +RAM_BASE=$((16#$x_RAM_BASE)) + +mif=RAM.mif + +mips-objdump -z -D -EL --section .data --section .rodata --section rodata1 --section .data1 --section .sdata --section .lit8 --section .lit4 --section .sbss --section .bss $elf |\ + sed -e '1,6d' -e '/^$/d' -e '/^ /!d' -e 's:\t: :g' -e 's#^ *\([a-f0-9]*\): *\(........\) *\(.*\)$#\2;#' |\ + awk 'BEGIN{c='$RAM_BASE';} //{ printf "%d : %s\n",c,$1 ; c=c+1; }' > xxxx + +echo -e "\n-- cMIPS data\n\nDEPTH=4096;\nWIDTH=32;\n\n" > $mif +echo -e "ADDRESS_RADIX=DEC;\nDATA_RADIX=HEX;\nCONTENT BEGIN" >> $mif +cat xxxx >> $mif +echo "END;" >> $mif + +rm -f xxxx + + exit 0 diff --git a/cMIPS/tests/doTests.sh b/cMIPS/tests/doTests.sh index de6d677c76a84388c141843cc3beab0787aa2910..c4a4dd46555af4a39f9f94b8b240b782d1589a7e 100755 --- a/cMIPS/tests/doTests.sh +++ b/cMIPS/tests/doTests.sh @@ -70,7 +70,7 @@ a_FUN="jaljr jr_2 jal_fun_jr jalr_jr bltzal_fun_jr" a_OTH="mult div sll slr movz wsbh_seb extract insert" a_BHW="lbsb lhsh lwsw lwswIncr swlw lwl_lwr" a_MEM="lwSweepRAM" -a_CTR="teq_tne teq_jal tlt_tlti tltu_tgeu eiDI ll_sc overflow counter" +a_CTR="teq_tne teq_jal teq_lw tlt_tlti tltu_tgeu eiDI ll_sc overflow counter" a_COP="mtc0CAUSE2 mtc0EPC syscall break mfc0CONFIG badVAddr badVAddrMM" a_MMU="mmu_index mmu_tlbwi mmu_tlbp mmu_tlbwr mmu_context" a_EXC="mmu_refill mmu_refill2 mmu_refill3 mmu_inval mmu_inval2 mmu_mod mmu_mod2 mmu_double mmu_double2" diff --git a/cMIPS/tests/teq_jal.s b/cMIPS/tests/teq_jal.s index b3ac06a929b1792a8964a4391453ce2ba47c90d4..2e9cf9ef0b82643929d23833abaae1f8753d2c92 100644 --- a/cMIPS/tests/teq_jal.s +++ b/cMIPS/tests/teq_jal.s @@ -59,7 +59,7 @@ _excp_0100: excp_180: _excp_180: ## - ## print CAUSE, reset counter, decrement iteration control + ## print CAUSE ## mfc0 $k0, cop0_CAUSE andi $k1, $k0, 0x0030 @@ -71,8 +71,6 @@ _excp_180: sw $k1, x_IO_ADDR_RANGE($15) # print CAUSE.exCode li $k1, '\n' sw $k1, x_IO_ADDR_RANGE($15) - li $5, 0 - addiu $7, $7, -1 # decrement iteration control mfc0 $k1, cop0_EPC # move EPC beyond the JAL addi $k1, $k1, 8 @@ -82,7 +80,7 @@ _excp_180: li $k1, -16 # ffff.fff0 and $k0, $k0, $k1 mtc0 $k0, cop0_STATUS -excp_180ret: + eret .end _excp_180 @@ -133,10 +131,10 @@ main: la $15, x_IO_BASE_ADDR # print out address (simulator's stdout) ## li $9, '\n' sw $9, x_IO_ADDR_RANGE($15) # print out '\n' to separate tests - li $31,'!' - teq $0,$0 - jal check3 - nop + li $31, '!' # put wrong return address in $31 + teq $0,$0 # then trap + jal wrong1 # then DO NOT execute the JAL + nop # as handler skips that instruction nop nop nop diff --git a/cMIPS/tests/uart_irx.c b/cMIPS/tests/uart_irx.c index 7e3e40c4695f4b9d4b4fd8a86ddc37306c04ee6f..d783b6ecca398a95433efb09b2291c324ca4321f 100644 --- a/cMIPS/tests/uart_irx.c +++ b/cMIPS/tests/uart_irx.c @@ -45,6 +45,7 @@ typedef struct serial { extern int _uart_buff[16]; + int main(void) { // receive a string through the UART serial interface volatile Tserial *uart; // tell GCC not to optimize away code Tcontrol ctrl; diff --git a/cMIPS/vhdl/core.vhd b/cMIPS/vhdl/core.vhd index 91c191e75674aaa71794b975cf748ab3d53b7520..5ec67f0a5f61a95f08b68d72e059b898492323d9 100644 --- a/cMIPS/vhdl/core.vhd +++ b/cMIPS/vhdl/core.vhd @@ -89,8 +89,6 @@ architecture rtl of core is MM_cop0_reg: out reg5; EX_cop0_sel: in reg3; MM_cop0_sel: out reg3; - EX_can_trap: in std_logic_vector; - MM_can_trap: out std_logic_vector; EX_PC: in std_logic_vector; MM_PC: out std_logic_vector; EX_v_addr: in std_logic_vector; @@ -161,7 +159,7 @@ architecture rtl of core is signal EX_trapped, MM_trapped, EX_ovfl,MM_ex_ovfl, trap_taken: boolean; signal int_req, MM_int_req: reg8; signal EX_nmi,MM_nmi : std_logic; - signal can_trap,EX_can_trap,MM_can_trap: reg2; + signal can_trap,EX_can_trap : reg2; signal is_trap, tr_signed, tr_stall: std_logic; signal tr_is_equal, tr_less_than: std_logic; signal tr_fwd_A, tr_fwd_B, tr_result : reg32; @@ -1758,8 +1756,7 @@ begin PIPESTAGE_EXCP_EX_MM: reg_excp_EX_MM port map (clk, rst, excp_EX_MM_ld, EX_cop0_reg, MM_cop0_reg, EX_cop0_sel, MM_cop0_sel, - EX_can_trap,MM_can_trap, EX_PC,MM_PC, - v_addr,MM_v_addr, nullify,MM_nullify, + EX_PC,MM_PC, v_addr,MM_v_addr, nullify,MM_nullify, addrError,MM_addrError, addrErr_stage_mm,MM_addrErr_stage_mm, mem_excp_type,MM_mem_excp_type, EX_is_delayslot,MM_is_delayslot, EX_ovfl,MM_ex_ovfl, EX_trapped,MM_trapped, diff --git a/cMIPS/vhdl/exception.vhd b/cMIPS/vhdl/exception.vhd index 9870612e9fdd4fc5c9901e49df36b66497cb6951..bc11588588b42fd23485fc4c769c5b7dded6502c 100644 --- a/cMIPS/vhdl/exception.vhd +++ b/cMIPS/vhdl/exception.vhd @@ -122,8 +122,6 @@ entity reg_excp_EX_MM is MM_cop0_reg: out reg5; EX_cop0_sel: in reg3; MM_cop0_sel: out reg3; - EX_can_trap: in reg2; - MM_can_trap: out reg2; EX_PC: in reg32; MM_PC: out reg32; EX_v_addr: in reg32; @@ -171,7 +169,6 @@ begin process(clk, rst, ld) begin if rst = '0' then - MM_can_trap <= b"00"; MM_trapped <= FALSE; MM_pc_abort <= FALSE; MM_nullify <= FALSE; @@ -183,7 +180,6 @@ begin if ld = '0' then MM_cop0_reg <= EX_cop0_reg ; MM_cop0_sel <= EX_cop0_sel ; - MM_can_trap <= EX_can_trap ; MM_PC <= EX_PC ; MM_v_addr <= EX_v_addr ; MM_nullify <= nullify ; diff --git a/cMIPS/vhdl/packageMemory.vhd b/cMIPS/vhdl/packageMemory.vhd index 5cf5c4cd9845b65a7c9cfca36d4ac4234497dd4a..b67e3b2c8c2ad5aa8cfde1b8204f6550abe5c01b 100644 --- a/cMIPS/vhdl/packageMemory.vhd +++ b/cMIPS/vhdl/packageMemory.vhd @@ -47,10 +47,10 @@ package p_MEMORY is constant x_IO_BASE_ADDR : reg32 := x"0F000000"; constant x_IO_MEM_SZ : reg32 := x"00002000"; constant x_IO_ADDR_RANGE : reg32 := x"00000020"; - constant x_EXCEPTION_0000 : reg32 := x"00000130"; -- TLB refill - constant x_EXCEPTION_0100 : reg32 := x"00000200"; -- Cache Error - constant x_EXCEPTION_0180 : reg32 := x"00000280"; -- general exc hndlr - constant x_EXCEPTION_0200 : reg32 := x"00000400"; -- separ interr hndlr + constant x_EXCEPTION_0000 : reg32 := x"00000130"; -- TLBrefill + constant x_EXCEPTION_0100 : reg32 := x"00000200"; -- CacheError + constant x_EXCEPTION_0180 : reg32 := x"00000280"; -- generalExcpHandler + constant x_EXCEPTION_0200 : reg32 := x"00000400"; -- separInterrHandler constant x_EXCEPTION_BFC0 : reg32 := x"000004E0"; -- NMI, soft-reset constant x_ENTRY_POINT : reg32 := x"00000500"; -- main() -- end DO NOT change these names --