Initial commit
This commit is contained in:
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
+540
@@ -0,0 +1,540 @@
|
||||
NET AUDIO_BIT_CLK LOC="AF18"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET AUDIO_SDATA_IN LOC="AE18"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET AUDIO_SDATA_OUT LOC="AG16"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET AUDIO_SYNC LOC="AF19"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET BUS_ERROR_1 LOC="F6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET BUS_ERROR_2 LOC="T10"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET CFG_ADDR_OUT0 LOC="AE12"; # Bank 2, Vcco=3.3V
|
||||
NET CFG_ADDR_OUT1 LOC="AE13"; # Bank 2, Vcco=3.3V
|
||||
NET CLK_27MHZ_FPGA LOC="AG18"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET CLK_33MHZ_FPGA LOC="AH17"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET CLK_FPGA_N LOC="K19"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET CLK_FPGA_P LOC="L19"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET CLKBUF_Q0_N LOC="H3"; # Bank 116, MGTREFCLKN_116, GTP_DUAL_X0Y4
|
||||
NET CLKBUF_Q0_P LOC="H4"; # Bank 116, MGTREFCLKP_116, GTP_DUAL_X0Y4
|
||||
NET CLKBUF_Q1_N LOC="J19"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET CLKBUF_Q1_P LOC="K18"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET CPLD_IO_1 LOC="W10"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET CPU_TCK LOC="E6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET CPU_TDO LOC="E7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET CPU_TMS LOC="U10"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET CPU_TRST LOC="V10"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET DDR2_A0 LOC="L30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A1 LOC="M30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A2 LOC="N29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A3 LOC="P29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A4 LOC="K31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A5 LOC="L31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A6 LOC="P31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A7 LOC="P30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A8 LOC="M31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A9 LOC="R28"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A10 LOC="J31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A11 LOC="R29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A12 LOC="T31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_A13 LOC="H29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_BA0 LOC="G31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_BA1 LOC="J30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_BA2 LOC="R31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CAS_B LOC="E31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CKE0 LOC="T28"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CKE1 LOC="U30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CLK0_N LOC="AJ29"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CLK0_P LOC="AK29"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CLK1_N LOC="F28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CLK1_P LOC="E28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CS0_B LOC="L29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_CS1_B LOC="J29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D0 LOC="AF30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D1 LOC="AK31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D2 LOC="AF31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D3 LOC="AD30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D4 LOC="AJ30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D5 LOC="AF29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D6 LOC="AD29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D7 LOC="AE29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D8 LOC="AH27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D9 LOC="AF28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D10 LOC="AH28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D11 LOC="AA28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D12 LOC="AG25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D13 LOC="AJ26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D14 LOC="AG28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D15 LOC="AB28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D16 LOC="AC28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D17 LOC="AB25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D18 LOC="AC27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D19 LOC="AA26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D20 LOC="AB26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D21 LOC="AA24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D22 LOC="AB27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D23 LOC="AA25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D24 LOC="AC29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D25 LOC="AB30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D26 LOC="W31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D27 LOC="V30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D28 LOC="AC30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D29 LOC="W29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D30 LOC="V27"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D31 LOC="W27"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D32 LOC="V29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D33 LOC="Y27"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D34 LOC="Y26"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D35 LOC="W24"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D36 LOC="V28"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D37 LOC="W25"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D38 LOC="W26"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D39 LOC="V24"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D40 LOC="R24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D41 LOC="P25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D42 LOC="N24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D43 LOC="P26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D44 LOC="T24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D45 LOC="N25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D46 LOC="P27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D47 LOC="N28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D48 LOC="M28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D49 LOC="L28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D50 LOC="F25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D51 LOC="H25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D52 LOC="K27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D53 LOC="K28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D54 LOC="H24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D55 LOC="G26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D56 LOC="G25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D57 LOC="M26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D58 LOC="J24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D59 LOC="L26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D60 LOC="J27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D61 LOC="M25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D62 LOC="L25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_D63 LOC="L24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM0 LOC="AJ31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM1 LOC="AE28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM2 LOC="Y24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM3 LOC="Y31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM4 LOC="V25"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM5 LOC="P24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM6 LOC="F26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DM7 LOC="J25"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS0_N LOC="AA30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS0_P LOC="AA29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS1_N LOC="AK27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS1_P LOC="AK28"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS2_N LOC="AJ27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS2_P LOC="AK26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS3_N LOC="AA31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS3_P LOC="AB31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS4_N LOC="Y29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS4_P LOC="Y28"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS5_N LOC="E27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS5_P LOC="E26"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS6_N LOC="G28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS6_P LOC="H28"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS7_N LOC="H27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_DQS7_P LOC="G27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_ODT0 LOC="F31"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_ODT1 LOC="F30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_RAS_B LOC="H30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_SCL LOC="E29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_SDA LOC="F29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DDR2_WE_B LOC="K29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D0 LOC="AB8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D1 LOC="AC8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D2 LOC="AN12"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D3 LOC="AP12"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D4 LOC="AA9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D5 LOC="AA8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D6 LOC="AM13"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D7 LOC="AN13"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D8 LOC="AA10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D9 LOC="AB10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D10 LOC="AP14"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_D11 LOC="AN14"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_DE LOC="AE8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_GPIO1 LOC="N30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET DVI_H LOC="AM12"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_RESET_B LOC="AK6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET DVI_V LOC="AM11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_XCLK_N LOC="AL10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET DVI_XCLK_P LOC="AL11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FAN_ALERT_B LOC="T30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FLASH_ADV_B LOC="F13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FLASH_AUDIO_RESET_B LOC="AG17"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET FLASH_CE_B LOC="AE14"; # Bank 2, Vcco=3.3V
|
||||
NET FLASH_CLK LOC="N9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FLASH_OE_B LOC="AF14"; # Bank 2, Vcco=3.3V
|
||||
NET FLASH_WAIT LOC="G13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_AVDD LOC="T18"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_CCLK-R LOC="N15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_CPU_RESET_B LOC="E9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_CS_B LOC="N22"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_CS0_B LOC="AF21"; # Bank 2, Vcco=3.3V
|
||||
NET FPGA_DIFF_CLK_OUT_N LOC="J21"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET FPGA_DIFF_CLK_OUT_P LOC="J20"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET FPGA_DIN LOC="P15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_DONE LOC="M15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_DOUT_BUSY LOC="AD15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_DX_N LOC="W17"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_DX_P LOC="W18"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_EXP_TCK LOC="AB15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_EXP_TMS LOC="AC14"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_HSWAPEN LOC="M23"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_INIT_B LOC="N14"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_M0 LOC="AD21"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_M1 LOC="AC22"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_M2 LOC="AD22"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_PROG_B LOC="M22"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_RDWR_B LOC="N23"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_ROTARY_INCA LOC="AH30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_ROTARY_INCB LOC="AG30"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_ROTARY_PUSH LOC="AH29"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_SERIAL1_RX LOC="AG15"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET FPGA_SERIAL1_TX LOC="AG20"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET FPGA_SERIAL2_RX LOC="G10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_SERIAL2_TX LOC="F10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_TDI LOC="AC15"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_TDO LOC="AD14"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_V_N LOC="V17"; # Bank 0, Vcco=3.3V (SYSMON External Input: VN) J9-10
|
||||
NET FPGA_V_P LOC="U18"; # Bank 0, Vcco=3.3V (SYSMON External Input: VP) J9-9
|
||||
NET FPGA_VBATT LOC="L23"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_VREFP LOC="V18"; # Bank 0, Vcco=3.3V
|
||||
NET FPGA_VRN_B11 LOC="N33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET FPGA_VRN_B13 LOC="AG33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET FPGA_VRN_B17 LOC="AD31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRN_B19 LOC="N27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRN_B20 LOC="L10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRN_B21 LOC="AJ25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRN_B22 LOC="AF8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRP_B11 LOC="M33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET FPGA_VRP_B13 LOC="AH33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET FPGA_VRP_B17 LOC="AE31"; # Bank 17, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRP_B19 LOC="M27"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRP_B20 LOC="L11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRP_B21 LOC="AH25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET FPGA_VRP_B22 LOC="AE9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW1 LOC="U25"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW2 LOC="AG27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW3 LOC="AF25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW4 LOC="AF26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW5 LOC="AE27"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW6 LOC="AE26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW7 LOC="AC25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_DIP_SW8 LOC="AC24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_0 LOC="H18"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET GPIO_LED_1 LOC="L18"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET GPIO_LED_2 LOC="G15"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET GPIO_LED_3 LOC="AD26"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_4 LOC="G16"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET GPIO_LED_5 LOC="AD25"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_6 LOC="AD24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_7 LOC="AE24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_C LOC="E8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET GPIO_LED_E LOC="AG23"; # Bank 2, Vcco=3.3V
|
||||
NET GPIO_LED_N LOC="AF13"; # Bank 2, Vcco=3.3V
|
||||
NET GPIO_LED_S LOC="AG12"; # Bank 2, Vcco=3.3V
|
||||
NET GPIO_LED_W LOC="AF23"; # Bank 2, Vcco=3.3V
|
||||
NET GPIO_SW_C LOC="AJ6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET GPIO_SW_E LOC="AK7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET GPIO_SW_N LOC="U8"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET GPIO_SW_S LOC="V8"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET GPIO_SW_W LOC="AJ7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET HDR1_2 LOC="H33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_4 LOC="F34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_6 LOC="H34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_8 LOC="G33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_10 LOC="G32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_12 LOC="H32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_14 LOC="J32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_16 LOC="J34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_18 LOC ="L33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_20 LOC="M32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_22 LOC="P34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_24 LOC="N34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_26 LOC="AA34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[5]) J6-26
|
||||
NET HDR1_28 LOC="AD32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_30 LOC="Y34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[5]) J6-30
|
||||
NET HDR1_32 LOC="Y32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_34 LOC="W32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_36 LOC="AH34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_38 LOC="AE32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_40 LOC="AG32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_42 LOC="AH32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_44 LOC="AK34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_46 LOC="AK33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_48 LOC="AJ32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_50 LOC="AK32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_52 LOC="AL34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_54 LOC="AL33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_56 LOC="AM33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_58 LOC="AJ34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_60 LOC="AM32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_62 LOC="AN34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR1_64 LOC="AN33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR2_2_SM_8_N LOC="K34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[15]) J4-2
|
||||
NET HDR2_4_SM_8_P LOC="L34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[15]) J4-4
|
||||
NET HDR2_6_SM_7_N LOC="K32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[14]) J4-6
|
||||
NET HDR2_8_SM_7_P LOC="K33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[14]) J4-8
|
||||
NET HDR2_10_DIFF_0_N LOC="N32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[13]) J4-10
|
||||
NET HDR2_12_DIFF_0_P LOC="P32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[13]) J4-12
|
||||
NET HDR2_14_DIFF_1_N LOC="R34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[12]) J4-14
|
||||
NET HDR2_16_DIFF_1_P LOC="T33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[12]) J4-16
|
||||
NET HDR2_18_DIFF_2_N LOC="R32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[11]) J4-18
|
||||
NET HDR2_20_DIFF_2_P LOC="R33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[11]) J4-20
|
||||
NET HDR2_22_SM_10_N LOC="T34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[10]) J4-22
|
||||
NET HDR2_24_SM_10_P LOC="U33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[10]) J4-24
|
||||
NET HDR2_26_SM_11_N LOC="U31"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[9]) J4-26
|
||||
NET HDR2_28_SM_11_P LOC="U32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[9]) J4-28
|
||||
NET HDR2_30_DIFF_3_N LOC="V33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[8]) J4-30
|
||||
NET HDR2_32_DIFF_3_P LOC="V32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[8]) J4-32
|
||||
NET HDR2_34_SM_15_N LOC="V34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[7]) J4-34
|
||||
NET HDR2_36_SM_15_P LOC="W34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[7]) J4-36
|
||||
NET HDR2_38_SM_6_N LOC="AA33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[6]) J4-38
|
||||
NET HDR2_40_SM_6_P LOC="Y33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[6]) J4-40
|
||||
NET HDR2_42_SM_14_N LOC="AE34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[0]) J4-42
|
||||
NET HDR2_44_SM_14_P LOC="AF34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[0]) J4-44
|
||||
NET HDR2_46_SM_12_N LOC="AE33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[1]) J4-46
|
||||
NET HDR2_48_SM_12_P LOC="AF33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[1]) J4-48
|
||||
NET HDR2_50_SM_5_N LOC="AD34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[4]) J4-50
|
||||
NET HDR2_52_SM_5_P LOC="AC34"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[4]) J4-52
|
||||
NET HDR2_54_SM_13_N LOC="AB32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[3]) J4-54
|
||||
NET HDR2_56_SM_13_P LOC="AC32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[3]) J4-56
|
||||
NET HDR2_58_SM_4_N LOC="AB33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[2]) J4-58
|
||||
NET HDR2_60_SM_4_P LOC="AC33"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[2]) J4-60
|
||||
NET HDR2_62_SM_9_N LOC="AP32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET HDR2_64_SM_9_P LOC="AN32"; # Bank 13, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET IIC_SCL_MAIN LOC="F9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET IIC_SCL_SFP LOC="R26"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET IIC_SCL_VIDEO LOC="U27"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET IIC_SDA_MAIN LOC="F8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET IIC_SDA_SFP LOC="U28"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET IIC_SDA_VIDEO LOC="T29"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET KEYBOARD_CLK LOC="T26"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET KEYBOARD_DATA LOC="T25"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_DB4 LOC="T9"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_DB5 LOC="G7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_DB6 LOC="G6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_DB7 LOC="T11"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_E LOC="AC9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LCD_FPGA_RS LOC="J17"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET LCD_FPGA_RW LOC="AC10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET LOOPBK_114_N LOC="AG1"; # Bank 118, MGTRXN1_118, GTP_DUAL_X0Y1
|
||||
NET LOOPBK_114_N LOC="AH2"; # Bank 118, MGTTXN1_118, GTP_DUAL_X0Y1
|
||||
NET LOOPBK_114_P LOC="AH1"; # Bank 118, MGTRXP1_118, GTP_DUAL_X0Y1
|
||||
NET LOOPBK_114_P LOC="AJ2"; # Bank 118, MGTTXP1_118, GTP_DUAL_X0Y1
|
||||
NET LOOPBK_116_N LOC="R1"; # Bank 112, MGTRXN1_112, GTP_DUAL_X0Y3
|
||||
NET LOOPBK_116_N LOC="T2"; # Bank 112, MGTTXN1_112, GTP_DUAL_X0Y3
|
||||
NET LOOPBK_116_P LOC="T1"; # Bank 112, MGTRXP1_112, GTP_DUAL_X0Y3
|
||||
NET LOOPBK_116_P LOC="U2"; # Bank 112, MGTTXP1_112, GTP_DUAL_X0Y3
|
||||
NET MOUSE_CLK LOC="R27"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET MOUSE_DATA LOC="U26"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET PC4_HALT_B LOC="W9"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET PCIE_CLK_QO_N LOC="AF3"; # Bank 118, MGTREFCLKN_118, GTP_DUAL_X0Y1
|
||||
NET PCIE_CLK_QO_P LOC="AF4"; # Bank 118, MGTREFCLKP_118, GTP_DUAL_X0Y1
|
||||
NET PCIE_PRSNT_B_FPGA LOC="AF24"; # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET PCIE_RX_N LOC="AF1"; # Bank 118, MGTRXN0_118, GTP_DUAL_X0Y1
|
||||
NET PCIE_RX_P LOC="AE1"; # Bank 118, MGTRXP0_118, GTP_DUAL_X0Y1
|
||||
NET PCIE_TX_N LOC="AE2"; # Bank 118, MGTTXN0_118, GTP_DUAL_X0Y1
|
||||
NET PCIE_TX_P LOC="AD2"; # Bank 118, MGTTXP0_118, GTP_DUAL_X0Y1
|
||||
NET PHY_COL LOC="B32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_CRS LOC="E34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_INT LOC="H20"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_MDC LOC="H19"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_MDIO LOC="H13"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_RESET LOC="J14"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_RXCLK LOC="H17"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_RXCTL_RXDV LOC="E32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD0 LOC="A33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD1 LOC="B33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD2 LOC="C33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD3 LOC="C32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD4 LOC="D32"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD5 LOC="C34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD6 LOC="D34"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXD7 LOC="F33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_RXER LOC="E33"; # Bank 11, Vcco=2.5V or 3.3V user selectable by J20
|
||||
NET PHY_TXC_GTXCLK LOC="J16"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_TXCLK LOC="K17"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET PHY_TXCTL_TXEN LOC="AJ10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD0 LOC="AF11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD1 LOC="AE11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD2 LOC="AH9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD3 LOC="AH10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD4 LOC="AG8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD5 LOC="AH8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD6 LOC="AG10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXD7 LOC="AG11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PHY_TXER LOC="AJ9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET PIEZO_SPEAKER LOC="G30"; # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET RESERVED1 LOC="AB23"; # Bank 0, Vcco=3.3V
|
||||
NET RESERVED2 LOC="AC23"; # Bank 0, Vcco=3.3V
|
||||
NET RREF LOC="V4"; # Bank 112, MGTRREF_112, GTP_DUAL_X0Y3
|
||||
NET SATA1_RX_N LOC="Y1"; # Bank 114, MGTRXN0_114, GTP_DUAL_X0Y2
|
||||
NET SATA1_RX_P LOC="W1"; # Bank 114, MGTRXP0_114, GTP_DUAL_X0Y2
|
||||
NET SATA1_TX_N LOC="W2"; # Bank 114, MGTTXN0_114, GTP_DUAL_X0Y2
|
||||
NET SATA1_TX_P LOC="V2"; # Bank 114, MGTTXP0_114, GTP_DUAL_X0Y2
|
||||
NET SATA2_RX_N LOC="AA1"; # Bank 114, MGTRXN1_114, GTP_DUAL_X0Y2
|
||||
NET SATA2_RX_P LOC="AB1"; # Bank 114, MGTRXP1_114, GTP_DUAL_X0Y2
|
||||
NET SATA2_TX_N LOC="AB2"; # Bank 114, MGTTXN1_114, GTP_DUAL_X0Y2
|
||||
NET SATA2_TX_P LOC="AC2"; # Bank 114, MGTTXP1_114, GTP_DUAL_X0Y2
|
||||
NET SATACLK_QO_N LOC="Y3"; # Bank 114, MGTREFCLKN_114, GTP_DUAL_X0Y2
|
||||
NET SATACLK_QO_P LOC="Y4"; # Bank 114, MGTREFCLKP_114, GTP_DUAL_X0Y2
|
||||
NET SFP_RX_N LOC="H1"; # Bank 116, MGTRXN0_116, GTP_DUAL_X0Y4
|
||||
NET SFP_RX_P LOC="G1"; # Bank 116, MGTRXP0_116, GTP_DUAL_X0Y4
|
||||
NET SFP_TX_DISABLE_FPGA LOC="K24"; # Bank 19, Vcco=1.8V, DCI using 49.9 ohm resistors
|
||||
NET SFP_TX_N LOC="G2"; # Bank 116, MGTTXN0_116, GTP_DUAL_X0Y4
|
||||
NET SFP_TX_P LOC="F2"; # Bank 116, MGTTXP0_116, GTP_DUAL_X0Y4
|
||||
NET SGMII_RX_N LOC="P1"; # Bank 112, MGTRXN0_112, GTP_DUAL_X0Y3
|
||||
NET SGMII_RX_P LOC="N1"; # Bank 112, MGTRXP0_112, GTP_DUAL_X0Y3
|
||||
NET SGMII_TX_N LOC="N2"; # Bank 112, MGTTXN0_112, GTP_DUAL_X0Y3
|
||||
NET SGMII_TX_P LOC="M2"; # Bank 112, MGTTXP0_112, GTP_DUAL_X0Y3
|
||||
NET SGMIICLK_QO_N LOC="P3"; # Bank 112, MGTREFCLKN_112, GTP_DUAL_X0Y3
|
||||
NET SGMIICLK_QO_P LOC="P4"; # Bank 112, MGTREFCLKP_112, GTP_DUAL_X0Y3
|
||||
NET SMA_DIFF_CLK_IN_N LOC="H15"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET SMA_DIFF_CLK_IN_P LOC="H14"; # Bank 3, Vcco=2.5V, No DCI
|
||||
NET SMA_RX_N LOC="J1"; # Bank 116, MGTRXN1_116, GTP_DUAL_X0Y4
|
||||
NET SMA_RX_P LOC="K1"; # Bank 116, MGTRXP1_116, GTP_DUAL_X0Y4
|
||||
NET SMA_TX_N LOC="K2"; # Bank 116, MGTTXN1_116, GTP_DUAL_X0Y4
|
||||
NET SMA_TX_P LOC="L2"; # Bank 116, MGTTXP1_116, GTP_DUAL_X0Y4
|
||||
NET SPI_CE_B LOC="V9"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET SRAM_ADV_LD_B LOC="H8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_BW0 LOC="D10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_BW1 LOC="D11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_BW2 LOC="J11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_BW3 LOC="K11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_CLK LOC="AG21"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_CLK LOC="G8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_CS_B LOC="J10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D16 LOC="N10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D17 LOC="E13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D18 LOC="E12"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D19 LOC="L9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D20 LOC="M10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D21 LOC="E11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D22 LOC="F11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D23 LOC="L8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D24 LOC="M8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D25 LOC="G12"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D26 LOC="G11"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D27 LOC="C13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D28 LOC="B13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D29 LOC="K9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D30 LOC="K8"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_D31 LOC="J9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_DQP0 LOC="D12"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_DQP1 LOC="C12"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_DQP2 LOC="H10"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_DQP3 LOC="H9"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_FLASH_A0 LOC="K12"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A1 LOC="K13"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A2 LOC="H23"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A3 LOC="G23"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A4 LOC="H12"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A5 LOC="J12"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A6 LOC="K22"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A7 LOC="K23"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A8 LOC="K14"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A9 LOC="L14"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A10 LOC="H22"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A11 LOC="G22"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A12 LOC="J15"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A13 LOC="K16"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A14 LOC="K21"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A15 LOC="J22"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A16 LOC="L16"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A17 LOC="L15"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A18 LOC="L20"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A19 LOC="L21"; # Bank 1, Vcco=3.3V
|
||||
NET SRAM_FLASH_A20 LOC="AE23"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_A21 LOC="AE22"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D0 LOC="AD19"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D1 LOC="AE19"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D2 LOC="AE17"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D3 LOC="AF16"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D4 LOC="AD20"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D5 LOC="AE21"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D6 LOC="AE16"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D7 LOC="AF15"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_FLASH_D8 LOC="AH13"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D9 LOC="AH14"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D10 LOC="AH19"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D11 LOC="AH20"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D12 LOC="AG13"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D13 LOC="AH12"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D14 LOC="AH22"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_D15 LOC="AG22"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET SRAM_FLASH_WE_B LOC="AF20"; # Bank 2, Vcco=3.3V
|
||||
NET SRAM_MODE LOC="A13"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SRAM_OE_B LOC="B12"; # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA00 LOC="G5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA01_USB_A0 LOC="N7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA02_USB_A1 LOC="N5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA03 LOC="P5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA04 LOC="R6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA05 LOC="M6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPA06 LOC="L6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPBRDY LOC="H5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPCE LOC="M5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPIRQ LOC="M7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPOE_USB_RD_B LOC="N8"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_MPWE_USB_WR_B LOC="R9"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D0 LOC="P9"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D1 LOC="T8"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D2 LOC="J7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D3 LOC="H7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D4 LOC="R7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D5 LOC="U7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D6 LOC="P7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D7 LOC="P6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D8 LOC="R8"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D9 LOC="L5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D10 LOC="L4"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D11 LOC="K6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D12 LOC="J5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D13 LOC="T6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D14 LOC="K7"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET SYSACE_USB_D15 LOC="J6"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_CLK LOC="AD9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS1E LOC="AK9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS1O LOC="AF10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS2E LOC="AK8"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS2O LOC="AF9"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS3 LOC="AJ11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS4 LOC="AK11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS5 LOC="AD11"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET TRC_TS6 LOC="AD10"; # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET USB_CS_B LOC="P10"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET USB_INT LOC="F5"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET USB_RESET_B LOC="R11"; # Bank 12, Vcco=3.3V, DCI using 49.9 ohm resistors
|
||||
NET USER_CLK LOC="AH15"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE0 LOC="AC4"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE1 LOC="AC5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE2 LOC="AB6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE3 LOC="AB7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE4 LOC="AA5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE5 LOC="AB5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE6 LOC="AC7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_BLUE7 LOC="AD7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_CLAMP LOC="AH7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_COAST LOC="AG7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_DATA_CLK LOC="AH18"; # Bank 4, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN0 LOC="Y8"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN1 LOC="Y9"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN2 LOC="AD4"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN3 LOC="AD5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN4 LOC="AA6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN5 LOC="Y7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN6 LOC="AD6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_GREEN7 LOC="AE6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_HSOUT LOC="AE7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_ODD_EVEN_B LOC="W6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED0 LOC="AG5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED1 LOC="AF5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED2 LOC="W7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED3 LOC="V7"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED4 LOC="AH5"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED5 LOC="AG6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED6 LOC="Y11"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_RED7 LOC="W11"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_SOGOUT LOC="AF6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
NET VGA_IN_VSOUT LOC="Y6"; # Bank 18, Vcco=3.3V, No DCI
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,290 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : ALU.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many changes have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* An Arithmetic Logic Unit for a MIPS32 processor. This module computes all
|
||||
* arithmetic operations, including the following:
|
||||
*
|
||||
* Add, Subtract, Multiply, And, Or, Nor, Xor, Shift, Count leading 1s/0s.
|
||||
*/
|
||||
module ALU(
|
||||
input clock,
|
||||
input reset,
|
||||
input EX_Stall,
|
||||
input EX_Flush,
|
||||
input [31:0] A, B,
|
||||
input [4:0] Operation,
|
||||
input signed [4:0] Shamt,
|
||||
output reg signed [31:0] Result,
|
||||
output BZero, // Used for Movc
|
||||
output reg EXC_Ov,
|
||||
output ALU_Stall // Stalls due to long ALU operations
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
/***
|
||||
Performance Notes:
|
||||
|
||||
The ALU is the longest delay path in the Execute stage, and one of the longest
|
||||
in the entire processor. This path varies based on the logic blocks that are
|
||||
chosen to implement various functions, but there is certainly room to improve
|
||||
the speed of arithmetic operations. The ALU could also be placed in a separate
|
||||
pipeline stage after the Execute forwarding has completed.
|
||||
***/
|
||||
|
||||
|
||||
/***
|
||||
Divider Logic:
|
||||
|
||||
The hardware divider requires 32 cycles to complete. Because it writes its
|
||||
results to HILO and not to the pipeline, the pipeline can proceed without
|
||||
stalling. When a later instruction tries to access HILO, the pipeline will
|
||||
stall if the divide operation has not yet completed.
|
||||
***/
|
||||
|
||||
|
||||
// Internal state registers
|
||||
reg [63:0] HILO;
|
||||
reg HILO_Access; // Behavioral; not DFFs
|
||||
reg [5:0] CLO_Result, CLZ_Result; // Behavioral; not DFFs
|
||||
reg div_fsm;
|
||||
|
||||
// Internal signals
|
||||
wire [31:0] HI, LO;
|
||||
wire HILO_Commit;
|
||||
wire signed [31:0] As, Bs;
|
||||
wire AddSub_Add;
|
||||
wire signed [31:0] AddSub_Result;
|
||||
wire signed [63:0] Mult_Result;
|
||||
wire [63:0] Multu_Result;
|
||||
wire [31:0] Quotient;
|
||||
wire [31:0] Remainder;
|
||||
wire Div_Stall;
|
||||
wire Div_Start, Divu_Start;
|
||||
wire DivOp;
|
||||
wire Div_Commit;
|
||||
|
||||
// Assignments
|
||||
assign HI = HILO[63:32];
|
||||
assign LO = HILO[31:0];
|
||||
assign HILO_Commit = ~(EX_Stall | EX_Flush);
|
||||
assign As = A;
|
||||
assign Bs = B;
|
||||
assign AddSub_Add = ((Operation == AluOp_Add) | (Operation == AluOp_Addu));
|
||||
assign AddSub_Result = (AddSub_Add) ? (A + B) : (A - B);
|
||||
assign Mult_Result = As * Bs;
|
||||
assign Multu_Result = A * B;
|
||||
assign BZero = (B == 32'h00000000);
|
||||
assign DivOp = (Operation == AluOp_Div) || (Operation == AluOp_Divu);
|
||||
assign Div_Commit = (div_fsm == 1'b1) && (Div_Stall == 1'b0);
|
||||
assign Div_Start = (div_fsm == 1'b0) && (Operation == AluOp_Div) && (HILO_Commit == 1'b1);
|
||||
assign Divu_Start = (div_fsm == 1'b0) && (Operation == AluOp_Divu) && (HILO_Commit == 1'b1);
|
||||
assign ALU_Stall = (div_fsm == 1'b1) && (HILO_Access == 1'b1);
|
||||
|
||||
always @(*) begin
|
||||
case (Operation)
|
||||
AluOp_Add : Result <= AddSub_Result;
|
||||
AluOp_Addu : Result <= AddSub_Result;
|
||||
AluOp_And : Result <= A & B;
|
||||
AluOp_Clo : Result <= {26'b0, CLO_Result};
|
||||
AluOp_Clz : Result <= {26'b0, CLZ_Result};
|
||||
AluOp_Mfhi : Result <= HI;
|
||||
AluOp_Mflo : Result <= LO;
|
||||
AluOp_Mul : Result <= Mult_Result[31:0];
|
||||
AluOp_Nor : Result <= ~(A | B);
|
||||
AluOp_Or : Result <= A | B;
|
||||
AluOp_Sll : Result <= B << Shamt;
|
||||
AluOp_Sllc : Result <= {B[15:0], 16'b0};
|
||||
AluOp_Sllv : Result <= B << A[4:0];
|
||||
AluOp_Slt : Result <= (As < Bs) ? 32'h00000001 : 32'h00000000;
|
||||
AluOp_Sltu : Result <= (A < B) ? 32'h00000001 : 32'h00000000;
|
||||
AluOp_Sra : Result <= Bs >>> Shamt;
|
||||
AluOp_Srav : Result <= Bs >>> As[4:0];
|
||||
AluOp_Srl : Result <= B >> Shamt;
|
||||
AluOp_Srlv : Result <= B >> A[4:0];
|
||||
AluOp_Sub : Result <= AddSub_Result;
|
||||
AluOp_Subu : Result <= AddSub_Result;
|
||||
AluOp_Xor : Result <= A ^ B;
|
||||
default : Result <= 32'bx;
|
||||
endcase
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
HILO <= 64'h00000000_00000000;
|
||||
end
|
||||
else if (Div_Commit) begin
|
||||
HILO <= {Remainder, Quotient};
|
||||
end
|
||||
else if (HILO_Commit) begin
|
||||
case (Operation)
|
||||
AluOp_Mult : HILO <= Mult_Result;
|
||||
AluOp_Multu : HILO <= Multu_Result;
|
||||
AluOp_Madd : HILO <= HILO + Mult_Result;
|
||||
AluOp_Maddu : HILO <= HILO + Multu_Result;
|
||||
AluOp_Msub : HILO <= HILO - Mult_Result;
|
||||
AluOp_Msubu : HILO <= HILO - Multu_Result;
|
||||
AluOp_Mthi : HILO <= {A, LO};
|
||||
AluOp_Mtlo : HILO <= {HI, B};
|
||||
default : HILO <= HILO;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
HILO <= HILO;
|
||||
end
|
||||
end
|
||||
|
||||
// Detect accesses to HILO. RAW and WAW hazards are possible while a
|
||||
// divide operation is computing, so reads and writes to HILO must stall
|
||||
// while the divider is busy.
|
||||
// (This logic could be put into an earlier pipeline stage or into the
|
||||
// datapath bits to improve timing.)
|
||||
always @(Operation) begin
|
||||
case (Operation)
|
||||
AluOp_Div : HILO_Access <= 1;
|
||||
AluOp_Divu : HILO_Access <= 1;
|
||||
AluOp_Mfhi : HILO_Access <= 1;
|
||||
AluOp_Mflo : HILO_Access <= 1;
|
||||
AluOp_Mult : HILO_Access <= 1;
|
||||
AluOp_Multu : HILO_Access <= 1;
|
||||
AluOp_Madd : HILO_Access <= 1;
|
||||
AluOp_Maddu : HILO_Access <= 1;
|
||||
AluOp_Msub : HILO_Access <= 1;
|
||||
AluOp_Msubu : HILO_Access <= 1;
|
||||
AluOp_Mthi : HILO_Access <= 1;
|
||||
AluOp_Mtlo : HILO_Access <= 1;
|
||||
default : HILO_Access <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Divider FSM: The divide unit is either available or busy.
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
div_fsm <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
case (div_fsm)
|
||||
1'd0 : div_fsm <= (DivOp & HILO_Commit) ? 1'd1 : 1'd0;
|
||||
1'd1 : div_fsm <= (~Div_Stall) ? 1'd0 : 1'd1;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// Detect overflow for signed operations. Note that MIPS32 has no overflow
|
||||
// detection for multiplication/division operations.
|
||||
always @(*) begin
|
||||
case (Operation)
|
||||
AluOp_Add : EXC_Ov <= ((A[31] ~^ B[31]) & (A[31] ^ AddSub_Result[31]));
|
||||
AluOp_Sub : EXC_Ov <= ((A[31] ^ B[31]) & (A[31] ^ AddSub_Result[31]));
|
||||
default : EXC_Ov <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Count Leading Ones
|
||||
always @(A) begin
|
||||
casex (A)
|
||||
32'b0xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd0;
|
||||
32'b10xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd1;
|
||||
32'b110x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd2;
|
||||
32'b1110_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd3;
|
||||
32'b1111_0xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd4;
|
||||
32'b1111_10xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd5;
|
||||
32'b1111_110x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd6;
|
||||
32'b1111_1110_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd7;
|
||||
32'b1111_1111_0xxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd8;
|
||||
32'b1111_1111_10xx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd9;
|
||||
32'b1111_1111_110x_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd10;
|
||||
32'b1111_1111_1110_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd11;
|
||||
32'b1111_1111_1111_0xxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd12;
|
||||
32'b1111_1111_1111_10xx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd13;
|
||||
32'b1111_1111_1111_110x_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd14;
|
||||
32'b1111_1111_1111_1110_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd15;
|
||||
32'b1111_1111_1111_1111_0xxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd16;
|
||||
32'b1111_1111_1111_1111_10xx_xxxx_xxxx_xxxx : CLO_Result <= 6'd17;
|
||||
32'b1111_1111_1111_1111_110x_xxxx_xxxx_xxxx : CLO_Result <= 6'd18;
|
||||
32'b1111_1111_1111_1111_1110_xxxx_xxxx_xxxx : CLO_Result <= 6'd19;
|
||||
32'b1111_1111_1111_1111_1111_0xxx_xxxx_xxxx : CLO_Result <= 6'd20;
|
||||
32'b1111_1111_1111_1111_1111_10xx_xxxx_xxxx : CLO_Result <= 6'd21;
|
||||
32'b1111_1111_1111_1111_1111_110x_xxxx_xxxx : CLO_Result <= 6'd22;
|
||||
32'b1111_1111_1111_1111_1111_1110_xxxx_xxxx : CLO_Result <= 6'd23;
|
||||
32'b1111_1111_1111_1111_1111_1111_0xxx_xxxx : CLO_Result <= 6'd24;
|
||||
32'b1111_1111_1111_1111_1111_1111_10xx_xxxx : CLO_Result <= 6'd25;
|
||||
32'b1111_1111_1111_1111_1111_1111_110x_xxxx : CLO_Result <= 6'd26;
|
||||
32'b1111_1111_1111_1111_1111_1111_1110_xxxx : CLO_Result <= 6'd27;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_0xxx : CLO_Result <= 6'd28;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_10xx : CLO_Result <= 6'd29;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_110x : CLO_Result <= 6'd30;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_1110 : CLO_Result <= 6'd31;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_1111 : CLO_Result <= 6'd32;
|
||||
default : CLO_Result <= 6'd0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Count Leading Zeros
|
||||
always @(A) begin
|
||||
casex (A)
|
||||
32'b1xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd0;
|
||||
32'b01xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd1;
|
||||
32'b001x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd2;
|
||||
32'b0001_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd3;
|
||||
32'b0000_1xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd4;
|
||||
32'b0000_01xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd5;
|
||||
32'b0000_001x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd6;
|
||||
32'b0000_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd7;
|
||||
32'b0000_0000_1xxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd8;
|
||||
32'b0000_0000_01xx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd9;
|
||||
32'b0000_0000_001x_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd10;
|
||||
32'b0000_0000_0001_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd11;
|
||||
32'b0000_0000_0000_1xxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd12;
|
||||
32'b0000_0000_0000_01xx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd13;
|
||||
32'b0000_0000_0000_001x_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd14;
|
||||
32'b0000_0000_0000_0001_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd15;
|
||||
32'b0000_0000_0000_0000_1xxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd16;
|
||||
32'b0000_0000_0000_0000_01xx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd17;
|
||||
32'b0000_0000_0000_0000_001x_xxxx_xxxx_xxxx : CLZ_Result <= 6'd18;
|
||||
32'b0000_0000_0000_0000_0001_xxxx_xxxx_xxxx : CLZ_Result <= 6'd19;
|
||||
32'b0000_0000_0000_0000_0000_1xxx_xxxx_xxxx : CLZ_Result <= 6'd20;
|
||||
32'b0000_0000_0000_0000_0000_01xx_xxxx_xxxx : CLZ_Result <= 6'd21;
|
||||
32'b0000_0000_0000_0000_0000_001x_xxxx_xxxx : CLZ_Result <= 6'd22;
|
||||
32'b0000_0000_0000_0000_0000_0001_xxxx_xxxx : CLZ_Result <= 6'd23;
|
||||
32'b0000_0000_0000_0000_0000_0000_1xxx_xxxx : CLZ_Result <= 6'd24;
|
||||
32'b0000_0000_0000_0000_0000_0000_01xx_xxxx : CLZ_Result <= 6'd25;
|
||||
32'b0000_0000_0000_0000_0000_0000_001x_xxxx : CLZ_Result <= 6'd26;
|
||||
32'b0000_0000_0000_0000_0000_0000_0001_xxxx : CLZ_Result <= 6'd27;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_1xxx : CLZ_Result <= 6'd28;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_01xx : CLZ_Result <= 6'd29;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_001x : CLZ_Result <= 6'd30;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_0001 : CLZ_Result <= 6'd31;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_0000 : CLZ_Result <= 6'd32;
|
||||
default : CLZ_Result <= 6'd0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Multicycle divide unit
|
||||
Divide Divider (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.OP_div (Div_Start),
|
||||
.OP_divu (Divu_Start),
|
||||
.Dividend (A),
|
||||
.Divisor (B),
|
||||
.Quotient (Quotient),
|
||||
.Remainder (Remainder),
|
||||
.Stall (Div_Stall)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Add.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A simple 32-bit 2-input adder.
|
||||
*/
|
||||
module Add(
|
||||
input [31:0] A,
|
||||
input [31:0] B,
|
||||
output [31:0] C
|
||||
);
|
||||
|
||||
assign C = (A + B);
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,529 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : CPZero.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 16-Sep-2011 GEA Initial design.
|
||||
* 2.0 14-May-2012 GEA Complete rework.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The MIPS-32 Coprocessor 0 (CP0). This is the processor management unit that allows
|
||||
* interrupts, traps, system calls, and other exceptions. It distinguishes
|
||||
* user and kernel modes, provides status information, and can override program
|
||||
* flow. This processor is designed for "bare metal" memory access and thus does
|
||||
* not have virtual memory hardware as a part of it. However, the subset of CP0
|
||||
* is MIPS-32-compliant.
|
||||
*/
|
||||
module CPZero(
|
||||
input clock,
|
||||
//-- CP0 Functionality --//
|
||||
input Mfc0, // CPU instruction is Mfc0
|
||||
input Mtc0, // CPU instruction is Mtc0
|
||||
input IF_Stall,
|
||||
input ID_Stall, // Commits are not made during stalls
|
||||
input COP1, // Instruction for Coprocessor 1
|
||||
input COP2, // Instruction for Coprocessor 2
|
||||
input COP3, // Instruction for Coprocessor 3
|
||||
input ERET, // Instruction is ERET (Exception Return)
|
||||
input [4:0] Rd, // Specifies Cp0 register
|
||||
input [2:0] Sel, // Specifies Cp0 'select'
|
||||
input [31:0] Reg_In, // Data from GP register to replace CP0 register
|
||||
output reg [31:0] Reg_Out, // Data from CP0 register for GP register
|
||||
output KernelMode, // Kernel mode indicator for pipeline transit
|
||||
output ReverseEndian, // Reverse Endian memory indicator for User Mode
|
||||
//-- Hw Interrupts --//
|
||||
input [4:0] Int, // Five hardware interrupts external to the processor
|
||||
//-- Exceptions --//
|
||||
input reset, // Cold Reset (EXC_Reset)
|
||||
// input EXC_SReset, // Soft Reset (not implemented)
|
||||
input EXC_NMI, // Non-Maskable Interrupt
|
||||
input EXC_AdIF, // Address Error Exception from i-fetch (mapped to AdEL)
|
||||
input EXC_AdEL, // Address Error Exception from data memory load
|
||||
input EXC_AdES, // Address Error Exception from data memory store
|
||||
input EXC_Ov, // Integer Overflow Exception
|
||||
input EXC_Tr, // Trap Exception
|
||||
input EXC_Sys, // System Call Exception
|
||||
input EXC_Bp, // Breakpoint Exception
|
||||
input EXC_RI, // Reserved Instruction Exception
|
||||
//-- Exception Data --//
|
||||
input [31:0] ID_RestartPC, // PC for exception, whether PC of instruction or of branch (PC-4) if BDS
|
||||
input [31:0] EX_RestartPC, // Same as 'ID_RestartPC' but in EX stage
|
||||
input [31:0] M_RestartPC, // Same as 'ID_RestartPC' but in MEM stage
|
||||
input ID_IsFlushed,
|
||||
input IF_IsBD, // Indicator of IF exception being a branch delay slot instruction
|
||||
input ID_IsBD, // Indicator of ID exception being a branch delay slot instruction
|
||||
input EX_IsBD, // Indicator of EX exception being a branch delay slot instruction
|
||||
input M_IsBD, // Indicator of M exception being a branch delay slot instruction
|
||||
input [31:0] BadAddr_M, // Bad 'Virtual' Address for exceptions AdEL, AdES in MEM stage
|
||||
input [31:0] BadAddr_IF, // Bad 'Virtual' Address for AdIF (i.e. AdEL) in IF stage
|
||||
input ID_CanErr, // Cumulative signal, i.e. (ID_ID_CanErr | ID_EX_CanErr | ID_M_CanErr)
|
||||
input EX_CanErr, // Cumulative signal, i.e. (EX_EX_CanErr | EX_M_CanErr)
|
||||
input M_CanErr, // Memory stage can error (i.e. cause exception)
|
||||
//-- Exception Control Flow --/
|
||||
output IF_Exception_Stall,
|
||||
output ID_Exception_Stall,
|
||||
output EX_Exception_Stall,
|
||||
output M_Exception_Stall,
|
||||
output IF_Exception_Flush,
|
||||
output ID_Exception_Flush,
|
||||
output EX_Exception_Flush,
|
||||
output M_Exception_Flush,
|
||||
output Exc_PC_Sel, // Mux selector for exception PC override
|
||||
output reg [31:0] Exc_PC_Out, // Address for PC at the beginning of an exception
|
||||
output [7:0] IP // Pending Interrupts from Cause register (for diagnostic purposes)
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
|
||||
/***
|
||||
Exception Control Flow Notes
|
||||
|
||||
- Exceptions can occur in every pipeline stage. This implies that more than one exception
|
||||
can be raised in a single cycle. When this occurs, only the forward-most exception
|
||||
(i.e. MEM over EX) is handled. This and the following note guarantee program order.
|
||||
|
||||
- An exception in any pipeline stage must stall that stage until all following stages are
|
||||
exception-free. This is because it only makes sense for exceptions to occur in program order.
|
||||
|
||||
- A pipeline stage which causes an exception must flush, i.e. prevent any commits it would
|
||||
have normally made and convert itself to a NOP for the next pipeline stage. Furthermore,
|
||||
it must flush all previous pipeline stages as well in order to retain program order.
|
||||
|
||||
- Instructions reading CP0 (mtc0) read in ID without further action. Writes to CP0 (mtc0,
|
||||
eret) also write in ID, but only after forward pipeline stages have been cleared
|
||||
of possible exceptions. This prevents many insidious bugs, such as switching to User Mode
|
||||
in ID when a legitimate memory access in kernel mode is processing in MEM, or conversely
|
||||
a switch to Kernel Mode in ID when an instruction in User Mode is attempting a kernel region
|
||||
memory access (when a kernel mode signal does not propagate through the pipeline).
|
||||
|
||||
- Commits occur in ID (CP0), EX (HILO), MEM, and WB (registers).
|
||||
|
||||
- Hardware interrupts are detected and inserted in the ID stage, but only when there are no
|
||||
other possible exceptions in the pipeline. Because they appear 'asynchronous' to the
|
||||
processor, the remaining instructions in forward stages (EX, MEM, WB) can either be
|
||||
flushed or completed. It is simplest to have them complete to avoid restarts, but the
|
||||
interrupt latency is higher if e.g. the MEM stage stalls on a memory access (this would
|
||||
be unavoidable on single-cycle processors). This implementation allows all forward instructions
|
||||
to complete, for a greater instruction throughput but higher interrupt latency.
|
||||
|
||||
- Software interrupts should appear synchronous in the program order, meaning that all
|
||||
instructions previous to them should complete and no instructions after them should start
|
||||
until the interrupts has been processed.
|
||||
|
||||
Exception Name Short Name Pipeline Stage
|
||||
Address Error Ex (AdEL, AdES) MEM, IF
|
||||
Integer Overflow Ex (Ov) EX
|
||||
Trap Ex (Tr) MEM
|
||||
Syscall (Sys) ID
|
||||
Breakpoint (Bp) ID
|
||||
Reserved Instruction (RI) ID
|
||||
Coprocessor Unusable (CpU) ID
|
||||
Interrupt (Int) ID
|
||||
Reset, SReset, NMI ID
|
||||
***/
|
||||
|
||||
|
||||
// Exceptions Generated Internally
|
||||
wire EXC_CpU;
|
||||
|
||||
// Hardware Interrupt #5, caused by Timer/Perf counter
|
||||
wire Int5;
|
||||
|
||||
// Top-level Authoritative Interrupt Signal
|
||||
wire EXC_Int;
|
||||
|
||||
// General Exception detection (all but Interrupts, Reset, Soft Reset, and NMI)
|
||||
wire EXC_General = EXC_AdIF | EXC_AdEL | EXC_AdES | EXC_Ov | EXC_Tr | EXC_Sys | EXC_Bp | EXC_RI | EXC_CpU;
|
||||
|
||||
// Misc
|
||||
wire CP0_WriteCond;
|
||||
reg [3:0] Cause_ExcCode_bits;
|
||||
|
||||
reg reset_r;
|
||||
always @(posedge clock) begin
|
||||
reset_r <= reset;
|
||||
end
|
||||
|
||||
/***
|
||||
MIPS-32 COPROCESSOR 0 (Cp0) REGISTERS
|
||||
|
||||
These are defined in "MIPS32 Architecture for Programmers Volume III:
|
||||
The MIPS32 Privileged Resource Architecture" from MIPS Technologies, Inc.
|
||||
|
||||
Optional registers are omitted. Changes to the processor (such as adding
|
||||
an MMU/TLB, etc. must be reflected in these registers.
|
||||
*/
|
||||
|
||||
// BadVAddr Register (Register 8, Select 0)
|
||||
reg [31:0] BadVAddr;
|
||||
|
||||
// Count Register (Register 9, Select 0)
|
||||
reg [31:0] Count;
|
||||
|
||||
// Compare Register (Register 11, Select 0)
|
||||
reg [31:0] Compare;
|
||||
|
||||
// Status Register (Register 12, Select 0)
|
||||
wire [2:0] Status_CU_321 = 3'b000;
|
||||
reg Status_CU_0; // Access Control to CPs, [2]->Cp3, ... [0]->Cp0
|
||||
wire Status_RP = 0;
|
||||
wire Status_FR = 0;
|
||||
reg Status_RE; // Reverse Endian Memory for User Mode
|
||||
wire Status_MX = 0;
|
||||
wire Status_PX = 0;
|
||||
reg Status_BEV; // Exception vector locations (0->Norm, 1->Bootstrap)
|
||||
wire Status_TS = 0;
|
||||
wire Status_SR = 0; // Soft reset not implemented
|
||||
reg Status_NMI; // Non-Maskable Interrupt
|
||||
wire Status_RES = 0;
|
||||
wire [1:0] Status_Custom = 2'b00;
|
||||
reg [7:0] Status_IM; // Interrupt mask
|
||||
wire Status_KX = 0;
|
||||
wire Status_SX = 0;
|
||||
wire Status_UX = 0;
|
||||
reg Status_UM; // Base operating mode (0->Kernel, 1->User)
|
||||
wire Status_R0 = 0;
|
||||
reg Status_ERL; // Error Level (0->Normal, 1->Error (reset, NMI))
|
||||
reg Status_EXL; // Exception level (0->Normal, 1->Exception)
|
||||
reg Status_IE; // Interrupt Enable
|
||||
wire [31:0] Status = {Status_CU_321, Status_CU_0, Status_RP, Status_FR, Status_RE, Status_MX,
|
||||
Status_PX, Status_BEV, Status_TS, Status_SR, Status_NMI, Status_RES,
|
||||
Status_Custom, Status_IM, Status_KX, Status_SX, Status_UX,
|
||||
Status_UM, Status_R0, Status_ERL, Status_EXL, Status_IE};
|
||||
|
||||
// Cause Register (Register 13, Select 0)
|
||||
reg Cause_BD; // Exception occured in Branch Delay
|
||||
reg [1:0] Cause_CE; // CP number for CP Unusable exception
|
||||
reg Cause_IV; // Indicator of general IV (0->0x180) or special IV (1->0x200)
|
||||
wire Cause_WP = 0;
|
||||
reg [7:0] Cause_IP; // Pending HW Interrupt indicator.
|
||||
wire Cause_ExcCode4 = 0; // Can be made into a register when this bit is needed.
|
||||
reg [3:0] Cause_ExcCode30; // Description of Exception (only lower 4 bits currently used; see above)
|
||||
wire [31:0] Cause = {Cause_BD, 1'b0, Cause_CE, 4'b0000, Cause_IV, Cause_WP,
|
||||
6'b000000, Cause_IP, 1'b0, Cause_ExcCode4, Cause_ExcCode30, 2'b00};
|
||||
|
||||
// Exception Program Counter (Register 14, Select 0)
|
||||
reg [31:0] EPC;
|
||||
|
||||
// Processor Identification (Register 15, Select 0)
|
||||
wire [7:0] ID_Options = 8'b0000_0000;
|
||||
wire [7:0] ID_CID = 8'b0000_0000;
|
||||
wire [7:0] ID_PID = 8'b0000_0000;
|
||||
wire [7:0] ID_Rev = 8'b0000_0001;
|
||||
wire [31:0] PRId = {ID_Options, ID_CID, ID_PID, ID_Rev};
|
||||
|
||||
// Configuration Register (Register 16, Select 0)
|
||||
wire Config_M = 1;
|
||||
wire [14:0] Config_Impl = 15'b000_0000_0000_0000;
|
||||
wire Config_BE = Big_Endian; // From parameters file
|
||||
wire [1:0] Config_AT = 2'b00;
|
||||
wire [2:0] Config_AR = 3'b000;
|
||||
wire [2:0] Config_MT = 3'b000;
|
||||
wire [2:0] Config_K0 = 3'b000;
|
||||
wire [31:0] Config = {Config_M, Config_Impl, Config_BE, Config_AT, Config_AR, Config_MT,
|
||||
4'b0000, Config_K0};
|
||||
|
||||
// Configuration Register 1 (Register 16, Select 1)
|
||||
wire Config1_M = 0;
|
||||
wire [5:0] Config1_MMU = 6'b000000;
|
||||
wire [2:0] Config1_IS = 3'b000;
|
||||
wire [2:0] Config1_IL = 3'b000;
|
||||
wire [2:0] Config1_IA = 3'b000;
|
||||
wire [2:0] Config1_DS = 3'b000;
|
||||
wire [2:0] Config1_DL = 3'b000;
|
||||
wire [2:0] Config1_DA = 3'b000;
|
||||
wire Config1_C2 = 0;
|
||||
wire Config1_MD = 0;
|
||||
wire Config1_PC = 0; // XXX Performance Counters
|
||||
wire Config1_WR = 0; // XXX Watch Registers
|
||||
wire Config1_CA = 0;
|
||||
wire Config1_EP = 0;
|
||||
wire Config1_FP = 0;
|
||||
wire [31:0] Config1 = {Config1_M, Config1_MMU, Config1_IS, Config1_IL, Config1_IA,
|
||||
Config1_DS, Config1_DL, Config1_DA, Config1_C2,
|
||||
Config1_MD, Config1_PC, Config1_WR, Config1_CA,
|
||||
Config1_EP, Config1_FP};
|
||||
|
||||
// Performance Counter Register (Register 25) XXX TODO
|
||||
|
||||
// ErrorEPC Register (Register 30, Select 0)
|
||||
reg [31:0] ErrorEPC;
|
||||
|
||||
// Exception Detection and Processing
|
||||
wire M_Exception_Detect, EX_Exception_Detect, ID_Exception_Detect, IF_Exception_Detect;
|
||||
wire M_Exception_Mask, EX_Exception_Mask, ID_Exception_Mask, IF_Exception_Mask;
|
||||
wire M_Exception_Ready, EX_Exception_Ready, ID_Exception_Ready, IF_Exception_Ready;
|
||||
|
||||
assign IP = Cause_IP;
|
||||
|
||||
/*** Coprocessor Unusable Exception ***/
|
||||
assign EXC_CpU = COP1 | COP2 | COP3 | ((Mtc0 | Mfc0 | ERET) & ~(Status_CU_0 | KernelMode));
|
||||
|
||||
/*** Kernel Mode Signal ***/
|
||||
assign KernelMode = ~Status_UM | Status_EXL | Status_ERL;
|
||||
|
||||
/*** Reverse Endian for User Mode ***/
|
||||
assign ReverseEndian = Status_RE;
|
||||
|
||||
/*** Interrupts ***/
|
||||
assign Int5 = (Count == Compare);
|
||||
//assign EXC_Int = ((Cause_IP[7:0] & Status_IM[7:0]) != 8'h00) & Status_IE & ~Status_EXL & ~Status_ERL & ~ID_IsFlushed;
|
||||
wire Enabled_Interrupt = EXC_NMI | (Status_IE & ((Cause_IP[7:0] & Status_IM[7:0]) != 8'h00));
|
||||
assign EXC_Int = Enabled_Interrupt & ~Status_EXL & ~Status_ERL & ~ID_IsFlushed;
|
||||
|
||||
assign CP0_WriteCond = (Status_CU_0 | KernelMode) & Mtc0 & ~ID_Stall;
|
||||
|
||||
|
||||
/***
|
||||
Exception Hazard Flow Control Explanation:
|
||||
- An exception at any time in any stage causes its own and any previous stages to
|
||||
flush (clear own commits, NOPS to fwd stages).
|
||||
- An exception in a stage can also stall that stage (and inherently all previous stages) if and only if:
|
||||
1. A forward stage is capable of causing an exception AND
|
||||
2. A forward stage is not currently causing an exception.
|
||||
- An exception is ready to process when it is detected and not stalled in a stage.
|
||||
|
||||
Flush specifics per pipeline stage:
|
||||
MEM: Mask 'MemWrite' and 'MemRead' (for performance) after EX/M and before data memory. NOPs to M/WB.
|
||||
EX : Mask writes to HI/LO. NOPs to EX/M.
|
||||
ID : Mask writes (reads?) to CP0. NOPs to ID/EX.
|
||||
IF : NOP to IF/ID.
|
||||
***/
|
||||
|
||||
/*** Exceptions grouped by pipeline stage ***/
|
||||
assign M_Exception_Detect = EXC_AdEL | EXC_AdES | EXC_Tr;
|
||||
assign EX_Exception_Detect = EXC_Ov;
|
||||
assign ID_Exception_Detect = EXC_Sys | EXC_Bp | EXC_RI | EXC_CpU | EXC_Int;
|
||||
assign IF_Exception_Detect = EXC_AdIF;
|
||||
|
||||
/*** Exception mask conditions ***/
|
||||
|
||||
// A potential bug would occur if e.g. EX stalls, MEM has data, but MEM is not stalled and finishes
|
||||
// going through the pipeline so forwarding would fail. This is not a problem however because
|
||||
// EX would not need data since it would flush on an exception.
|
||||
assign M_Exception_Mask = IF_Stall;
|
||||
assign EX_Exception_Mask = IF_Stall | M_CanErr;
|
||||
assign ID_Exception_Mask = IF_Stall | M_CanErr | EX_CanErr;
|
||||
assign IF_Exception_Mask = M_CanErr | EX_CanErr | ID_CanErr | EXC_Int;
|
||||
|
||||
/***
|
||||
Exceptions which must wait for forward stages. A stage will not stall if a forward stage has an exception.
|
||||
These stalls must be inserted as stall conditions in the hazard unit so that it will take care of chaining.
|
||||
All writes to CP0 must also wait for forward hazard conditions to clear.
|
||||
*/
|
||||
assign M_Exception_Stall = M_Exception_Detect & M_Exception_Mask;
|
||||
assign EX_Exception_Stall = EX_Exception_Detect & EX_Exception_Mask & ~M_Exception_Detect;
|
||||
assign ID_Exception_Stall = (ID_Exception_Detect | ERET | Mtc0) & ID_Exception_Mask & ~(EX_Exception_Detect | M_Exception_Detect);
|
||||
assign IF_Exception_Stall = IF_Exception_Detect & IF_Exception_Mask & ~(ID_Exception_Detect | EX_Exception_Detect | M_Exception_Detect);
|
||||
|
||||
|
||||
/*** Exceptions which are ready to process (mutually exclusive) ***/
|
||||
// XXX can remove ~ID_Stall since in mask now (?)
|
||||
assign M_Exception_Ready = ~ID_Stall & M_Exception_Detect & ~M_Exception_Mask;
|
||||
assign EX_Exception_Ready = ~ID_Stall & EX_Exception_Detect & ~EX_Exception_Mask;
|
||||
assign ID_Exception_Ready = ~ID_Stall & ID_Exception_Detect & ~ID_Exception_Mask;
|
||||
assign IF_Exception_Ready = ~ID_Stall & IF_Exception_Detect & ~IF_Exception_Mask;
|
||||
|
||||
/***
|
||||
Flushes. A flush clears a pipeline stage's control signals and prevents the stage from committing any changes.
|
||||
Data such as 'RestartPC' and the detected exception must remain.
|
||||
*/
|
||||
assign M_Exception_Flush = M_Exception_Detect;
|
||||
assign EX_Exception_Flush = M_Exception_Detect | EX_Exception_Detect;
|
||||
assign ID_Exception_Flush = M_Exception_Detect | EX_Exception_Detect | ID_Exception_Detect;
|
||||
assign IF_Exception_Flush = M_Exception_Detect | EX_Exception_Detect | ID_Exception_Detect | IF_Exception_Detect | (ERET & ~ID_Stall) | reset_r;
|
||||
|
||||
|
||||
/*** Software reads of CP0 Registers ***/
|
||||
always @(*) begin
|
||||
if (Mfc0 & (Status_CU_0 | KernelMode)) begin
|
||||
case (Rd)
|
||||
5'd8 : Reg_Out <= BadVAddr;
|
||||
5'd9 : Reg_Out <= Count;
|
||||
5'd11 : Reg_Out <= Compare;
|
||||
5'd12 : Reg_Out <= Status;
|
||||
5'd13 : Reg_Out <= Cause;
|
||||
5'd14 : Reg_Out <= EPC;
|
||||
5'd15 : Reg_Out <= PRId;
|
||||
5'd16 : Reg_Out <= (Sel == 3'b000) ? Config : Config1;
|
||||
5'd30 : Reg_Out <= ErrorEPC;
|
||||
default : Reg_Out <= 32'h0000_0000;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
Reg_Out <= 32'h0000_0000;
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: Non-general exceptions (Reset, Soft Reset, NMI...) ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Status_BEV <= 1;
|
||||
Status_NMI <= 0;
|
||||
Status_ERL <= 1;
|
||||
ErrorEPC <= 32'b0;
|
||||
end
|
||||
else if (ID_Exception_Ready & EXC_NMI) begin
|
||||
Status_BEV <= 1;
|
||||
Status_NMI <= 1;
|
||||
Status_ERL <= 1;
|
||||
ErrorEPC <= ID_RestartPC;
|
||||
end
|
||||
else begin
|
||||
Status_BEV <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[22] : Status_BEV;
|
||||
Status_NMI <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[19] : Status_NMI;
|
||||
Status_ERL <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[2] : ((Status_ERL & ERET & ~ID_Stall) ? 0 : Status_ERL);
|
||||
ErrorEPC <= (CP0_WriteCond & (Rd == 5'd30) & (Sel == 3'b000)) ? Reg_In : ErrorEPC;
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: All other registers ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Count <= 32'b0;
|
||||
Compare <= 32'b0;
|
||||
Status_CU_0 <= 0;
|
||||
Status_RE <= 0;
|
||||
Status_IM <= 8'b0;
|
||||
Status_UM <= 0;
|
||||
Status_IE <= 0;
|
||||
Cause_IV <= 0;
|
||||
Cause_IP <= 8'b0;
|
||||
end
|
||||
else begin
|
||||
Count <= (CP0_WriteCond & (Rd == 5'd9 ) & (Sel == 3'b000)) ? Reg_In : ((Count == Compare) ? 32'b0 : Count + 1);
|
||||
Compare <= (CP0_WriteCond & (Rd == 5'd11) & (Sel == 3'b000)) ? Reg_In : Compare;
|
||||
Status_CU_0 <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[28] : Status_CU_0;
|
||||
Status_RE <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[25] : Status_RE;
|
||||
Status_IM <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[15:8] : Status_IM;
|
||||
Status_UM <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[4] : Status_UM;
|
||||
Status_IE <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[0] : Status_IE;
|
||||
Cause_IV <= (CP0_WriteCond & (Rd == 5'd13) & (Sel == 3'b000)) ? Reg_In[23] : Cause_IV;
|
||||
/* Cause_IP indicates 8 interrupts:
|
||||
[7] is set by the timer comparison, and cleared by reading 'Count'.
|
||||
[6:2] are set and cleared by external hardware.
|
||||
[1:0] are set and cleared by software.
|
||||
*/
|
||||
// If reading -> 0, Otherwise if 0 -> Int5.
|
||||
Cause_IP[7] <= ((Status_CU_0 | KernelMode) & Mfc0 & (Rd == 5'd9) & (Sel == 3'b000)) ? 0 : ((Cause_IP[7] == 0) ? Int5 : Cause_IP[7]);
|
||||
Cause_IP[6:2] <= Int[4:0];
|
||||
Cause_IP[1:0] <= (CP0_WriteCond & (Rd == 5'd13) & (Sel == 3'b000)) ? Reg_In[9:8] : Cause_IP[1:0];
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: General Exception and Interrupt Processing ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Cause_BD <= 0;
|
||||
Cause_CE <= 2'b00;
|
||||
Cause_ExcCode30 <= 4'b0000;
|
||||
Status_EXL <= 0;
|
||||
EPC <= 32'h0;
|
||||
BadVAddr <= 32'h0;
|
||||
end
|
||||
else begin
|
||||
// MEM stage
|
||||
if (M_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : M_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : M_RestartPC;
|
||||
BadVAddr <= BadAddr_M;
|
||||
end
|
||||
// EX stage
|
||||
else if (EX_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : EX_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : EX_RestartPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
// ID stage
|
||||
else if (ID_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : ID_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : ID_RestartPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
// IF stage
|
||||
else if (IF_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : IF_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : BadAddr_IF;
|
||||
BadVAddr <= BadAddr_IF;
|
||||
end
|
||||
// No exceptions this cycle
|
||||
else begin
|
||||
Cause_BD <= 1'b0;
|
||||
Cause_CE <= Cause_CE;
|
||||
Cause_ExcCode30 <= Cause_ExcCode30;
|
||||
// Without new exceptions, 'Status_EXL' is set by software or cleared by ERET.
|
||||
Status_EXL <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[1] : ((Status_EXL & ERET & ~ID_Stall) ? 0 : Status_EXL);
|
||||
// The EPC is also writable by software
|
||||
EPC <= (CP0_WriteCond & (Rd == 5'd14) & (Sel == 3'b000)) ? Reg_In : EPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
/*** Program Counter for all Exceptions/Interrupts ***/
|
||||
always @(*) begin
|
||||
// Following is redundant since PC has initial value now.
|
||||
if (reset) begin
|
||||
Exc_PC_Out <= EXC_Vector_Base_Reset;
|
||||
end
|
||||
else if (ERET & ~ID_Stall) begin
|
||||
Exc_PC_Out <= (Status_ERL) ? ErrorEPC : EPC;
|
||||
end
|
||||
else if (EXC_General) begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_General) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_General);
|
||||
end
|
||||
else if (EXC_NMI) begin
|
||||
Exc_PC_Out <= EXC_Vector_Base_Reset;
|
||||
end
|
||||
else if (EXC_Int & Cause_IV) begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_Special) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_Special);
|
||||
end
|
||||
else begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_General) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_General);
|
||||
end
|
||||
end
|
||||
|
||||
//assign Exc_PC_Sel = (reset | (ERET & ~ID_Stall) | EXC_General | EXC_Int);
|
||||
assign Exc_PC_Sel = reset | (ERET & ~ID_Stall) | IF_Exception_Ready | ID_Exception_Ready | EX_Exception_Ready | M_Exception_Ready;
|
||||
|
||||
/*** Cause Register ExcCode Field ***/
|
||||
always @(*) begin
|
||||
// Ordered by Pipeline Stage with Interrupts last
|
||||
if (EXC_AdEL) Cause_ExcCode_bits <= 4'h4; // 00100
|
||||
else if (EXC_AdES) Cause_ExcCode_bits <= 4'h5; // 00101
|
||||
else if (EXC_Tr) Cause_ExcCode_bits <= 4'hd; // 01101
|
||||
else if (EXC_Ov) Cause_ExcCode_bits <= 4'hc; // 01100
|
||||
else if (EXC_Sys) Cause_ExcCode_bits <= 4'h8; // 01000
|
||||
else if (EXC_Bp) Cause_ExcCode_bits <= 4'h9; // 01001
|
||||
else if (EXC_RI) Cause_ExcCode_bits <= 4'ha; // 01010
|
||||
else if (EXC_CpU) Cause_ExcCode_bits <= 4'hb; // 01011
|
||||
else if (EXC_AdIF) Cause_ExcCode_bits <= 4'h4; // 00100
|
||||
else if (EXC_Int) Cause_ExcCode_bits <= 4'h0; // 00000 // OK that NMI writes this.
|
||||
else Cause_ExcCode_bits <= 4'bxxxx;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Compare.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 15-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Compares two 32-bit values and outputs the following information about them:
|
||||
* EQ : A and B are equal
|
||||
* GZ : A is greater than zero
|
||||
* LZ : A is less than zero
|
||||
* GEZ : A is greater than or equal to zero
|
||||
* LEZ : A is less than or equal to zero
|
||||
*/
|
||||
module Compare(
|
||||
input [31:0] A,
|
||||
input [31:0] B,
|
||||
output EQ,
|
||||
output GZ,
|
||||
output LZ,
|
||||
output GEZ,
|
||||
output LEZ
|
||||
);
|
||||
|
||||
wire ZeroA = (A == 32'b0);
|
||||
|
||||
assign EQ = ( A == B);
|
||||
assign GZ = (~A[31] & ~ZeroA);
|
||||
assign LZ = A[31];
|
||||
assign GEZ = ~A[31];
|
||||
assign LEZ = ( A[31] | ZeroA);
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,509 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Control.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Datapath Controller. This module sets the datapath control
|
||||
* bits for an incoming instruction. These control bits follow the
|
||||
* instruction through each pipeline stage as needed, and constitute
|
||||
* the effective operation of the processor through each pipeline stage.
|
||||
*/
|
||||
module Control(
|
||||
input ID_Stall,
|
||||
input [5:0] OpCode,
|
||||
input [5:0] Funct,
|
||||
input [4:0] Rs, // used to differentiate mfc0 and mtc0
|
||||
input [4:0] Rt, // used to differentiate bgez,bgezal,bltz,bltzal,teqi,tgei,tgeiu,tlti,tltiu,tnei
|
||||
input Cmp_EQ,
|
||||
input Cmp_GZ,
|
||||
input Cmp_GEZ,
|
||||
input Cmp_LZ,
|
||||
input Cmp_LEZ,
|
||||
//------------
|
||||
output IF_Flush,
|
||||
output reg [7:0] DP_Hazards,
|
||||
output [1:0] PCSrc,
|
||||
output SignExtend,
|
||||
output Link,
|
||||
output Movn,
|
||||
output Movz,
|
||||
output Mfc0,
|
||||
output Mtc0,
|
||||
output CP1,
|
||||
output CP2,
|
||||
output CP3,
|
||||
output Eret,
|
||||
output Trap,
|
||||
output TrapCond,
|
||||
output EXC_Sys,
|
||||
output EXC_Bp,
|
||||
output EXC_RI,
|
||||
output ID_CanErr,
|
||||
output EX_CanErr,
|
||||
output M_CanErr,
|
||||
output NextIsDelay,
|
||||
output RegDst,
|
||||
output ALUSrcImm,
|
||||
output reg [4:0] ALUOp,
|
||||
output LLSC,
|
||||
output MemWrite,
|
||||
output MemRead,
|
||||
output MemByte,
|
||||
output MemHalf,
|
||||
output MemSignExtend,
|
||||
output Left,
|
||||
output Right,
|
||||
output RegWrite,
|
||||
output MemtoReg
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
wire Movc;
|
||||
wire Branch, Branch_EQ, Branch_GTZ, Branch_LEZ, Branch_NEQ, Branch_GEZ, Branch_LTZ;
|
||||
wire Unaligned_Mem;
|
||||
|
||||
reg [15:0] Datapath;
|
||||
assign PCSrc[0] = Datapath[14];
|
||||
assign Link = Datapath[13];
|
||||
assign ALUSrcImm = Datapath[12];
|
||||
assign Movc = Datapath[11];
|
||||
assign Trap = Datapath[10];
|
||||
assign TrapCond = Datapath[9];
|
||||
assign RegDst = Datapath[8];
|
||||
assign LLSC = Datapath[7];
|
||||
assign MemRead = Datapath[6];
|
||||
assign MemWrite = Datapath[5];
|
||||
assign MemHalf = Datapath[4];
|
||||
assign MemByte = Datapath[3];
|
||||
assign MemSignExtend = Datapath[2];
|
||||
assign RegWrite = Datapath[1];
|
||||
assign MemtoReg = Datapath[0];
|
||||
|
||||
reg [2:0] DP_Exceptions;
|
||||
assign ID_CanErr = DP_Exceptions[2];
|
||||
assign EX_CanErr = DP_Exceptions[1];
|
||||
assign M_CanErr = DP_Exceptions[0];
|
||||
|
||||
// Set the main datapath control signals based on the Op Code
|
||||
always @(*) begin
|
||||
if (ID_Stall)
|
||||
Datapath <= DP_None;
|
||||
else begin
|
||||
case (OpCode)
|
||||
// R-Type
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : Datapath <= DP_Add;
|
||||
Funct_Addu : Datapath <= DP_Addu;
|
||||
Funct_And : Datapath <= DP_And;
|
||||
Funct_Break : Datapath <= DP_Break;
|
||||
Funct_Div : Datapath <= DP_Div;
|
||||
Funct_Divu : Datapath <= DP_Divu;
|
||||
Funct_Jalr : Datapath <= DP_Jalr;
|
||||
Funct_Jr : Datapath <= DP_Jr;
|
||||
Funct_Mfhi : Datapath <= DP_Mfhi;
|
||||
Funct_Mflo : Datapath <= DP_Mflo;
|
||||
Funct_Movn : Datapath <= DP_Movn;
|
||||
Funct_Movz : Datapath <= DP_Movz;
|
||||
Funct_Mthi : Datapath <= DP_Mthi;
|
||||
Funct_Mtlo : Datapath <= DP_Mtlo;
|
||||
Funct_Mult : Datapath <= DP_Mult;
|
||||
Funct_Multu : Datapath <= DP_Multu;
|
||||
Funct_Nor : Datapath <= DP_Nor;
|
||||
Funct_Or : Datapath <= DP_Or;
|
||||
Funct_Sll : Datapath <= DP_Sll;
|
||||
Funct_Sllv : Datapath <= DP_Sllv;
|
||||
Funct_Slt : Datapath <= DP_Slt;
|
||||
Funct_Sltu : Datapath <= DP_Sltu;
|
||||
Funct_Sra : Datapath <= DP_Sra;
|
||||
Funct_Srav : Datapath <= DP_Srav;
|
||||
Funct_Srl : Datapath <= DP_Srl;
|
||||
Funct_Srlv : Datapath <= DP_Srlv;
|
||||
Funct_Sub : Datapath <= DP_Sub;
|
||||
Funct_Subu : Datapath <= DP_Subu;
|
||||
Funct_Syscall : Datapath <= DP_Syscall;
|
||||
Funct_Teq : Datapath <= DP_Teq;
|
||||
Funct_Tge : Datapath <= DP_Tge;
|
||||
Funct_Tgeu : Datapath <= DP_Tgeu;
|
||||
Funct_Tlt : Datapath <= DP_Tlt;
|
||||
Funct_Tltu : Datapath <= DP_Tltu;
|
||||
Funct_Tne : Datapath <= DP_Tne;
|
||||
Funct_Xor : Datapath <= DP_Xor;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// R2-Type
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : Datapath <= DP_Clo;
|
||||
Funct_Clz : Datapath <= DP_Clz;
|
||||
Funct_Madd : Datapath <= DP_Madd;
|
||||
Funct_Maddu : Datapath <= DP_Maddu;
|
||||
Funct_Msub : Datapath <= DP_Msub;
|
||||
Funct_Msubu : Datapath <= DP_Msubu;
|
||||
Funct_Mul : Datapath <= DP_Mul;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// I-Type
|
||||
Op_Addi : Datapath <= DP_Addi;
|
||||
Op_Addiu : Datapath <= DP_Addiu;
|
||||
Op_Andi : Datapath <= DP_Andi;
|
||||
Op_Ori : Datapath <= DP_Ori;
|
||||
Op_Pref : Datapath <= DP_Pref;
|
||||
Op_Slti : Datapath <= DP_Slti;
|
||||
Op_Sltiu : Datapath <= DP_Sltiu;
|
||||
Op_Xori : Datapath <= DP_Xori;
|
||||
// Jumps (using immediates)
|
||||
Op_J : Datapath <= DP_J;
|
||||
Op_Jal : Datapath <= DP_Jal;
|
||||
// Branches and Traps
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Bgez : Datapath <= DP_Bgez;
|
||||
OpRt_Bgezal : Datapath <= DP_Bgezal;
|
||||
OpRt_Bltz : Datapath <= DP_Bltz;
|
||||
OpRt_Bltzal : Datapath <= DP_Bltzal;
|
||||
OpRt_Teqi : Datapath <= DP_Teqi;
|
||||
OpRt_Tgei : Datapath <= DP_Tgei;
|
||||
OpRt_Tgeiu : Datapath <= DP_Tgeiu;
|
||||
OpRt_Tlti : Datapath <= DP_Tlti;
|
||||
OpRt_Tltiu : Datapath <= DP_Tltiu;
|
||||
OpRt_Tnei : Datapath <= DP_Tnei;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
Op_Beq : Datapath <= DP_Beq;
|
||||
Op_Bgtz : Datapath <= DP_Bgtz;
|
||||
Op_Blez : Datapath <= DP_Blez;
|
||||
Op_Bne : Datapath <= DP_Bne;
|
||||
// Coprocessor 0
|
||||
Op_Type_CP0 :
|
||||
begin
|
||||
case (Rs)
|
||||
OpRs_MF : Datapath <= DP_Mfc0;
|
||||
OpRs_MT : Datapath <= DP_Mtc0;
|
||||
OpRs_ERET : Datapath <= (Funct == Funct_ERET) ? DP_Eret : DP_None;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// Memory
|
||||
Op_Lb : Datapath <= DP_Lb;
|
||||
Op_Lbu : Datapath <= DP_Lbu;
|
||||
Op_Lh : Datapath <= DP_Lh;
|
||||
Op_Lhu : Datapath <= DP_Lhu;
|
||||
Op_Ll : Datapath <= DP_Ll;
|
||||
Op_Lui : Datapath <= DP_Lui;
|
||||
Op_Lw : Datapath <= DP_Lw;
|
||||
Op_Lwl : Datapath <= DP_Lwl;
|
||||
Op_Lwr : Datapath <= DP_Lwr;
|
||||
Op_Sb : Datapath <= DP_Sb;
|
||||
Op_Sc : Datapath <= DP_Sc;
|
||||
Op_Sh : Datapath <= DP_Sh;
|
||||
Op_Sw : Datapath <= DP_Sw;
|
||||
Op_Swl : Datapath <= DP_Swl;
|
||||
Op_Swr : Datapath <= DP_Swr;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// Set the Hazard Control Signals and Exception Indicators based on the Op Code
|
||||
always @(*) begin
|
||||
case (OpCode)
|
||||
// R-Type
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : begin DP_Hazards <= HAZ_Add; DP_Exceptions <= EXC_Add; end
|
||||
Funct_Addu : begin DP_Hazards <= HAZ_Addu; DP_Exceptions <= EXC_Addu; end
|
||||
Funct_And : begin DP_Hazards <= HAZ_And; DP_Exceptions <= EXC_And; end
|
||||
Funct_Break : begin DP_Hazards <= HAZ_Break; DP_Exceptions <= EXC_Break; end
|
||||
Funct_Div : begin DP_Hazards <= HAZ_Div; DP_Exceptions <= EXC_Div; end
|
||||
Funct_Divu : begin DP_Hazards <= HAZ_Divu; DP_Exceptions <= EXC_Divu; end
|
||||
Funct_Jalr : begin DP_Hazards <= HAZ_Jalr; DP_Exceptions <= EXC_Jalr; end
|
||||
Funct_Jr : begin DP_Hazards <= HAZ_Jr; DP_Exceptions <= EXC_Jr; end
|
||||
Funct_Mfhi : begin DP_Hazards <= HAZ_Mfhi; DP_Exceptions <= EXC_Mfhi; end
|
||||
Funct_Mflo : begin DP_Hazards <= HAZ_Mflo; DP_Exceptions <= EXC_Mflo; end
|
||||
Funct_Movn : begin DP_Hazards <= HAZ_Movn; DP_Exceptions <= EXC_Movn; end
|
||||
Funct_Movz : begin DP_Hazards <= HAZ_Movz; DP_Exceptions <= EXC_Movz; end
|
||||
Funct_Mthi : begin DP_Hazards <= HAZ_Mthi; DP_Exceptions <= EXC_Mthi; end
|
||||
Funct_Mtlo : begin DP_Hazards <= HAZ_Mtlo; DP_Exceptions <= EXC_Mtlo; end
|
||||
Funct_Mult : begin DP_Hazards <= HAZ_Mult; DP_Exceptions <= EXC_Mult; end
|
||||
Funct_Multu : begin DP_Hazards <= HAZ_Multu; DP_Exceptions <= EXC_Multu; end
|
||||
Funct_Nor : begin DP_Hazards <= HAZ_Nor; DP_Exceptions <= EXC_Nor; end
|
||||
Funct_Or : begin DP_Hazards <= HAZ_Or; DP_Exceptions <= EXC_Or; end
|
||||
Funct_Sll : begin DP_Hazards <= HAZ_Sll; DP_Exceptions <= EXC_Sll; end
|
||||
Funct_Sllv : begin DP_Hazards <= HAZ_Sllv; DP_Exceptions <= EXC_Sllv; end
|
||||
Funct_Slt : begin DP_Hazards <= HAZ_Slt; DP_Exceptions <= EXC_Slt; end
|
||||
Funct_Sltu : begin DP_Hazards <= HAZ_Sltu; DP_Exceptions <= EXC_Sltu; end
|
||||
Funct_Sra : begin DP_Hazards <= HAZ_Sra; DP_Exceptions <= EXC_Sra; end
|
||||
Funct_Srav : begin DP_Hazards <= HAZ_Srav; DP_Exceptions <= EXC_Srav; end
|
||||
Funct_Srl : begin DP_Hazards <= HAZ_Srl; DP_Exceptions <= EXC_Srl; end
|
||||
Funct_Srlv : begin DP_Hazards <= HAZ_Srlv; DP_Exceptions <= EXC_Srlv; end
|
||||
Funct_Sub : begin DP_Hazards <= HAZ_Sub; DP_Exceptions <= EXC_Sub; end
|
||||
Funct_Subu : begin DP_Hazards <= HAZ_Subu; DP_Exceptions <= EXC_Subu; end
|
||||
Funct_Syscall : begin DP_Hazards <= HAZ_Syscall; DP_Exceptions <= EXC_Syscall; end
|
||||
Funct_Teq : begin DP_Hazards <= HAZ_Teq; DP_Exceptions <= EXC_Teq; end
|
||||
Funct_Tge : begin DP_Hazards <= HAZ_Tge; DP_Exceptions <= EXC_Tge; end
|
||||
Funct_Tgeu : begin DP_Hazards <= HAZ_Tgeu; DP_Exceptions <= EXC_Tgeu; end
|
||||
Funct_Tlt : begin DP_Hazards <= HAZ_Tlt; DP_Exceptions <= EXC_Tlt; end
|
||||
Funct_Tltu : begin DP_Hazards <= HAZ_Tltu; DP_Exceptions <= EXC_Tltu; end
|
||||
Funct_Tne : begin DP_Hazards <= HAZ_Tne; DP_Exceptions <= EXC_Tne; end
|
||||
Funct_Xor : begin DP_Hazards <= HAZ_Xor; DP_Exceptions <= EXC_Xor; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// R2-Type
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : begin DP_Hazards <= HAZ_Clo; DP_Exceptions <= EXC_Clo; end
|
||||
Funct_Clz : begin DP_Hazards <= HAZ_Clz; DP_Exceptions <= EXC_Clz; end
|
||||
Funct_Madd : begin DP_Hazards <= HAZ_Madd; DP_Exceptions <= EXC_Madd; end
|
||||
Funct_Maddu : begin DP_Hazards <= HAZ_Maddu; DP_Exceptions <= EXC_Maddu; end
|
||||
Funct_Msub : begin DP_Hazards <= HAZ_Msub; DP_Exceptions <= EXC_Msub; end
|
||||
Funct_Msubu : begin DP_Hazards <= HAZ_Msubu; DP_Exceptions <= EXC_Msubu; end
|
||||
Funct_Mul : begin DP_Hazards <= HAZ_Mul; DP_Exceptions <= EXC_Mul; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// I-Type
|
||||
Op_Addi : begin DP_Hazards <= HAZ_Addi; DP_Exceptions <= EXC_Addi; end
|
||||
Op_Addiu : begin DP_Hazards <= HAZ_Addiu; DP_Exceptions <= EXC_Addiu; end
|
||||
Op_Andi : begin DP_Hazards <= HAZ_Andi; DP_Exceptions <= EXC_Andi; end
|
||||
Op_Ori : begin DP_Hazards <= HAZ_Ori; DP_Exceptions <= EXC_Ori; end
|
||||
Op_Pref : begin DP_Hazards <= HAZ_Pref; DP_Exceptions <= EXC_Pref; end
|
||||
Op_Slti : begin DP_Hazards <= HAZ_Slti; DP_Exceptions <= EXC_Slti; end
|
||||
Op_Sltiu : begin DP_Hazards <= HAZ_Sltiu; DP_Exceptions <= EXC_Sltiu; end
|
||||
Op_Xori : begin DP_Hazards <= HAZ_Xori; DP_Exceptions <= EXC_Xori; end
|
||||
// Jumps
|
||||
Op_J : begin DP_Hazards <= HAZ_J; DP_Exceptions <= EXC_J; end
|
||||
Op_Jal : begin DP_Hazards <= HAZ_Jal; DP_Exceptions <= EXC_Jal; end
|
||||
// Branches and Traps
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Bgez : begin DP_Hazards <= HAZ_Bgez; DP_Exceptions <= EXC_Bgez; end
|
||||
OpRt_Bgezal : begin DP_Hazards <= HAZ_Bgezal; DP_Exceptions <= EXC_Bgezal; end
|
||||
OpRt_Bltz : begin DP_Hazards <= HAZ_Bltz; DP_Exceptions <= EXC_Bltz; end
|
||||
OpRt_Bltzal : begin DP_Hazards <= HAZ_Bltzal; DP_Exceptions <= EXC_Bltzal; end
|
||||
OpRt_Teqi : begin DP_Hazards <= HAZ_Teqi; DP_Exceptions <= EXC_Teqi; end
|
||||
OpRt_Tgei : begin DP_Hazards <= HAZ_Tgei; DP_Exceptions <= EXC_Tgei; end
|
||||
OpRt_Tgeiu : begin DP_Hazards <= HAZ_Tgeiu; DP_Exceptions <= EXC_Tgeiu; end
|
||||
OpRt_Tlti : begin DP_Hazards <= HAZ_Tlti; DP_Exceptions <= EXC_Tlti; end
|
||||
OpRt_Tltiu : begin DP_Hazards <= HAZ_Tltiu; DP_Exceptions <= EXC_Tltiu; end
|
||||
OpRt_Tnei : begin DP_Hazards <= HAZ_Tnei; DP_Exceptions <= EXC_Tnei; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
Op_Beq : begin DP_Hazards <= HAZ_Beq; DP_Exceptions <= EXC_Beq; end
|
||||
Op_Bgtz : begin DP_Hazards <= HAZ_Bgtz; DP_Exceptions <= EXC_Bgtz; end
|
||||
Op_Blez : begin DP_Hazards <= HAZ_Blez; DP_Exceptions <= EXC_Blez; end
|
||||
Op_Bne : begin DP_Hazards <= HAZ_Bne; DP_Exceptions <= EXC_Bne; end
|
||||
// Coprocessor 0
|
||||
Op_Type_CP0 :
|
||||
begin
|
||||
case (Rs)
|
||||
OpRs_MF : begin DP_Hazards <= HAZ_Mfc0; DP_Exceptions <= EXC_Mfc0; end
|
||||
OpRs_MT : begin DP_Hazards <= HAZ_Mtc0; DP_Exceptions <= EXC_Mtc0; end
|
||||
OpRs_ERET : begin DP_Hazards <= (Funct == Funct_ERET) ? DP_Eret : 8'hxx; DP_Exceptions <= EXC_Eret; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// Memory
|
||||
Op_Lb : begin DP_Hazards <= HAZ_Lb; DP_Exceptions <= EXC_Lb; end
|
||||
Op_Lbu : begin DP_Hazards <= HAZ_Lbu; DP_Exceptions <= EXC_Lbu; end
|
||||
Op_Lh : begin DP_Hazards <= HAZ_Lh; DP_Exceptions <= EXC_Lh; end
|
||||
Op_Lhu : begin DP_Hazards <= HAZ_Lhu; DP_Exceptions <= EXC_Lhu; end
|
||||
Op_Ll : begin DP_Hazards <= HAZ_Ll; DP_Exceptions <= EXC_Ll; end
|
||||
Op_Lui : begin DP_Hazards <= HAZ_Lui; DP_Exceptions <= EXC_Lui; end
|
||||
Op_Lw : begin DP_Hazards <= HAZ_Lw; DP_Exceptions <= EXC_Lw; end
|
||||
Op_Lwl : begin DP_Hazards <= HAZ_Lwl; DP_Exceptions <= EXC_Lwl; end
|
||||
Op_Lwr : begin DP_Hazards <= HAZ_Lwr; DP_Exceptions <= EXC_Lwr; end
|
||||
Op_Sb : begin DP_Hazards <= HAZ_Sb; DP_Exceptions <= EXC_Sb; end
|
||||
Op_Sc : begin DP_Hazards <= HAZ_Sc; DP_Exceptions <= EXC_Sc; end
|
||||
Op_Sh : begin DP_Hazards <= HAZ_Sh; DP_Exceptions <= EXC_Sh; end
|
||||
Op_Sw : begin DP_Hazards <= HAZ_Sw; DP_Exceptions <= EXC_Sw; end
|
||||
Op_Swl : begin DP_Hazards <= HAZ_Swl; DP_Exceptions <= EXC_Swl; end
|
||||
Op_Swr : begin DP_Hazards <= HAZ_Swr; DP_Exceptions <= EXC_Swr; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
|
||||
// ALU Assignment
|
||||
always @(*) begin
|
||||
if (ID_Stall)
|
||||
ALUOp <= AluOp_Addu; // Any Op that doesn't write HILO or cause exceptions
|
||||
else begin
|
||||
case (OpCode)
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : ALUOp <= AluOp_Add;
|
||||
Funct_Addu : ALUOp <= AluOp_Addu;
|
||||
Funct_And : ALUOp <= AluOp_And;
|
||||
Funct_Div : ALUOp <= AluOp_Div;
|
||||
Funct_Divu : ALUOp <= AluOp_Divu;
|
||||
Funct_Jalr : ALUOp <= AluOp_Addu;
|
||||
Funct_Mfhi : ALUOp <= AluOp_Mfhi;
|
||||
Funct_Mflo : ALUOp <= AluOp_Mflo;
|
||||
Funct_Movn : ALUOp <= AluOp_Addu;
|
||||
Funct_Movz : ALUOp <= AluOp_Addu;
|
||||
Funct_Mthi : ALUOp <= AluOp_Mthi;
|
||||
Funct_Mtlo : ALUOp <= AluOp_Mtlo;
|
||||
Funct_Mult : ALUOp <= AluOp_Mult;
|
||||
Funct_Multu : ALUOp <= AluOp_Multu;
|
||||
Funct_Nor : ALUOp <= AluOp_Nor;
|
||||
Funct_Or : ALUOp <= AluOp_Or;
|
||||
Funct_Sll : ALUOp <= AluOp_Sll;
|
||||
Funct_Sllv : ALUOp <= AluOp_Sllv;
|
||||
Funct_Slt : ALUOp <= AluOp_Slt;
|
||||
Funct_Sltu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Sra : ALUOp <= AluOp_Sra;
|
||||
Funct_Srav : ALUOp <= AluOp_Srav;
|
||||
Funct_Srl : ALUOp <= AluOp_Srl;
|
||||
Funct_Srlv : ALUOp <= AluOp_Srlv;
|
||||
Funct_Sub : ALUOp <= AluOp_Sub;
|
||||
Funct_Subu : ALUOp <= AluOp_Subu;
|
||||
Funct_Syscall : ALUOp <= AluOp_Addu;
|
||||
Funct_Teq : ALUOp <= AluOp_Subu;
|
||||
Funct_Tge : ALUOp <= AluOp_Slt;
|
||||
Funct_Tgeu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Tlt : ALUOp <= AluOp_Slt;
|
||||
Funct_Tltu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Tne : ALUOp <= AluOp_Subu;
|
||||
Funct_Xor : ALUOp <= AluOp_Xor;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : ALUOp <= AluOp_Clo;
|
||||
Funct_Clz : ALUOp <= AluOp_Clz;
|
||||
Funct_Madd : ALUOp <= AluOp_Madd;
|
||||
Funct_Maddu : ALUOp <= AluOp_Maddu;
|
||||
Funct_Msub : ALUOp <= AluOp_Msub;
|
||||
Funct_Msubu : ALUOp <= AluOp_Msubu;
|
||||
Funct_Mul : ALUOp <= AluOp_Mul;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Teqi : ALUOp <= AluOp_Subu;
|
||||
OpRt_Tgei : ALUOp <= AluOp_Slt;
|
||||
OpRt_Tgeiu : ALUOp <= AluOp_Sltu;
|
||||
OpRt_Tlti : ALUOp <= AluOp_Slt;
|
||||
OpRt_Tltiu : ALUOp <= AluOp_Sltu;
|
||||
OpRt_Tnei : ALUOp <= AluOp_Subu;
|
||||
default : ALUOp <= AluOp_Addu; // Branches don't matter.
|
||||
endcase
|
||||
end
|
||||
Op_Type_CP0 : ALUOp <= AluOp_Addu;
|
||||
Op_Addi : ALUOp <= AluOp_Add;
|
||||
Op_Addiu : ALUOp <= AluOp_Addu;
|
||||
Op_Andi : ALUOp <= AluOp_And;
|
||||
Op_Jal : ALUOp <= AluOp_Addu;
|
||||
Op_Lb : ALUOp <= AluOp_Addu;
|
||||
Op_Lbu : ALUOp <= AluOp_Addu;
|
||||
Op_Lh : ALUOp <= AluOp_Addu;
|
||||
Op_Lhu : ALUOp <= AluOp_Addu;
|
||||
Op_Ll : ALUOp <= AluOp_Addu;
|
||||
Op_Lui : ALUOp <= AluOp_Sllc;
|
||||
Op_Lw : ALUOp <= AluOp_Addu;
|
||||
Op_Lwl : ALUOp <= AluOp_Addu;
|
||||
Op_Lwr : ALUOp <= AluOp_Addu;
|
||||
Op_Ori : ALUOp <= AluOp_Or;
|
||||
Op_Sb : ALUOp <= AluOp_Addu;
|
||||
Op_Sc : ALUOp <= AluOp_Addu; // XXX Needs HW implement
|
||||
Op_Sh : ALUOp <= AluOp_Addu;
|
||||
Op_Slti : ALUOp <= AluOp_Slt;
|
||||
Op_Sltiu : ALUOp <= AluOp_Sltu;
|
||||
Op_Sw : ALUOp <= AluOp_Addu;
|
||||
Op_Swl : ALUOp <= AluOp_Addu;
|
||||
Op_Swr : ALUOp <= AluOp_Addu;
|
||||
Op_Xori : ALUOp <= AluOp_Xor;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
/***
|
||||
These remaining options cover portions of the datapath that are not
|
||||
controlled directly by the datapath bits. Note that some refer to bits of
|
||||
the opcode or other fields, which breaks the otherwise fully-abstracted view
|
||||
of instruction encodings. Make sure when adding custom instructions that
|
||||
no false positives/negatives are generated here.
|
||||
***/
|
||||
|
||||
// Branch Detection: Options are mutually exclusive.
|
||||
assign Branch_EQ = OpCode[2] & ~OpCode[1] & ~OpCode[0] & Cmp_EQ;
|
||||
assign Branch_GTZ = OpCode[2] & OpCode[1] & OpCode[0] & Cmp_GZ;
|
||||
assign Branch_LEZ = OpCode[2] & OpCode[1] & ~OpCode[0] & Cmp_LEZ;
|
||||
assign Branch_NEQ = OpCode[2] & ~OpCode[1] & OpCode[0] & ~Cmp_EQ;
|
||||
assign Branch_GEZ = ~OpCode[2] & Rt[0] & Cmp_GEZ;
|
||||
assign Branch_LTZ = ~OpCode[2] & ~Rt[0] & Cmp_LZ;
|
||||
|
||||
assign Branch = Branch_EQ | Branch_GTZ | Branch_LEZ | Branch_NEQ | Branch_GEZ | Branch_LTZ;
|
||||
assign PCSrc[1] = (Datapath[15] & ~Datapath[14]) ? Branch : Datapath[15];
|
||||
|
||||
/* In MIPS32, all Branch and Jump operations execute the Branch Delay Slot,
|
||||
* or next instruction, regardless if the branch is taken or not. The exception
|
||||
* is the "Branch Likely" instruction group. These are deprecated, however, and not
|
||||
* implemented here. "IF_Flush" is defined to allow for the cancelation of a
|
||||
* Branch Delay Slot should these be implemented later.
|
||||
*/
|
||||
assign IF_Flush = 0;
|
||||
|
||||
// Indicator that next instruction is a Branch Delay Slot.
|
||||
assign NextIsDelay = Datapath[15] | Datapath[14];
|
||||
|
||||
// Sign- or Zero-Extension Control. The only ops that require zero-extension are
|
||||
// Andi, Ori, and Xori. The following also zero-extends 'lui', however it does not alter the effect of lui.
|
||||
assign SignExtend = (OpCode[5:2] != 4'b0011);
|
||||
|
||||
// Move Conditional
|
||||
assign Movn = Movc & Funct[0];
|
||||
assign Movz = Movc & ~Funct[0];
|
||||
|
||||
// Coprocessor 0 (Mfc0, Mtc0) control signals.
|
||||
assign Mfc0 = ((OpCode == Op_Type_CP0) && (Rs == OpRs_MF));
|
||||
assign Mtc0 = ((OpCode == Op_Type_CP0) && (Rs == OpRs_MT));
|
||||
assign Eret = ((OpCode == Op_Type_CP0) && (Rs == OpRs_ERET) && (Funct == Funct_ERET));
|
||||
|
||||
// Coprocessor 1,2,3 accesses (not implemented)
|
||||
assign CP1 = (OpCode == Op_Type_CP1);
|
||||
assign CP2 = (OpCode == Op_Type_CP2);
|
||||
assign CP3 = (OpCode == Op_Type_CP3);
|
||||
|
||||
// Exceptions found in ID
|
||||
assign EXC_Sys = ((OpCode == Op_Type_R) && (Funct == Funct_Syscall));
|
||||
assign EXC_Bp = ((OpCode == Op_Type_R) && (Funct == Funct_Break));
|
||||
|
||||
// Unaligned Memory Accesses (lwl, lwr, swl, swr)
|
||||
assign Unaligned_Mem = OpCode[5] & ~OpCode[4] & OpCode[1] & ~OpCode[0];
|
||||
assign Left = Unaligned_Mem & ~OpCode[2];
|
||||
assign Right = Unaligned_Mem & OpCode[2];
|
||||
|
||||
// TODO: Reserved Instruction Exception must still be implemented
|
||||
assign EXC_RI = 0;
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
`timescale 1ns / 1ns
|
||||
/*
|
||||
* File : Divide.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Neil Russell
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 6-Nov-2012 NJR Initial design.
|
||||
*
|
||||
* Description:
|
||||
* A multi-cycle 32-bit divider.
|
||||
*
|
||||
* On any cycle that one of OP_div or OP_divu are true, the Dividend and
|
||||
* Divisor will be captured and a multi-cycle divide operation initiated.
|
||||
* Stall will go true on the next cycle and the first cycle of the divide
|
||||
* operation completed. After some time (about 32 cycles), Stall will go
|
||||
* false on the same cycle that the result becomes valid. OP_div or OP_divu
|
||||
* will abort any currently running divide operation and initiate a new one.
|
||||
*/
|
||||
module Divide(
|
||||
input clock,
|
||||
input reset,
|
||||
input OP_div, // True to initiate a signed divide
|
||||
input OP_divu, // True to initiate an unsigned divide
|
||||
input [31:0] Dividend,
|
||||
input [31:0] Divisor,
|
||||
output [31:0] Quotient,
|
||||
output [31:0] Remainder,
|
||||
output Stall // True while calculating
|
||||
);
|
||||
|
||||
|
||||
reg active; // True if the divider is running
|
||||
reg neg; // True if the result will be negative
|
||||
reg [4:0] cycle; // Number of cycles to go
|
||||
|
||||
reg [31:0] result; // Begin with dividend, end with quotient
|
||||
reg [31:0] denom; // Divisor
|
||||
reg [31:0] work; // Running remainder
|
||||
|
||||
// Calculate the current digit
|
||||
wire [32:0] sub = { work[30:0], result[31] } - denom;
|
||||
|
||||
// Send the results to our master
|
||||
assign Quotient = !neg ? result : -result;
|
||||
assign Remainder = work;
|
||||
assign Stall = active;
|
||||
|
||||
// The state machine
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
active <= 0;
|
||||
neg <= 0;
|
||||
cycle <= 0;
|
||||
result <= 0;
|
||||
denom <= 0;
|
||||
work <= 0;
|
||||
end
|
||||
else begin
|
||||
if (OP_div) begin
|
||||
// Set up for a signed divide. Remember the resulting sign,
|
||||
// and make the operands positive.
|
||||
cycle <= 5'd31;
|
||||
result <= (Dividend[31] == 0) ? Dividend : -Dividend;
|
||||
denom <= (Divisor[31] == 0) ? Divisor : -Divisor;
|
||||
work <= 32'b0;
|
||||
neg <= Dividend[31] ^ Divisor[31];
|
||||
active <= 1;
|
||||
end
|
||||
else if (OP_divu) begin
|
||||
// Set up for an unsigned divide.
|
||||
cycle <= 5'd31;
|
||||
result <= Dividend;
|
||||
denom <= Divisor;
|
||||
work <= 32'b0;
|
||||
neg <= 0;
|
||||
active <= 1;
|
||||
end
|
||||
else if (active) begin
|
||||
// Run an iteration of the divide.
|
||||
if (sub[32] == 0) begin
|
||||
work <= sub[31:0];
|
||||
result <= {result[30:0], 1'b1};
|
||||
end
|
||||
else begin
|
||||
work <= {work[30:0], result[31]};
|
||||
result <= {result[30:0], 1'b0};
|
||||
end
|
||||
|
||||
if (cycle == 0) begin
|
||||
active <= 0;
|
||||
end
|
||||
|
||||
cycle <= cycle - 5'd1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,116 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : EXMEM_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Execute and Memory stages.
|
||||
*/
|
||||
module EXMEM_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input EX_Flush,
|
||||
input EX_Stall,
|
||||
input M_Stall,
|
||||
// Control Signals
|
||||
input EX_Movn,
|
||||
input EX_Movz,
|
||||
input EX_BZero,
|
||||
input EX_RegWrite, // Future Control to WB
|
||||
input EX_MemtoReg, // Future Control to WB
|
||||
input EX_ReverseEndian,
|
||||
input EX_LLSC,
|
||||
input EX_MemRead,
|
||||
input EX_MemWrite,
|
||||
input EX_MemByte,
|
||||
input EX_MemHalf,
|
||||
input EX_MemSignExtend,
|
||||
input EX_Left,
|
||||
input EX_Right,
|
||||
// Exception Control/Info
|
||||
input EX_KernelMode,
|
||||
input [31:0] EX_RestartPC,
|
||||
input EX_IsBDS,
|
||||
input EX_Trap,
|
||||
input EX_TrapCond,
|
||||
input EX_M_CanErr,
|
||||
// Data Signals
|
||||
input [31:0] EX_ALU_Result,
|
||||
input [31:0] EX_ReadData2,
|
||||
input [4:0] EX_RtRd,
|
||||
// ------------------
|
||||
output reg M_RegWrite,
|
||||
output reg M_MemtoReg,
|
||||
output reg M_ReverseEndian,
|
||||
output reg M_LLSC,
|
||||
output reg M_MemRead,
|
||||
output reg M_MemWrite,
|
||||
output reg M_MemByte,
|
||||
output reg M_MemHalf,
|
||||
output reg M_MemSignExtend,
|
||||
output reg M_Left,
|
||||
output reg M_Right,
|
||||
output reg M_KernelMode,
|
||||
output reg [31:0] M_RestartPC,
|
||||
output reg M_IsBDS,
|
||||
output reg M_Trap,
|
||||
output reg M_TrapCond,
|
||||
output reg M_M_CanErr,
|
||||
output reg [31:0] M_ALU_Result,
|
||||
output reg [31:0] M_ReadData2,
|
||||
output reg [4:0] M_RtRd
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
// Mask of RegWrite if a Move Conditional failed.
|
||||
wire MovcRegWrite = (EX_Movn & ~EX_BZero) | (EX_Movz & EX_BZero);
|
||||
|
||||
always @(posedge clock) begin
|
||||
M_RegWrite <= (reset) ? 0 : ((M_Stall) ? M_RegWrite : ((EX_Stall | EX_Flush) ? 0 : EX_RegWrite));
|
||||
M_RegWrite <= (reset) ? 0 : ((M_Stall) ? M_RegWrite : ((EX_Stall | EX_Flush) ? 0 : ((EX_Movn | EX_Movz) ? MovcRegWrite : EX_RegWrite)));
|
||||
M_MemtoReg <= (reset) ? 0 : ((M_Stall) ? M_MemtoReg : EX_MemtoReg);
|
||||
M_ReverseEndian <= (reset) ? 0 : ((M_Stall) ? M_ReverseEndian : EX_ReverseEndian);
|
||||
M_LLSC <= (reset) ? 0 : ((M_Stall) ? M_LLSC : EX_LLSC);
|
||||
M_MemRead <= (reset) ? 0 : ((M_Stall) ? M_MemRead : ((EX_Stall | EX_Flush) ? 0 : EX_MemRead));
|
||||
M_MemWrite <= (reset) ? 0 : ((M_Stall) ? M_MemWrite : ((EX_Stall | EX_Flush) ? 0 : EX_MemWrite));
|
||||
M_MemByte <= (reset) ? 0 : ((M_Stall) ? M_MemByte : EX_MemByte);
|
||||
M_MemHalf <= (reset) ? 0 : ((M_Stall) ? M_MemHalf : EX_MemHalf);
|
||||
M_MemSignExtend <= (reset) ? 0 : ((M_Stall) ? M_MemSignExtend : EX_MemSignExtend);
|
||||
M_Left <= (reset) ? 0 : ((M_Stall) ? M_Left : EX_Left);
|
||||
M_Right <= (reset) ? 0 : ((M_Stall) ? M_Right : EX_Right);
|
||||
M_KernelMode <= (reset) ? 0 : ((M_Stall) ? M_KernelMode : EX_KernelMode);
|
||||
M_RestartPC <= (reset) ? 32'b0 : ((M_Stall) ? M_RestartPC : EX_RestartPC);
|
||||
M_IsBDS <= (reset) ? 0 : ((M_Stall) ? M_IsBDS : EX_IsBDS);
|
||||
M_Trap <= (reset) ? 0 : ((M_Stall) ? M_Trap : ((EX_Stall | EX_Flush) ? 0 : EX_Trap));
|
||||
M_TrapCond <= (reset) ? 0 : ((M_Stall) ? M_TrapCond : EX_TrapCond);
|
||||
M_M_CanErr <= (reset) ? 0 : ((M_Stall) ? M_M_CanErr : ((EX_Stall | EX_Flush) ? 0 : EX_M_CanErr));
|
||||
M_ALU_Result <= (reset) ? 32'b0 : ((M_Stall) ? M_ALU_Result : EX_ALU_Result);
|
||||
M_ReadData2 <= (reset) ? 32'b0 : ((M_Stall) ? M_ReadData2 : EX_ReadData2);
|
||||
M_RtRd <= (reset) ? 5'b0 : ((M_Stall) ? M_RtRd : EX_RtRd);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Hazard_Detection.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 23-Jul-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
* 2.01 1-Nov-2012 GEA Fixed issue with Jal.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Hazard Detection and Forward Control. This is the glue that allows a
|
||||
* pipelined processor to operate efficiently and correctly in the presence
|
||||
* of data, structural, and control hazards. For each pipeline stage, it
|
||||
* detects whether that stage requires data that is still in the pipeline,
|
||||
* and whether that data may be forwarded or if the pipeline must be stalled.
|
||||
*
|
||||
* This module is heavily commented. Read below for more information.
|
||||
*/
|
||||
module Hazard_Detection(
|
||||
input [7:0] DP_Hazards,
|
||||
input [4:0] ID_Rs,
|
||||
input [4:0] ID_Rt,
|
||||
input [4:0] EX_Rs,
|
||||
input [4:0] EX_Rt,
|
||||
input [4:0] EX_RtRd,
|
||||
input [4:0] MEM_RtRd,
|
||||
input [4:0] WB_RtRd,
|
||||
input EX_Link,
|
||||
input EX_RegWrite,
|
||||
input MEM_RegWrite,
|
||||
input WB_RegWrite,
|
||||
input MEM_MemRead,
|
||||
input MEM_MemWrite, // Needed for Store Conditional which writes to a register
|
||||
input InstMem_Read,
|
||||
input InstMem_Ready,
|
||||
input Mfc0, // Using fwd mux; not part of haz/fwd.
|
||||
input IF_Exception_Stall,
|
||||
input ID_Exception_Stall,
|
||||
input EX_Exception_Stall,
|
||||
input EX_ALU_Stall,
|
||||
input M_Stall_Controller, // Determined by data memory controller
|
||||
output IF_Stall,
|
||||
output ID_Stall,
|
||||
output EX_Stall,
|
||||
output M_Stall,
|
||||
output WB_Stall,
|
||||
output [1:0] ID_RsFwdSel,
|
||||
output [1:0] ID_RtFwdSel,
|
||||
output [1:0] EX_RsFwdSel,
|
||||
output [1:0] EX_RtFwdSel,
|
||||
output M_WriteDataFwdSel
|
||||
);
|
||||
|
||||
/* Hazard and Forward Detection
|
||||
*
|
||||
* Most instructions read from one or more registers. Normally this occurs in
|
||||
* the ID stage. However, frequently the register file in the ID stage is stale
|
||||
* when one or more forward stages in the pipeline (EX, MEM, or WB) contains
|
||||
* an instruction which will eventually update it but has not yet done so.
|
||||
*
|
||||
* A hazard condition is created when a forward pipeline stage is set to write
|
||||
* the same register that a current pipeline stage (e.g. in ID) needs to read.
|
||||
* The solution is to stall the current stage (and effectively all stages behind
|
||||
* it) or bypass (forward) the data from forward stages. Fortunately forwarding
|
||||
* works for most combinations of instructions.
|
||||
*
|
||||
* Hazard and Forward conditions are handled based on two simple rules:
|
||||
* "Wants" and "Needs." If an instruction "wants" data in a certain pipeline
|
||||
* stage, and that data is available further along in the pipeline, it will
|
||||
* be forwarded. If it "needs" data and the data is not yet available for forwarding,
|
||||
* the pipeline stage stalls. If it does not want or need data in a certain
|
||||
* stage, forwarding is disabled and a stall will not occur. This is important
|
||||
* for instructions which insert custom data, such as jal or movz.
|
||||
*
|
||||
* Currently, "Want" and "Need" conditions are defined for both Rs data and Rt
|
||||
* data (the two read registers in MIPS), and these conditions exist in the
|
||||
* ID and EX pipeline stages. This is a total of eight condition bits.
|
||||
*
|
||||
* A unique exception exists with Store instructions, which don't need the
|
||||
* "Rt" data until the MEM stage. Because data doesn't change in WB, and WB
|
||||
* is the only stage following MEM, forwarding is *always* possible from
|
||||
* WB to Mem. This unit handles this situation, and a condition bit is not
|
||||
* needed.
|
||||
*
|
||||
* When data is needed from the MEM stage by a previous stage (ID or EX), the
|
||||
* decision to forward or stall is based on whether MEM is accessing memory
|
||||
* (stall) or not (forward). Normally store instructions don't write to registers
|
||||
* and thus are never needed for a data dependence, so the signal 'MEM_MemRead'
|
||||
* is sufficient to determine. Because of the Store Conditional instruction,
|
||||
* however, 'MEM_MemWrite' must also be considered because it writes to a register.
|
||||
*
|
||||
*/
|
||||
|
||||
wire WantRsByID, NeedRsByID, WantRtByID, NeedRtByID, WantRsByEX, NeedRsByEX, WantRtByEX, NeedRtByEX;
|
||||
assign WantRsByID = DP_Hazards[7];
|
||||
assign NeedRsByID = DP_Hazards[6];
|
||||
assign WantRtByID = DP_Hazards[5];
|
||||
assign NeedRtByID = DP_Hazards[4];
|
||||
assign WantRsByEX = DP_Hazards[3];
|
||||
assign NeedRsByEX = DP_Hazards[2];
|
||||
assign WantRtByEX = DP_Hazards[1];
|
||||
assign NeedRtByEX = DP_Hazards[0];
|
||||
|
||||
// Trick allowed by RegDst = 0 which gives Rt. MEM_Rt is only used on
|
||||
// Data Memory write operations (stores), and RegWrite is always 0 in this case.
|
||||
wire [4:0] MEM_Rt = MEM_RtRd;
|
||||
|
||||
// Forwarding should not happen when the src/dst register is $zero
|
||||
wire EX_RtRd_NZ = (EX_RtRd != 5'b00000);
|
||||
wire MEM_RtRd_NZ = (MEM_RtRd != 5'b00000);
|
||||
wire WB_RtRd_NZ = (WB_RtRd != 5'b00000);
|
||||
|
||||
// ID Dependencies
|
||||
wire Rs_IDEX_Match = (ID_Rs == EX_RtRd) & EX_RtRd_NZ & (WantRsByID | NeedRsByID) & EX_RegWrite;
|
||||
wire Rt_IDEX_Match = (ID_Rt == EX_RtRd) & EX_RtRd_NZ & (WantRtByID | NeedRtByID) & EX_RegWrite;
|
||||
wire Rs_IDMEM_Match = (ID_Rs == MEM_RtRd) & MEM_RtRd_NZ & (WantRsByID | NeedRsByID) & MEM_RegWrite;
|
||||
wire Rt_IDMEM_Match = (ID_Rt == MEM_RtRd) & MEM_RtRd_NZ & (WantRtByID | NeedRtByID) & MEM_RegWrite;
|
||||
wire Rs_IDWB_Match = (ID_Rs == WB_RtRd) & WB_RtRd_NZ & (WantRsByID | NeedRsByID) & WB_RegWrite;
|
||||
wire Rt_IDWB_Match = (ID_Rt == WB_RtRd) & WB_RtRd_NZ & (WantRtByID | NeedRtByID) & WB_RegWrite;
|
||||
// EX Dependencies
|
||||
wire Rs_EXMEM_Match = (EX_Rs == MEM_RtRd) & MEM_RtRd_NZ & (WantRsByEX | NeedRsByEX) & MEM_RegWrite;
|
||||
wire Rt_EXMEM_Match = (EX_Rt == MEM_RtRd) & MEM_RtRd_NZ & (WantRtByEX | NeedRtByEX) & MEM_RegWrite;
|
||||
wire Rs_EXWB_Match = (EX_Rs == WB_RtRd) & WB_RtRd_NZ & (WantRsByEX | NeedRsByEX) & WB_RegWrite;
|
||||
wire Rt_EXWB_Match = (EX_Rt == WB_RtRd) & WB_RtRd_NZ & (WantRtByEX | NeedRtByEX) & WB_RegWrite;
|
||||
// MEM Dependencies
|
||||
wire Rt_MEMWB_Match = (MEM_Rt == WB_RtRd) & WB_RtRd_NZ & WB_RegWrite;
|
||||
|
||||
|
||||
// ID needs data from EX : Stall
|
||||
wire ID_Stall_1 = (Rs_IDEX_Match & NeedRsByID);
|
||||
wire ID_Stall_2 = (Rt_IDEX_Match & NeedRtByID);
|
||||
// ID needs data from MEM : Stall if mem access
|
||||
wire ID_Stall_3 = (Rs_IDMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRsByID);
|
||||
wire ID_Stall_4 = (Rt_IDMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRtByID);
|
||||
// ID wants data from MEM : Forward if not mem access
|
||||
wire ID_Fwd_1 = (Rs_IDMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
wire ID_Fwd_2 = (Rt_IDMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
// ID wants/needs data from WB : Forward
|
||||
wire ID_Fwd_3 = (Rs_IDWB_Match);
|
||||
wire ID_Fwd_4 = (Rt_IDWB_Match);
|
||||
// EX needs data from MEM : Stall if mem access
|
||||
wire EX_Stall_1 = (Rs_EXMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRsByEX);
|
||||
wire EX_Stall_2 = (Rt_EXMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRtByEX);
|
||||
// EX wants data from MEM : Forward if not mem access
|
||||
wire EX_Fwd_1 = (Rs_EXMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
wire EX_Fwd_2 = (Rt_EXMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
// EX wants/needs data from WB : Forward
|
||||
wire EX_Fwd_3 = (Rs_EXWB_Match);
|
||||
wire EX_Fwd_4 = (Rt_EXWB_Match);
|
||||
// MEM needs data from WB : Forward
|
||||
wire MEM_Fwd_1 = (Rt_MEMWB_Match);
|
||||
|
||||
|
||||
// Stalls and Control Flow Final Assignments
|
||||
assign WB_Stall = M_Stall;
|
||||
assign M_Stall = IF_Stall | M_Stall_Controller;
|
||||
assign EX_Stall = (EX_Stall_1 | EX_Stall_2 | EX_Exception_Stall) | EX_ALU_Stall | M_Stall;
|
||||
assign ID_Stall = (ID_Stall_1 | ID_Stall_2 | ID_Stall_3 | ID_Stall_4 | ID_Exception_Stall) | EX_Stall;
|
||||
assign IF_Stall = InstMem_Read | InstMem_Ready | IF_Exception_Stall;
|
||||
|
||||
// Forwarding Control Final Assignments
|
||||
assign ID_RsFwdSel = (ID_Fwd_1) ? 2'b01 : ((ID_Fwd_3) ? 2'b10 : 2'b00);
|
||||
assign ID_RtFwdSel = (Mfc0) ? 2'b11 : ((ID_Fwd_2) ? 2'b01 : ((ID_Fwd_4) ? 2'b10 : 2'b00));
|
||||
assign EX_RsFwdSel = (EX_Link) ? 2'b11 : ((EX_Fwd_1) ? 2'b01 : ((EX_Fwd_3) ? 2'b10 : 2'b00));
|
||||
assign EX_RtFwdSel = (EX_Link) ? 2'b11 : ((EX_Fwd_2) ? 2'b01 : ((EX_Fwd_4) ? 2'b10 : 2'b00));
|
||||
assign M_WriteDataFwdSel = MEM_Fwd_1;
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : IDEX_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Instruction Decode
|
||||
* and Execute stages.
|
||||
*/
|
||||
module IDEX_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input ID_Flush,
|
||||
input ID_Stall,
|
||||
input EX_Stall,
|
||||
// Control Signals
|
||||
input ID_Link,
|
||||
input ID_RegDst,
|
||||
input ID_ALUSrcImm,
|
||||
input [4:0] ID_ALUOp,
|
||||
input ID_Movn,
|
||||
input ID_Movz,
|
||||
input ID_LLSC,
|
||||
input ID_MemRead,
|
||||
input ID_MemWrite,
|
||||
input ID_MemByte,
|
||||
input ID_MemHalf,
|
||||
input ID_MemSignExtend,
|
||||
input ID_Left,
|
||||
input ID_Right,
|
||||
input ID_RegWrite,
|
||||
input ID_MemtoReg,
|
||||
input ID_ReverseEndian,
|
||||
// Hazard & Forwarding
|
||||
input [4:0] ID_Rs,
|
||||
input [4:0] ID_Rt,
|
||||
input ID_WantRsByEX,
|
||||
input ID_NeedRsByEX,
|
||||
input ID_WantRtByEX,
|
||||
input ID_NeedRtByEX,
|
||||
// Exception Control/Info
|
||||
input ID_KernelMode,
|
||||
input [31:0] ID_RestartPC,
|
||||
input ID_IsBDS,
|
||||
input ID_Trap,
|
||||
input ID_TrapCond,
|
||||
input ID_EX_CanErr,
|
||||
input ID_M_CanErr,
|
||||
// Data Signals
|
||||
input [31:0] ID_ReadData1,
|
||||
input [31:0] ID_ReadData2,
|
||||
input [16:0] ID_SignExtImm, // ID_Rd, ID_Shamt included here
|
||||
// ----------------
|
||||
output reg EX_Link,
|
||||
output [1:0] EX_LinkRegDst,
|
||||
output reg EX_ALUSrcImm,
|
||||
output reg [4:0] EX_ALUOp,
|
||||
output reg EX_Movn,
|
||||
output reg EX_Movz,
|
||||
output reg EX_LLSC,
|
||||
output reg EX_MemRead,
|
||||
output reg EX_MemWrite,
|
||||
output reg EX_MemByte,
|
||||
output reg EX_MemHalf,
|
||||
output reg EX_MemSignExtend,
|
||||
output reg EX_Left,
|
||||
output reg EX_Right,
|
||||
output reg EX_RegWrite,
|
||||
output reg EX_MemtoReg,
|
||||
output reg EX_ReverseEndian,
|
||||
output reg [4:0] EX_Rs,
|
||||
output reg [4:0] EX_Rt,
|
||||
output reg EX_WantRsByEX,
|
||||
output reg EX_NeedRsByEX,
|
||||
output reg EX_WantRtByEX,
|
||||
output reg EX_NeedRtByEX,
|
||||
output reg EX_KernelMode,
|
||||
output reg [31:0] EX_RestartPC,
|
||||
output reg EX_IsBDS,
|
||||
output reg EX_Trap,
|
||||
output reg EX_TrapCond,
|
||||
output reg EX_EX_CanErr,
|
||||
output reg EX_M_CanErr,
|
||||
output reg [31:0] EX_ReadData1,
|
||||
output reg [31:0] EX_ReadData2,
|
||||
output [31:0] EX_SignExtImm,
|
||||
output [4:0] EX_Rd,
|
||||
output [4:0] EX_Shamt
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
reg [16:0] EX_SignExtImm_pre;
|
||||
reg EX_RegDst;
|
||||
assign EX_LinkRegDst = (EX_Link) ? 2'b10 : ((EX_RegDst) ? 2'b01 : 2'b00);
|
||||
assign EX_Rd = EX_SignExtImm[15:11];
|
||||
assign EX_Shamt = EX_SignExtImm[10:6];
|
||||
assign EX_SignExtImm = (EX_SignExtImm_pre[16]) ? {15'h7fff, EX_SignExtImm_pre[16:0]} : {15'h0000, EX_SignExtImm_pre[16:0]};
|
||||
|
||||
always @(posedge clock) begin
|
||||
EX_Link <= (reset) ? 0 : ((EX_Stall) ? EX_Link : ID_Link);
|
||||
EX_RegDst <= (reset) ? 0 : ((EX_Stall) ? EX_RegDst : ID_RegDst);
|
||||
EX_ALUSrcImm <= (reset) ? 0 : ((EX_Stall) ? EX_ALUSrcImm : ID_ALUSrcImm);
|
||||
EX_ALUOp <= (reset) ? 5'b0 : ((EX_Stall) ? EX_ALUOp : ((ID_Stall | ID_Flush) ? 5'b0 : ID_ALUOp));
|
||||
EX_Movn <= (reset) ? 0 : ((EX_Stall) ? EX_Movn : ID_Movn);
|
||||
EX_Movz <= (reset) ? 0 : ((EX_Stall) ? EX_Movz : ID_Movz);
|
||||
EX_LLSC <= (reset) ? 0 : ((EX_Stall) ? EX_LLSC : ID_LLSC);
|
||||
EX_MemRead <= (reset) ? 0 : ((EX_Stall) ? EX_MemRead : ((ID_Stall | ID_Flush) ? 0 : ID_MemRead));
|
||||
EX_MemWrite <= (reset) ? 0 : ((EX_Stall) ? EX_MemWrite : ((ID_Stall | ID_Flush) ? 0 : ID_MemWrite));
|
||||
EX_MemByte <= (reset) ? 0 : ((EX_Stall) ? EX_MemByte : ID_MemByte);
|
||||
EX_MemHalf <= (reset) ? 0 : ((EX_Stall) ? EX_MemHalf : ID_MemHalf);
|
||||
EX_MemSignExtend <= (reset) ? 0 : ((EX_Stall) ? EX_MemSignExtend : ID_MemSignExtend);
|
||||
EX_Left <= (reset) ? 0 : ((EX_Stall) ? EX_Left : ID_Left);
|
||||
EX_Right <= (reset) ? 0 : ((EX_Stall) ? EX_Right : ID_Right);
|
||||
EX_RegWrite <= (reset) ? 0 : ((EX_Stall) ? EX_RegWrite : ((ID_Stall | ID_Flush) ? 0 : ID_RegWrite));
|
||||
EX_MemtoReg <= (reset) ? 0 : ((EX_Stall) ? EX_MemtoReg : ID_MemtoReg);
|
||||
EX_ReverseEndian <= (reset) ? 0 : ((EX_Stall) ? EX_ReverseEndian : ID_ReverseEndian);
|
||||
EX_RestartPC <= (reset) ? 32'b0 : ((EX_Stall) ? EX_RestartPC : ID_RestartPC);
|
||||
EX_IsBDS <= (reset) ? 0 : ((EX_Stall) ? EX_IsBDS : ID_IsBDS);
|
||||
EX_Trap <= (reset) ? 0 : ((EX_Stall) ? EX_Trap : ((ID_Stall | ID_Flush) ? 0 : ID_Trap));
|
||||
EX_TrapCond <= (reset) ? 0 : ((EX_Stall) ? EX_TrapCond : ID_TrapCond);
|
||||
EX_EX_CanErr <= (reset) ? 0 : ((EX_Stall) ? EX_EX_CanErr : ((ID_Stall | ID_Flush) ? 0 : ID_EX_CanErr));
|
||||
EX_M_CanErr <= (reset) ? 0 : ((EX_Stall) ? EX_M_CanErr : ((ID_Stall | ID_Flush) ? 0 : ID_M_CanErr));
|
||||
EX_ReadData1 <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData1 : ID_ReadData1);
|
||||
EX_ReadData2 <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData2 : ID_ReadData2);
|
||||
EX_SignExtImm_pre <= (reset) ? 17'b0 : ((EX_Stall) ? EX_SignExtImm_pre : ID_SignExtImm);
|
||||
EX_Rs <= (reset) ? 5'b0 : ((EX_Stall) ? EX_Rs : ID_Rs);
|
||||
EX_Rt <= (reset) ? 5'b0 : ((EX_Stall) ? EX_Rt : ID_Rt);
|
||||
EX_WantRsByEX <= (reset) ? 0 : ((EX_Stall) ? EX_WantRsByEX : ((ID_Stall | ID_Flush) ? 0 : ID_WantRsByEX));
|
||||
EX_NeedRsByEX <= (reset) ? 0 : ((EX_Stall) ? EX_NeedRsByEX : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRsByEX));
|
||||
EX_WantRtByEX <= (reset) ? 0 : ((EX_Stall) ? EX_WantRtByEX : ((ID_Stall | ID_Flush) ? 0 : ID_WantRtByEX));
|
||||
EX_NeedRtByEX <= (reset) ? 0 : ((EX_Stall) ? EX_NeedRtByEX : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRtByEX));
|
||||
EX_KernelMode <= (reset) ? 0 : ((EX_Stall) ? EX_KernelMode : ID_KernelMode);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : IFID_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Instruction Fetch
|
||||
* and Instruction Decode stages.
|
||||
*/
|
||||
module IFID_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input IF_Flush,
|
||||
input IF_Stall,
|
||||
input ID_Stall,
|
||||
// Control Signals
|
||||
input [31:0] IF_Instruction,
|
||||
// Data Signals
|
||||
input [31:0] IF_PCAdd4,
|
||||
input [31:0] IF_PC,
|
||||
input IF_IsBDS,
|
||||
// ------------------
|
||||
output reg [31:0] ID_Instruction,
|
||||
output reg [31:0] ID_PCAdd4,
|
||||
output reg [31:0] ID_RestartPC,
|
||||
output reg ID_IsBDS,
|
||||
output reg ID_IsFlushed
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
|
||||
/***
|
||||
The signal 'ID_IsFlushed' is needed because of interrupts. Normally, a flushed instruction
|
||||
is a NOP which will never cause an exception and thus its restart PC will never be needed
|
||||
or used. However, interrupts are detected in ID and may occur when any instruction, flushed
|
||||
or not, is in the ID stage. It is an error to save the restart PC of a flushed instruction
|
||||
since it was never supposed to execute (such as the "delay slot" after ERET or the branch
|
||||
delay slot after a canceled Branch Likely instruction). A simple way to prevent this is to
|
||||
pass a signal to ID indicating that its instruction was flushed. Interrupt detection is then
|
||||
masked when this signal is high, and the interrupt will trigger on the next instruction load to ID.
|
||||
***/
|
||||
|
||||
always @(posedge clock) begin
|
||||
ID_Instruction <= (reset) ? 32'b0 : ((ID_Stall) ? ID_Instruction : ((IF_Stall | IF_Flush) ? 32'b0 : IF_Instruction));
|
||||
ID_PCAdd4 <= (reset) ? 32'b0 : ((ID_Stall) ? ID_PCAdd4 : IF_PCAdd4);
|
||||
ID_IsBDS <= (reset) ? 0 : ((ID_Stall) ? ID_IsBDS : IF_IsBDS);
|
||||
ID_RestartPC <= (reset) ? 32'b0 : ((ID_Stall | IF_IsBDS) ? ID_RestartPC : IF_PC);
|
||||
ID_IsFlushed <= (reset) ? 0 : ((ID_Stall) ? ID_IsFlushed : IF_Flush);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : MEMWB_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Memory and Writeback stages.
|
||||
*/
|
||||
module MEMWB_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input M_Flush,
|
||||
input M_Stall,
|
||||
input WB_Stall,
|
||||
// Control Signals
|
||||
input M_RegWrite,
|
||||
input M_MemtoReg,
|
||||
// Data Signals
|
||||
input [31:0] M_ReadData,
|
||||
input [31:0] M_ALU_Result,
|
||||
input [4:0] M_RtRd,
|
||||
// ----------------
|
||||
output reg WB_RegWrite,
|
||||
output reg WB_MemtoReg,
|
||||
output reg [31:0] WB_ReadData,
|
||||
output reg [31:0] WB_ALU_Result,
|
||||
output reg [4:0] WB_RtRd
|
||||
);
|
||||
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
|
||||
Since WB is the final stage in the pipeline, it would normally never stall.
|
||||
However, because the MEM stage may be using data forwarded from WB, WB must stall
|
||||
when MEM is stalled. If it didn't, the forward data would not be preserved. If
|
||||
the processor didn't forward any data, a stall would not be needed.
|
||||
|
||||
In practice, the only time WB stalls is when forwarding for a Lw->Sw sequence, since
|
||||
MEM doesn't need the data until its stage, but it does not latch the forwarded data.
|
||||
This means WB_Stall is probably identical to M_Stall. There is no speed difference by
|
||||
allowing WB to stall.
|
||||
***/
|
||||
|
||||
always @(posedge clock) begin
|
||||
WB_RegWrite <= (reset) ? 0 : ((WB_Stall) ? WB_RegWrite : ((M_Stall | M_Flush) ? 0 : M_RegWrite));
|
||||
WB_MemtoReg <= (reset) ? 0 : ((WB_Stall) ? WB_MemtoReg : M_MemtoReg);
|
||||
WB_ReadData <= (reset) ? 32'b0 : ((WB_Stall) ? WB_ReadData : M_ReadData);
|
||||
WB_ALU_Result <= (reset) ? 32'b0 : ((WB_Stall) ? WB_ALU_Result : M_ALU_Result);
|
||||
WB_RtRd <= (reset) ? 5'b0 : ((WB_Stall) ? WB_RtRd : M_RtRd);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+631
@@ -0,0 +1,631 @@
|
||||
/*
|
||||
* File : MIPS_Parameters.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 26-May-2012 GEA Release version.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Provides a language abstraction for the MIPS32-specific op-codes and
|
||||
* the processor-specific datapath, hazard, and exception bits which
|
||||
* control the processor. These parameter names are used extensively
|
||||
* throughout the processor HDL modules.
|
||||
*/
|
||||
|
||||
|
||||
/*** Exception Vector Locations ***
|
||||
|
||||
When the CPU powers up or is reset, it will begin execution at 'EXC_Vector_Base_Reset'.
|
||||
All other exceptions are the sum of a base address and offset:
|
||||
- The base address is either a bootstrap or normal value. It is controlled by
|
||||
the 'BEV' bit in the CP0 'Status' register. Both base addresses can be mapped to
|
||||
the same location.
|
||||
- The offset address is either a standard offset (which is always used for
|
||||
non-interrupt general exceptions in this processor because it lacks TLB Refill
|
||||
and Cache errors), or a special interrupt-only offset for interrupts, which is
|
||||
enabled with the 'IV' bit in the CP0 'Cause' register.
|
||||
|
||||
Current Setup:
|
||||
General exceptions go to 0x0. Interrupts go to 0x8. Booting starts at 0x10.
|
||||
*/
|
||||
parameter [31:0] EXC_Vector_Base_Reset = 32'h0000_0010; // MIPS Standard is 0xBFC0_0000
|
||||
parameter [31:0] EXC_Vector_Base_Other_NoBoot = 32'h0000_0000; // MIPS Standard is 0x8000_0000
|
||||
parameter [31:0] EXC_Vector_Base_Other_Boot = 32'h0000_0000; // MIPS Standard is 0xBFC0_0200
|
||||
parameter [31:0] EXC_Vector_Offset_General = 32'h0000_0000; // MIPS Standard is 0x0000_0180
|
||||
parameter [31:0] EXC_Vector_Offset_Special = 32'h0000_0008; // MIPS Standard is 0x0000_0200
|
||||
|
||||
|
||||
|
||||
/*** Kernel/User Memory Areas ***
|
||||
|
||||
Kernel memory starts at address 0x0. User memory starts at 'UMem_Lower' and extends to
|
||||
the end of the address space.
|
||||
|
||||
A distinction is made to protect against accesses to kernel memory while the processor
|
||||
is in user mode. Lacking MMU hardware, these addresses are physical, not virtual.
|
||||
This simple two-part division of the address space can be extended almost arbitrarily
|
||||
in the Data Memory Controller. Note that there is currently no user/kernel space check
|
||||
for the Instruction Memory, because it is assumed that instructions are in the kernel space.
|
||||
*/
|
||||
parameter [31:0] UMem_Lower = 32'h08000000;
|
||||
|
||||
|
||||
|
||||
/*** Processor Endianness ***
|
||||
|
||||
The MIPS Configuration Register (CP0 Register 16 Select 0) specifies the processor's
|
||||
endianness. A processor in user mode may switch to reverse endianness, which will be
|
||||
the opposite of this parameter.
|
||||
*/
|
||||
parameter Big_Endian = 1;
|
||||
|
||||
|
||||
|
||||
/*** Encodings for MIPS32 Release 1 Architecture ***/
|
||||
|
||||
|
||||
/* Op Code Categories */
|
||||
parameter [5:0] Op_Type_R = 6'b00_0000; // Standard R-Type instructions
|
||||
parameter [5:0] Op_Type_R2 = 6'b01_1100; // Extended R-Like instructions
|
||||
parameter [5:0] Op_Type_BI = 6'b00_0001; // Branch/Trap extended instructions
|
||||
parameter [5:0] Op_Type_CP0 = 6'b01_0000; // Coprocessor 0 instructions
|
||||
parameter [5:0] Op_Type_CP1 = 6'b01_0001; // Coprocessor 1 instructions (not implemented)
|
||||
parameter [5:0] Op_Type_CP2 = 6'b01_0010; // Coprocessor 2 instructions (not implemented)
|
||||
parameter [5:0] Op_Type_CP3 = 6'b01_0011; // Coprocessor 3 instructions (not implemented)
|
||||
// --------------------------------------
|
||||
parameter [5:0] Op_Add = Op_Type_R;
|
||||
parameter [5:0] Op_Addi = 6'b00_1000;
|
||||
parameter [5:0] Op_Addiu = 6'b00_1001;
|
||||
parameter [5:0] Op_Addu = Op_Type_R;
|
||||
parameter [5:0] Op_And = Op_Type_R;
|
||||
parameter [5:0] Op_Andi = 6'b00_1100;
|
||||
parameter [5:0] Op_Beq = 6'b00_0100;
|
||||
parameter [5:0] Op_Bgez = Op_Type_BI;
|
||||
parameter [5:0] Op_Bgezal = Op_Type_BI;
|
||||
parameter [5:0] Op_Bgtz = 6'b00_0111;
|
||||
parameter [5:0] Op_Blez = 6'b00_0110;
|
||||
parameter [5:0] Op_Bltz = Op_Type_BI;
|
||||
parameter [5:0] Op_Bltzal = Op_Type_BI;
|
||||
parameter [5:0] Op_Bne = 6'b00_0101;
|
||||
parameter [5:0] Op_Break = Op_Type_R;
|
||||
parameter [5:0] Op_Clo = Op_Type_R2;
|
||||
parameter [5:0] Op_Clz = Op_Type_R2;
|
||||
parameter [5:0] Op_Div = Op_Type_R;
|
||||
parameter [5:0] Op_Divu = Op_Type_R;
|
||||
parameter [5:0] Op_Eret = Op_Type_CP0;
|
||||
parameter [5:0] Op_J = 6'b00_0010;
|
||||
parameter [5:0] Op_Jal = 6'b00_0011;
|
||||
parameter [5:0] Op_Jalr = Op_Type_R;
|
||||
parameter [5:0] Op_Jr = Op_Type_R;
|
||||
parameter [5:0] Op_Lb = 6'b10_0000;
|
||||
parameter [5:0] Op_Lbu = 6'b10_0100;
|
||||
parameter [5:0] Op_Lh = 6'b10_0001;
|
||||
parameter [5:0] Op_Lhu = 6'b10_0101;
|
||||
parameter [5:0] Op_Ll = 6'b11_0000;
|
||||
parameter [5:0] Op_Lui = 6'b00_1111;
|
||||
parameter [5:0] Op_Lw = 6'b10_0011;
|
||||
parameter [5:0] Op_Lwl = 6'b10_0010;
|
||||
parameter [5:0] Op_Lwr = 6'b10_0110;
|
||||
parameter [5:0] Op_Madd = Op_Type_R2;
|
||||
parameter [5:0] Op_Maddu = Op_Type_R2;
|
||||
parameter [5:0] Op_Mfc0 = Op_Type_CP0;
|
||||
parameter [5:0] Op_Mfhi = Op_Type_R;
|
||||
parameter [5:0] Op_Mflo = Op_Type_R;
|
||||
parameter [5:0] Op_Movn = Op_Type_R;
|
||||
parameter [5:0] Op_Movz = Op_Type_R;
|
||||
parameter [5:0] Op_Msub = Op_Type_R2;
|
||||
parameter [5:0] Op_Msubu = Op_Type_R2;
|
||||
parameter [5:0] Op_Mtc0 = Op_Type_CP0;
|
||||
parameter [5:0] Op_Mthi = Op_Type_R;
|
||||
parameter [5:0] Op_Mtlo = Op_Type_R;
|
||||
parameter [5:0] Op_Mul = Op_Type_R2;
|
||||
parameter [5:0] Op_Mult = Op_Type_R;
|
||||
parameter [5:0] Op_Multu = Op_Type_R;
|
||||
parameter [5:0] Op_Nor = Op_Type_R;
|
||||
parameter [5:0] Op_Or = Op_Type_R;
|
||||
parameter [5:0] Op_Ori = 6'b00_1101;
|
||||
parameter [5:0] Op_Pref = 6'b11_0011; // Prefetch does nothing in this implementation.
|
||||
parameter [5:0] Op_Sb = 6'b10_1000;
|
||||
parameter [5:0] Op_Sc = 6'b11_1000;
|
||||
parameter [5:0] Op_Sh = 6'b10_1001;
|
||||
parameter [5:0] Op_Sll = Op_Type_R;
|
||||
parameter [5:0] Op_Sllv = Op_Type_R;
|
||||
parameter [5:0] Op_Slt = Op_Type_R;
|
||||
parameter [5:0] Op_Slti = 6'b00_1010;
|
||||
parameter [5:0] Op_Sltiu = 6'b00_1011;
|
||||
parameter [5:0] Op_Sltu = Op_Type_R;
|
||||
parameter [5:0] Op_Sra = Op_Type_R;
|
||||
parameter [5:0] Op_Srav = Op_Type_R;
|
||||
parameter [5:0] Op_Srl = Op_Type_R;
|
||||
parameter [5:0] Op_Srlv = Op_Type_R;
|
||||
parameter [5:0] Op_Sub = Op_Type_R;
|
||||
parameter [5:0] Op_Subu = Op_Type_R;
|
||||
parameter [5:0] Op_Sw = 6'b10_1011;
|
||||
parameter [5:0] Op_Swl = 6'b10_1010;
|
||||
parameter [5:0] Op_Swr = 6'b10_1110;
|
||||
parameter [5:0] Op_Syscall = Op_Type_R;
|
||||
parameter [5:0] Op_Teq = Op_Type_R;
|
||||
parameter [5:0] Op_Teqi = Op_Type_BI;
|
||||
parameter [5:0] Op_Tge = Op_Type_R;
|
||||
parameter [5:0] Op_Tgei = Op_Type_BI;
|
||||
parameter [5:0] Op_Tgeiu = Op_Type_BI;
|
||||
parameter [5:0] Op_Tgeu = Op_Type_R;
|
||||
parameter [5:0] Op_Tlt = Op_Type_R;
|
||||
parameter [5:0] Op_Tlti = Op_Type_BI;
|
||||
parameter [5:0] Op_Tltiu = Op_Type_BI;
|
||||
parameter [5:0] Op_Tltu = Op_Type_R;
|
||||
parameter [5:0] Op_Tne = Op_Type_R;
|
||||
parameter [5:0] Op_Tnei = Op_Type_BI;
|
||||
parameter [5:0] Op_Xor = Op_Type_R;
|
||||
parameter [5:0] Op_Xori = 6'b00_1110;
|
||||
|
||||
/* Op Code Rt fields for Branches & Traps */
|
||||
parameter [4:0] OpRt_Bgez = 5'b00001;
|
||||
parameter [4:0] OpRt_Bgezal = 5'b10001;
|
||||
parameter [4:0] OpRt_Bltz = 5'b00000;
|
||||
parameter [4:0] OpRt_Bltzal = 5'b10000;
|
||||
parameter [4:0] OpRt_Teqi = 5'b01100;
|
||||
parameter [4:0] OpRt_Tgei = 5'b01000;
|
||||
parameter [4:0] OpRt_Tgeiu = 5'b01001;
|
||||
parameter [4:0] OpRt_Tlti = 5'b01010;
|
||||
parameter [4:0] OpRt_Tltiu = 5'b01011;
|
||||
parameter [4:0] OpRt_Tnei = 5'b01110;
|
||||
|
||||
/* Op Code Rs fields for Coprocessors */
|
||||
parameter [4:0] OpRs_MF = 5'b00000;
|
||||
parameter [4:0] OpRs_MT = 5'b00100;
|
||||
|
||||
/* Special handling for ERET */
|
||||
parameter [4:0] OpRs_ERET = 5'b10000;
|
||||
parameter [5:0] Funct_ERET = 6'b011000;
|
||||
|
||||
/* Function Codes for R-Type Op Codes */
|
||||
parameter [5:0] Funct_Add = 6'b10_0000;
|
||||
parameter [5:0] Funct_Addu = 6'b10_0001;
|
||||
parameter [5:0] Funct_And = 6'b10_0100;
|
||||
parameter [5:0] Funct_Break = 6'b00_1101;
|
||||
parameter [5:0] Funct_Clo = 6'b10_0001; // same as Addu
|
||||
parameter [5:0] Funct_Clz = 6'b10_0000; // same as Add
|
||||
parameter [5:0] Funct_Div = 6'b01_1010;
|
||||
parameter [5:0] Funct_Divu = 6'b01_1011;
|
||||
parameter [5:0] Funct_Jr = 6'b00_1000;
|
||||
parameter [5:0] Funct_Jalr = 6'b00_1001;
|
||||
parameter [5:0] Funct_Madd = 6'b00_0000;
|
||||
parameter [5:0] Funct_Maddu = 6'b00_0001;
|
||||
parameter [5:0] Funct_Mfhi = 6'b01_0000;
|
||||
parameter [5:0] Funct_Mflo = 6'b01_0010;
|
||||
parameter [5:0] Funct_Movn = 6'b00_1011;
|
||||
parameter [5:0] Funct_Movz = 6'b00_1010;
|
||||
parameter [5:0] Funct_Msub = 6'b00_0100; // same as Sllv
|
||||
parameter [5:0] Funct_Msubu = 6'b00_0101;
|
||||
parameter [5:0] Funct_Mthi = 6'b01_0001;
|
||||
parameter [5:0] Funct_Mtlo = 6'b01_0011;
|
||||
parameter [5:0] Funct_Mul = 6'b00_0010; // same as Srl
|
||||
parameter [5:0] Funct_Mult = 6'b01_1000;
|
||||
parameter [5:0] Funct_Multu = 6'b01_1001;
|
||||
parameter [5:0] Funct_Nor = 6'b10_0111;
|
||||
parameter [5:0] Funct_Or = 6'b10_0101;
|
||||
parameter [5:0] Funct_Sll = 6'b00_0000;
|
||||
parameter [5:0] Funct_Sllv = 6'b00_0100;
|
||||
parameter [5:0] Funct_Slt = 6'b10_1010;
|
||||
parameter [5:0] Funct_Sltu = 6'b10_1011;
|
||||
parameter [5:0] Funct_Sra = 6'b00_0011;
|
||||
parameter [5:0] Funct_Srav = 6'b00_0111;
|
||||
parameter [5:0] Funct_Srl = 6'b00_0010;
|
||||
parameter [5:0] Funct_Srlv = 6'b00_0110;
|
||||
parameter [5:0] Funct_Sub = 6'b10_0010;
|
||||
parameter [5:0] Funct_Subu = 6'b10_0011;
|
||||
parameter [5:0] Funct_Syscall = 6'b00_1100;
|
||||
parameter [5:0] Funct_Teq = 6'b11_0100;
|
||||
parameter [5:0] Funct_Tge = 6'b11_0000;
|
||||
parameter [5:0] Funct_Tgeu = 6'b11_0001;
|
||||
parameter [5:0] Funct_Tlt = 6'b11_0010;
|
||||
parameter [5:0] Funct_Tltu = 6'b11_0011;
|
||||
parameter [5:0] Funct_Tne = 6'b11_0110;
|
||||
parameter [5:0] Funct_Xor = 6'b10_0110;
|
||||
|
||||
/* ALU Operations (Implementation) */
|
||||
parameter [4:0] AluOp_Add = 5'd1;
|
||||
parameter [4:0] AluOp_Addu = 5'd0;
|
||||
parameter [4:0] AluOp_And = 5'd2;
|
||||
parameter [4:0] AluOp_Clo = 5'd3;
|
||||
parameter [4:0] AluOp_Clz = 5'd4;
|
||||
parameter [4:0] AluOp_Div = 5'd5;
|
||||
parameter [4:0] AluOp_Divu = 5'd6;
|
||||
parameter [4:0] AluOp_Madd = 5'd7;
|
||||
parameter [4:0] AluOp_Maddu = 5'd8;
|
||||
parameter [4:0] AluOp_Mfhi = 5'd9;
|
||||
parameter [4:0] AluOp_Mflo = 5'd10;
|
||||
parameter [4:0] AluOp_Msub = 5'd13;
|
||||
parameter [4:0] AluOp_Msubu = 5'd14;
|
||||
parameter [4:0] AluOp_Mthi = 5'd11;
|
||||
parameter [4:0] AluOp_Mtlo = 5'd12;
|
||||
parameter [4:0] AluOp_Mul = 5'd15;
|
||||
parameter [4:0] AluOp_Mult = 5'd16;
|
||||
parameter [4:0] AluOp_Multu = 5'd17;
|
||||
parameter [4:0] AluOp_Nor = 5'd18;
|
||||
parameter [4:0] AluOp_Or = 5'd19;
|
||||
parameter [4:0] AluOp_Sll = 5'd20;
|
||||
parameter [4:0] AluOp_Sllc = 5'd21; // Move this if another AluOp is needed
|
||||
parameter [4:0] AluOp_Sllv = 5'd22;
|
||||
parameter [4:0] AluOp_Slt = 5'd23;
|
||||
parameter [4:0] AluOp_Sltu = 5'd24;
|
||||
parameter [4:0] AluOp_Sra = 5'd25;
|
||||
parameter [4:0] AluOp_Srav = 5'd26;
|
||||
parameter [4:0] AluOp_Srl = 5'd27;
|
||||
parameter [4:0] AluOp_Srlv = 5'd28;
|
||||
parameter [4:0] AluOp_Sub = 5'd29;
|
||||
parameter [4:0] AluOp_Subu = 5'd30;
|
||||
parameter [4:0] AluOp_Xor = 5'd31;
|
||||
|
||||
|
||||
// Movc:10->11, Trap:9->10, TrapCond:8->9, RegDst:7->8
|
||||
|
||||
/*** Datapath ***
|
||||
|
||||
All Signals are Active High. Branching and Jump signals (determined by "PCSrc"),
|
||||
as well as ALU operation signals ("ALUOp") are handled by the controller and are not found here.
|
||||
|
||||
Bit Name Description
|
||||
------------------------------
|
||||
15: PCSrc (Instruction Type)
|
||||
14: 11: Instruction is Jump to Register
|
||||
10: Instruction is Branch
|
||||
01: Instruction is Jump to Immediate
|
||||
00: Instruction does not branch nor jump
|
||||
13: Link (Link on Branch/Jump)
|
||||
------------------------------
|
||||
12: ALUSrc (ALU Source) [0=ALU input B is 2nd register file output; 1=Immediate value]
|
||||
11: Movc (Conditional Move)
|
||||
10: Trap (Trap Instruction)
|
||||
9 : TrapCond (Trap Condition) [0=ALU result is 0; 1=ALU result is not 0]
|
||||
8 : RegDst (Register File Target) [0=Rt field; 1=Rd field]
|
||||
------------------------------
|
||||
7 : LLSC (Load Linked or Store Conditional)
|
||||
6 : MemRead (Data Memory Read)
|
||||
5 : MemWrite (Data Memory Write)
|
||||
4 : MemHalf (Half Word Memory Access)
|
||||
3 : MemByte (Byte size Memory Access)
|
||||
2 : MemSignExtend (Sign Extend Read Memory) [0=Zero Extend; 1=Sign Extend]
|
||||
------------------------------
|
||||
1 : RegWrite (Register File Write)
|
||||
0 : MemtoReg (Memory to Register) [0=Register File write data is ALU output; 1=Is Data Memory]
|
||||
------------------------------
|
||||
*/
|
||||
parameter [15:0] DP_None = 16'b000_00000_000000_00; // Instructions which require nothing of the main datapath.
|
||||
parameter [15:0] DP_RType = 16'b000_00001_000000_10; // Standard R-Type
|
||||
parameter [15:0] DP_IType = 16'b000_10000_000000_10; // Standard I-Type
|
||||
parameter [15:0] DP_Branch = 16'b100_00000_000000_00; // Standard Branch
|
||||
parameter [15:0] DP_BranchLink = 16'b101_00000_000000_10; // Branch and Link
|
||||
parameter [15:0] DP_HiLoWr = 16'b000_00000_000000_00; // Write to Hi/Lo ALU register (Div,Divu,Mult,Multu,Mthi,Mtlo). Currently 'DP_None'.
|
||||
parameter [15:0] DP_Jump = 16'b010_00000_000000_00; // Standard Jump
|
||||
parameter [15:0] DP_JumpLink = 16'b011_00000_000000_10; // Jump and Link
|
||||
parameter [15:0] DP_JumpLinkReg = 16'b111_00000_000000_10; // Jump and Link Register
|
||||
parameter [15:0] DP_JumpReg = 16'b110_00000_000000_00; // Jump Register
|
||||
parameter [15:0] DP_LoadByteS = 16'b000_10000_010011_11; // Load Byte Signed
|
||||
parameter [15:0] DP_LoadByteU = 16'b000_10000_010010_11; // Load Byte Unsigned
|
||||
parameter [15:0] DP_LoadHalfS = 16'b000_10000_010101_11; // Load Half Signed
|
||||
parameter [15:0] DP_LoadHalfU = 16'b000_10000_010100_11; // Load Half Unsigned
|
||||
parameter [15:0] DP_LoadWord = 16'b000_10000_010000_11; // Load Word
|
||||
parameter [15:0] DP_ExtWrRt = 16'b000_00000_000000_10; // A DP-external write to Rt
|
||||
parameter [15:0] DP_ExtWrRd = 16'b000_00001_000000_10; // A DP-external write to Rd
|
||||
parameter [15:0] DP_Movc = 16'b000_01001_000000_10; // Conditional Move
|
||||
parameter [15:0] DP_LoadLinked = 16'b000_10000_110000_11; // Load Linked
|
||||
parameter [15:0] DP_StoreCond = 16'b000_10000_101000_11; // Store Conditional
|
||||
parameter [15:0] DP_StoreByte = 16'b000_10000_001010_00; // Store Byte
|
||||
parameter [15:0] DP_StoreHalf = 16'b000_10000_001100_00; // Store Half
|
||||
parameter [15:0] DP_StoreWord = 16'b000_10000_001000_00; // Store Word
|
||||
parameter [15:0] DP_TrapRegCNZ = 16'b000_00110_000000_00; // Trap using Rs and Rt, non-zero ALU (Tlt, Tltu, Tne)
|
||||
parameter [15:0] DP_TrapRegCZ = 16'b000_00100_000000_00; // Trap using RS and Rt, zero ALU (Teq, Tge, Tgeu)
|
||||
parameter [15:0] DP_TrapImmCNZ = 16'b000_10110_000000_00; // Trap using Rs and Imm, non-zero ALU (Tlti, Tltiu, Tnei)
|
||||
parameter [15:0] DP_TrapImmCZ = 16'b000_10100_000000_00; // Trap using Rs and Imm, zero ALU (Teqi, Tgei, Tgeiu)
|
||||
//--------------------------------------------------------
|
||||
parameter [15:0] DP_Add = DP_RType;
|
||||
parameter [15:0] DP_Addi = DP_IType;
|
||||
parameter [15:0] DP_Addiu = DP_IType;
|
||||
parameter [15:0] DP_Addu = DP_RType;
|
||||
parameter [15:0] DP_And = DP_RType;
|
||||
parameter [15:0] DP_Andi = DP_IType;
|
||||
parameter [15:0] DP_Beq = DP_Branch;
|
||||
parameter [15:0] DP_Bgez = DP_Branch;
|
||||
parameter [15:0] DP_Bgezal = DP_BranchLink;
|
||||
parameter [15:0] DP_Bgtz = DP_Branch;
|
||||
parameter [15:0] DP_Blez = DP_Branch;
|
||||
parameter [15:0] DP_Bltz = DP_Branch;
|
||||
parameter [15:0] DP_Bltzal = DP_BranchLink;
|
||||
parameter [15:0] DP_Bne = DP_Branch;
|
||||
parameter [15:0] DP_Break = DP_None;
|
||||
parameter [15:0] DP_Clo = DP_RType;
|
||||
parameter [15:0] DP_Clz = DP_RType;
|
||||
parameter [15:0] DP_Div = DP_HiLoWr;
|
||||
parameter [15:0] DP_Divu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Eret = DP_None;
|
||||
parameter [15:0] DP_J = DP_Jump;
|
||||
parameter [15:0] DP_Jal = DP_JumpLink;
|
||||
parameter [15:0] DP_Jalr = DP_JumpLinkReg;
|
||||
parameter [15:0] DP_Jr = DP_JumpReg;
|
||||
parameter [15:0] DP_Lb = DP_LoadByteS;
|
||||
parameter [15:0] DP_Lbu = DP_LoadByteU;
|
||||
parameter [15:0] DP_Lh = DP_LoadHalfS;
|
||||
parameter [15:0] DP_Lhu = DP_LoadHalfU;
|
||||
parameter [15:0] DP_Ll = DP_LoadLinked;
|
||||
parameter [15:0] DP_Lui = DP_IType;
|
||||
parameter [15:0] DP_Lw = DP_LoadWord;
|
||||
parameter [15:0] DP_Lwl = DP_LoadWord;
|
||||
parameter [15:0] DP_Lwr = DP_LoadWord;
|
||||
parameter [15:0] DP_Madd = DP_HiLoWr;
|
||||
parameter [15:0] DP_Maddu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mfc0 = DP_ExtWrRt;
|
||||
parameter [15:0] DP_Mfhi = DP_ExtWrRd;
|
||||
parameter [15:0] DP_Mflo = DP_ExtWrRd;
|
||||
parameter [15:0] DP_Movn = DP_Movc;
|
||||
parameter [15:0] DP_Movz = DP_Movc;
|
||||
parameter [15:0] DP_Msub = DP_HiLoWr;
|
||||
parameter [15:0] DP_Msubu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mtc0 = DP_None;
|
||||
parameter [15:0] DP_Mthi = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mtlo = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mul = DP_RType;
|
||||
parameter [15:0] DP_Mult = DP_HiLoWr;
|
||||
parameter [15:0] DP_Multu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Nor = DP_RType;
|
||||
parameter [15:0] DP_Or = DP_RType;
|
||||
parameter [15:0] DP_Ori = DP_IType;
|
||||
parameter [15:0] DP_Pref = DP_None; // Not Implemented
|
||||
parameter [15:0] DP_Sb = DP_StoreByte;
|
||||
parameter [15:0] DP_Sc = DP_StoreCond;
|
||||
parameter [15:0] DP_Sh = DP_StoreHalf;
|
||||
parameter [15:0] DP_Sll = DP_RType;
|
||||
parameter [15:0] DP_Sllv = DP_RType;
|
||||
parameter [15:0] DP_Slt = DP_RType;
|
||||
parameter [15:0] DP_Slti = DP_IType;
|
||||
parameter [15:0] DP_Sltiu = DP_IType;
|
||||
parameter [15:0] DP_Sltu = DP_RType;
|
||||
parameter [15:0] DP_Sra = DP_RType;
|
||||
parameter [15:0] DP_Srav = DP_RType;
|
||||
parameter [15:0] DP_Srl = DP_RType;
|
||||
parameter [15:0] DP_Srlv = DP_RType;
|
||||
parameter [15:0] DP_Sub = DP_RType;
|
||||
parameter [15:0] DP_Subu = DP_RType;
|
||||
parameter [15:0] DP_Sw = DP_StoreWord;
|
||||
parameter [15:0] DP_Swl = DP_StoreWord;
|
||||
parameter [15:0] DP_Swr = DP_StoreWord;
|
||||
parameter [15:0] DP_Syscall = DP_None;
|
||||
parameter [15:0] DP_Teq = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Teqi = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tge = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Tgei = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tgeiu = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tgeu = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Tlt = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tlti = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Tltiu = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Tltu = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tne = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tnei = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Xor = DP_RType;
|
||||
parameter [15:0] DP_Xori = DP_IType;
|
||||
|
||||
|
||||
|
||||
|
||||
/*** Exception Information ***
|
||||
|
||||
All signals are Active High.
|
||||
|
||||
Bit Meaning
|
||||
------------
|
||||
2: Instruction can cause exceptions in ID
|
||||
1: Instruction can cause exceptions in EX
|
||||
0: Instruction can cause exceptions in MEM
|
||||
*/
|
||||
parameter [2:0] EXC_None = 3'b000;
|
||||
parameter [2:0] EXC_ID = 3'b100;
|
||||
parameter [2:0] EXC_EX = 3'b010;
|
||||
parameter [2:0] EXC_MEM = 3'b001;
|
||||
//--------------------------------
|
||||
parameter [2:0] EXC_Add = EXC_EX;
|
||||
parameter [2:0] EXC_Addi = EXC_EX;
|
||||
parameter [2:0] EXC_Addiu = EXC_None;
|
||||
parameter [2:0] EXC_Addu = EXC_None;
|
||||
parameter [2:0] EXC_And = EXC_None;
|
||||
parameter [2:0] EXC_Andi = EXC_None;
|
||||
parameter [2:0] EXC_Beq = EXC_None;
|
||||
parameter [2:0] EXC_Bgez = EXC_None;
|
||||
parameter [2:0] EXC_Bgezal = EXC_None;
|
||||
parameter [2:0] EXC_Bgtz = EXC_None;
|
||||
parameter [2:0] EXC_Blez = EXC_None;
|
||||
parameter [2:0] EXC_Bltz = EXC_None;
|
||||
parameter [2:0] EXC_Bltzal = EXC_None;
|
||||
parameter [2:0] EXC_Bne = EXC_None;
|
||||
parameter [2:0] EXC_Break = EXC_ID;
|
||||
parameter [2:0] EXC_Clo = EXC_None;
|
||||
parameter [2:0] EXC_Clz = EXC_None;
|
||||
parameter [2:0] EXC_Div = EXC_None;
|
||||
parameter [2:0] EXC_Divu = EXC_None;
|
||||
parameter [2:0] EXC_Eret = EXC_ID;
|
||||
parameter [2:0] EXC_J = EXC_None;
|
||||
parameter [2:0] EXC_Jal = EXC_None;
|
||||
parameter [2:0] EXC_Jalr = EXC_None;
|
||||
parameter [2:0] EXC_Jr = EXC_None;
|
||||
parameter [2:0] EXC_Lb = EXC_MEM;
|
||||
parameter [2:0] EXC_Lbu = EXC_MEM;
|
||||
parameter [2:0] EXC_Lh = EXC_MEM;
|
||||
parameter [2:0] EXC_Lhu = EXC_MEM;
|
||||
parameter [2:0] EXC_Ll = EXC_MEM;
|
||||
parameter [2:0] EXC_Lui = EXC_None;
|
||||
parameter [2:0] EXC_Lw = EXC_MEM;
|
||||
parameter [2:0] EXC_Lwl = EXC_MEM;
|
||||
parameter [2:0] EXC_Lwr = EXC_MEM;
|
||||
parameter [2:0] EXC_Madd = EXC_None;
|
||||
parameter [2:0] EXC_Maddu = EXC_None;
|
||||
parameter [2:0] EXC_Mfc0 = EXC_ID;
|
||||
parameter [2:0] EXC_Mfhi = EXC_None;
|
||||
parameter [2:0] EXC_Mflo = EXC_None;
|
||||
parameter [2:0] EXC_Movn = EXC_None;
|
||||
parameter [2:0] EXC_Movz = EXC_None;
|
||||
parameter [2:0] EXC_Msub = EXC_None;
|
||||
parameter [2:0] EXC_Msubu = EXC_None;
|
||||
parameter [2:0] EXC_Mtc0 = EXC_ID;
|
||||
parameter [2:0] EXC_Mthi = EXC_None;
|
||||
parameter [2:0] EXC_Mtlo = EXC_None;
|
||||
parameter [2:0] EXC_Mul = EXC_None;
|
||||
parameter [2:0] EXC_Mult = EXC_None;
|
||||
parameter [2:0] EXC_Multu = EXC_None;
|
||||
parameter [2:0] EXC_Nor = EXC_None;
|
||||
parameter [2:0] EXC_Or = EXC_None;
|
||||
parameter [2:0] EXC_Ori = EXC_None;
|
||||
parameter [2:0] EXC_Pref = EXC_None; // XXX
|
||||
parameter [2:0] EXC_Sb = EXC_MEM;
|
||||
parameter [2:0] EXC_Sc = EXC_MEM;
|
||||
parameter [2:0] EXC_Sh = EXC_MEM;
|
||||
parameter [2:0] EXC_Sll = EXC_None;
|
||||
parameter [2:0] EXC_Sllv = EXC_None;
|
||||
parameter [2:0] EXC_Slt = EXC_None;
|
||||
parameter [2:0] EXC_Slti = EXC_None;
|
||||
parameter [2:0] EXC_Sltiu = EXC_None;
|
||||
parameter [2:0] EXC_Sltu = EXC_None;
|
||||
parameter [2:0] EXC_Sra = EXC_None;
|
||||
parameter [2:0] EXC_Srav = EXC_None;
|
||||
parameter [2:0] EXC_Srl = EXC_None;
|
||||
parameter [2:0] EXC_Srlv = EXC_None;
|
||||
parameter [2:0] EXC_Sub = EXC_EX;
|
||||
parameter [2:0] EXC_Subu = EXC_None;
|
||||
parameter [2:0] EXC_Sw = EXC_MEM;
|
||||
parameter [2:0] EXC_Swl = EXC_MEM;
|
||||
parameter [2:0] EXC_Swr = EXC_MEM;
|
||||
parameter [2:0] EXC_Syscall = EXC_ID;
|
||||
parameter [2:0] EXC_Teq = EXC_MEM;
|
||||
parameter [2:0] EXC_Teqi = EXC_MEM;
|
||||
parameter [2:0] EXC_Tge = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgei = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgeiu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgeu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tlt = EXC_MEM;
|
||||
parameter [2:0] EXC_Tlti = EXC_MEM;
|
||||
parameter [2:0] EXC_Tltiu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tltu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tne = EXC_MEM;
|
||||
parameter [2:0] EXC_Tnei = EXC_MEM;
|
||||
parameter [2:0] EXC_Xor = EXC_None;
|
||||
parameter [2:0] EXC_Xori = EXC_None;
|
||||
|
||||
|
||||
|
||||
|
||||
/*** Hazard & Forwarding Datapath ***
|
||||
|
||||
All signals are Active High.
|
||||
|
||||
Bit Meaning
|
||||
------------
|
||||
7: Wants Rs by ID
|
||||
6: Needs Rs by ID
|
||||
5: Wants Rt by ID
|
||||
4: Needs Rt by ID
|
||||
3: Wants Rs by EX
|
||||
2: Needs Rs by EX
|
||||
1: Wants Rt by EX
|
||||
0: Needs Rt by EX
|
||||
*/
|
||||
parameter [7:0] HAZ_Nothing = 8'b00000000; // Jumps, Lui, Mfhi/lo, special, etc.
|
||||
parameter [7:0] HAZ_IDRsIDRt = 8'b11110000; // Beq, Bne, Traps
|
||||
parameter [7:0] HAZ_IDRs = 8'b11000000; // Most branches, Jumps to registers
|
||||
parameter [7:0] HAZ_IDRt = 8'b00110000; // Mtc0
|
||||
parameter [7:0] HAZ_IDRtEXRs = 8'b10111100; // Movn, Movz
|
||||
parameter [7:0] HAZ_EXRsEXRt = 8'b10101111; // Many R-Type ops
|
||||
parameter [7:0] HAZ_EXRs = 8'b10001100; // Immediates: Loads, Clo/z, Mthi/lo, etc.
|
||||
parameter [7:0] HAZ_EXRsWRt = 8'b10101110; // Stores
|
||||
parameter [7:0] HAZ_EXRt = 8'b00100011; // Shifts using Shamt field
|
||||
//-----------------------------------------
|
||||
parameter [7:0] HAZ_Add = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Addi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Addiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Addu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_And = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Andi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Beq = HAZ_IDRsIDRt;
|
||||
parameter [7:0] HAZ_Bgez = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bgezal = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bgtz = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Blez = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bltz = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bltzal = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bne = HAZ_IDRsIDRt;
|
||||
parameter [7:0] HAZ_Break = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Clo = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Clz = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Div = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Divu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Eret = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_J = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Jal = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Jalr = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Jr = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Lb = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lbu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lh = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lhu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Ll = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lui = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Lw = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lwl = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Lwr = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Madd = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Maddu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mfc0 = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Mfhi = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Mflo = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Movn = HAZ_IDRtEXRs;
|
||||
parameter [7:0] HAZ_Movz = HAZ_IDRtEXRs;
|
||||
parameter [7:0] HAZ_Msub = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Msubu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mtc0 = HAZ_IDRt;
|
||||
parameter [7:0] HAZ_Mthi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Mtlo = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Mul = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mult = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Multu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Nor = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Or = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Ori = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Pref = HAZ_Nothing; // XXX
|
||||
parameter [7:0] HAZ_Sb = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sc = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sh = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sll = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Sllv = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Slt = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Slti = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Sltiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Sltu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sra = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Srav = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Srl = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Srlv = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sub = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Subu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sw = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Swl = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Swr = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Syscall = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Teq = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Teqi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tge = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tgei = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tgeiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tgeu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tlt = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tlti = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tltiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tltu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tne = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tnei = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Xor = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Xori = HAZ_EXRs;
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : MemControl.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-Jun-2011 GEA Initial design.
|
||||
* 2.0 28-Jun-2012 GEA Expanded from a simple byte/half/word unit to
|
||||
* An advanced data memory controller capable of
|
||||
* handling big/little endian, atomic and unaligned
|
||||
* memory accesses.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A Data Memory Controller which handles all read and write requests from the
|
||||
* processor to data memory. All data accesses--whether big endian, little endian,
|
||||
* byte, half, word, or unaligned transfers--are transformed into a simple read
|
||||
* and write command to data memory over a 32-bit data bus, where the read command
|
||||
* is one bit and the write command is 4 bits, one for each byte in the 32-bit word.
|
||||
*/
|
||||
module MemControl(
|
||||
input clock,
|
||||
input reset,
|
||||
input [31:0] DataIn, // Data from CPU
|
||||
input [31:0] Address, // From CPU
|
||||
input [31:0] MReadData, // Data from Memory
|
||||
input MemRead, // Memory Read command from CPU
|
||||
input MemWrite, // Memory Write command from CPU
|
||||
input DataMem_Ready, // Ready signal from Memory
|
||||
input Byte, // Load/Store is Byte (8-bit)
|
||||
input Half, // Load/Store is Half (16-bit)
|
||||
input SignExtend, // Sub-word load should be sign extended
|
||||
input KernelMode, // (Exception logic)
|
||||
input ReverseEndian, // Reverse Endian Memory for User Mode
|
||||
input LLSC, // (LLSC logic)
|
||||
input ERET, // (LLSC logic)
|
||||
input Left, // Unaligned Load/Store Word Left
|
||||
input Right, // Unaligned Load/Store Word Right
|
||||
input M_Exception_Stall,
|
||||
input IF_Stall, // XXX Clean this up between this module and HAZ/FWD
|
||||
output reg [31:0] DataOut, // Data to CPU
|
||||
output [31:0] MWriteData, // Data to Memory
|
||||
output reg [3:0] WriteEnable, // Write Enable to Memory for each of 4 bytes of Memory
|
||||
output ReadEnable, // Read Enable to Memory
|
||||
output M_Stall,
|
||||
output EXC_AdEL, // Load Exception
|
||||
output EXC_AdES // Store Exception
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
/*** Reverse Endian Mode
|
||||
Normal memory accesses in the processor are Big Endian. The endianness can be reversed
|
||||
to Little Endian in User Mode only.
|
||||
*/
|
||||
wire BE = KernelMode | ~ReverseEndian;
|
||||
|
||||
/*** Indicator that the current memory reference must be word-aligned ***/
|
||||
wire Word = ~(Half | Byte | Left | Right);
|
||||
|
||||
// Exception Detection
|
||||
wire EXC_KernelMem = ~KernelMode & (Address < UMem_Lower);
|
||||
wire EXC_Word = Word & (Address[1] | Address[0]);
|
||||
wire EXC_Half = Half & Address[0];
|
||||
assign EXC_AdEL = MemRead & (EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
assign EXC_AdES = MemWrite & (EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
|
||||
/*** Load Linked and Store Conditional logic ***
|
||||
|
||||
A 32-bit register keeps track of the address for atomic Load Linked / Store Conditional
|
||||
operations. This register can be updated during stalls since it is not visible to
|
||||
forward stages. It does not need to be flushed during exceptions, since ERET destroys
|
||||
the atomicity condition and there are no detrimental effects in an exception handler.
|
||||
|
||||
The atomic condition is set with a Load Linked instruction, and cleared on an ERET
|
||||
instruction or when any store instruction writes to one or more bytes covered by
|
||||
the word address register. It does not update on a stall condition.
|
||||
|
||||
The MIPS32 spec states that an ERET instruction between LL and SC will cause the
|
||||
atomicity condition to fail. This implementation uses the ERET signal from the ID
|
||||
stage, which means instruction sequences such as "LL SC" could appear to have an
|
||||
ERET instruction between them even though they don't. One way to fix this is to pass
|
||||
the ERET signal through the pipeline to the MEM stage. However, because of the nature
|
||||
of LL/SC operations (they occur in a loop which checks the result at each iteration),
|
||||
an ERET will normally never be inserted into the pipeline programmatically until the
|
||||
LL/SC sequence has completed (exceptions such as interrupts can still cause ERET, but
|
||||
they can still cause them in the LL SC sequence as well). In other words, by not passing
|
||||
ERET through the pipeline, the only possible effect is a performance penalty. Also this
|
||||
may be irrelevant since currently ERET stalls for forward stages which can cause exceptions,
|
||||
which includes LL and SC.
|
||||
*/
|
||||
reg [29:0] LLSC_Address;
|
||||
reg LLSC_Atomic;
|
||||
wire LLSC_MemWrite_Mask;
|
||||
|
||||
always @(posedge clock) begin
|
||||
LLSC_Address <= (reset) ? 30'b0 : (MemRead & LLSC) ? Address[31:2] : LLSC_Address;
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
LLSC_Atomic <= 0;
|
||||
end
|
||||
else if (MemRead) begin
|
||||
LLSC_Atomic <= (LLSC) ? 1 : LLSC_Atomic;
|
||||
end
|
||||
// XXX GEA Bug for Ganesh: remove "& ~IF_Stall" from below, then SC will always fail:
|
||||
else if (ERET | (~M_Stall & ~IF_Stall & MemWrite & (Address[31:2] == LLSC_Address))) begin
|
||||
LLSC_Atomic <= 0;
|
||||
end
|
||||
else begin
|
||||
LLSC_Atomic <= LLSC_Atomic;
|
||||
end
|
||||
end
|
||||
assign LLSC_MemWrite_Mask = (LLSC & MemWrite & (~LLSC_Atomic | (Address[31:2] != LLSC_Address)));
|
||||
|
||||
wire WriteCondition = MemWrite & ~(EXC_KernelMem | EXC_Word | EXC_Half) & ~LLSC_MemWrite_Mask;
|
||||
wire ReadCondition = MemRead & ~(EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
|
||||
reg RW_Mask;
|
||||
always @(posedge clock) begin
|
||||
RW_Mask <= (reset) ? 0 : (((MemWrite | MemRead) & DataMem_Ready) ? 1 : ((~M_Stall & ~IF_Stall) ? 0 : RW_Mask));
|
||||
end
|
||||
assign M_Stall = ReadEnable | (WriteEnable != 4'b0000) | DataMem_Ready | M_Exception_Stall;
|
||||
assign ReadEnable = ReadCondition & ~RW_Mask;
|
||||
|
||||
wire Half_Access_L = (Address[1] ^ BE);
|
||||
wire Half_Access_R = (Address[1] ~^ BE);
|
||||
wire Byte_Access_LL = Half_Access_L & (Address[1] ~^ Address[0]);
|
||||
wire Byte_Access_LM = Half_Access_L & (Address[0] ~^ BE);
|
||||
wire Byte_Access_RM = Half_Access_R & (Address[0] ^ BE);
|
||||
wire Byte_Access_RR = Half_Access_R & (Address[1] ~^ Address[0]);
|
||||
|
||||
// Write-Enable Signals to Memory
|
||||
always @(*) begin
|
||||
if (WriteCondition & ~RW_Mask) begin
|
||||
if (Byte) begin
|
||||
WriteEnable[3] <= Byte_Access_LL;
|
||||
WriteEnable[2] <= Byte_Access_LM;
|
||||
WriteEnable[1] <= Byte_Access_RM;
|
||||
WriteEnable[0] <= Byte_Access_RR;
|
||||
end
|
||||
else if (Half) begin
|
||||
WriteEnable[3] <= Half_Access_L;
|
||||
WriteEnable[2] <= Half_Access_L;
|
||||
WriteEnable[1] <= Half_Access_R;
|
||||
WriteEnable[0] <= Half_Access_R;
|
||||
end
|
||||
else if (Left) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : WriteEnable <= (BE) ? 4'b1111 : 4'b0001;
|
||||
2'b01 : WriteEnable <= (BE) ? 4'b0111 : 4'b0011;
|
||||
2'b10 : WriteEnable <= (BE) ? 4'b0011 : 4'b0111;
|
||||
2'b11 : WriteEnable <= (BE) ? 4'b0001 : 4'b1111;
|
||||
endcase
|
||||
end
|
||||
else if (Right) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : WriteEnable <= (BE) ? 4'b1000 : 4'b1111;
|
||||
2'b01 : WriteEnable <= (BE) ? 4'b1100 : 4'b1110;
|
||||
2'b10 : WriteEnable <= (BE) ? 4'b1110 : 4'b1100;
|
||||
2'b11 : WriteEnable <= (BE) ? 4'b1111 : 4'b1000;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
WriteEnable <= 4'b1111;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
WriteEnable <= 4'b0000;
|
||||
end
|
||||
end
|
||||
|
||||
// Data Going to Memory
|
||||
assign MWriteData[31:24] = (Byte) ? DataIn[7:0] : ((Half) ? DataIn[15:8] : DataIn[31:24]);
|
||||
assign MWriteData[23:16] = (Byte | Half) ? DataIn[7:0] : DataIn[23:16];
|
||||
assign MWriteData[15:8] = (Byte) ? DataIn[7:0] : DataIn[15:8];
|
||||
assign MWriteData[7:0] = DataIn[7:0];
|
||||
|
||||
// Data Read from Memory
|
||||
always @(*) begin
|
||||
if (Byte) begin
|
||||
if (Byte_Access_LL) begin
|
||||
DataOut <= (SignExtend & MReadData[31]) ? {24'hFFFFFF, MReadData[31:24]} : {24'h000000, MReadData[31:24]};
|
||||
end
|
||||
else if (Byte_Access_LM) begin
|
||||
DataOut <= (SignExtend & MReadData[23]) ? {24'hFFFFFF, MReadData[23:16]} : {24'h000000, MReadData[23:16]};
|
||||
end
|
||||
else if (Byte_Access_RM) begin
|
||||
DataOut <= (SignExtend & MReadData[15]) ? {24'hFFFFFF, MReadData[15:8]} : {24'h000000, MReadData[15:8]};
|
||||
end
|
||||
else begin
|
||||
DataOut <= (SignExtend & MReadData[7]) ? {24'hFFFFFF, MReadData[7:0]} : {24'h000000, MReadData[7:0]};
|
||||
end
|
||||
end
|
||||
else if (Half) begin
|
||||
if (Half_Access_L) begin
|
||||
DataOut <= (SignExtend & MReadData[31]) ? {16'hFFFF, MReadData[31:16]} : {16'h0000, MReadData[31:16]};
|
||||
end
|
||||
else begin
|
||||
DataOut <= (SignExtend & MReadData[15]) ? {16'hFFFF, MReadData[15:0]} : {16'h0000, MReadData[15:0]};
|
||||
end
|
||||
end
|
||||
else if (LLSC & MemWrite) begin
|
||||
DataOut <= (LLSC_Atomic & (Address[31:2] == LLSC_Address)) ? 32'h0000_0001 : 32'h0000_0000;
|
||||
end
|
||||
else if (Left) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : DataOut <= (BE) ? MReadData : {MReadData[7:0], DataIn[23:0]};
|
||||
2'b01 : DataOut <= (BE) ? {MReadData[23:0], DataIn[7:0]} : {MReadData[15:0], DataIn[15:0]};
|
||||
2'b10 : DataOut <= (BE) ? {MReadData[15:0], DataIn[15:0]} : {MReadData[23:0], DataIn[7:0]};
|
||||
2'b11 : DataOut <= (BE) ? {MReadData[7:0], DataIn[23:0]} : MReadData;
|
||||
endcase
|
||||
end
|
||||
else if (Right) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : DataOut <= (BE) ? {DataIn[31:8], MReadData[31:24]} : MReadData;
|
||||
2'b01 : DataOut <= (BE) ? {DataIn[31:16], MReadData[31:16]} : {DataIn[31:24], MReadData[31:8]};
|
||||
2'b10 : DataOut <= (BE) ? {DataIn[31:24], MReadData[31:8]} : {DataIn[31:16], MReadData[31:16]};
|
||||
2'b11 : DataOut <= (BE) ? MReadData : {DataIn[31:8], MReadData[31:24]};
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
DataOut <= MReadData;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Mux2.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A 2-input Mux of variable width, defaulting to 32-bit width.
|
||||
*/
|
||||
module Mux2 #(parameter WIDTH = 32)(
|
||||
input sel,
|
||||
input [(WIDTH-1):0] in0, in1,
|
||||
output [(WIDTH-1):0] out
|
||||
);
|
||||
|
||||
assign out = (sel) ? in1 : in0;
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Mux4.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A 4-input Mux of variable width, defaulting to 32-bit width.
|
||||
*/
|
||||
module Mux4 #(parameter WIDTH = 32)(
|
||||
input [1:0] sel,
|
||||
input [(WIDTH-1):0] in0, in1, in2, in3,
|
||||
output reg [(WIDTH-1):0] out
|
||||
);
|
||||
|
||||
always @(*) begin
|
||||
case (sel)
|
||||
2'b00 : out <= in0;
|
||||
2'b01 : out <= in1;
|
||||
2'b10 : out <= in2;
|
||||
2'b11 : out <= in3;
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,679 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Processor.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 23-Jul-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
* 2.01 1-Nov-2012 GEA Fixed issue with Jal.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The top-level MIPS32 Processor. This file is mostly the instantiation
|
||||
* and wiring of the building blocks of the processor according to the
|
||||
* hardware design diagram. It contains very little logic itself.
|
||||
*/
|
||||
module Processor(
|
||||
input clock,
|
||||
input reset,
|
||||
input [4:0] Interrupts, // 5 general-purpose hardware interrupts
|
||||
input NMI, // Non-maskable interrupt
|
||||
// Data Memory Interface
|
||||
input [31:0] DataMem_In,
|
||||
input DataMem_Ready,
|
||||
output DataMem_Read,
|
||||
output [3:0] DataMem_Write, // 4-bit Write, one for each byte in word.
|
||||
output [29:0] DataMem_Address, // Addresses are words, not bytes.
|
||||
output [31:0] DataMem_Out,
|
||||
// Instruction Memory Interface
|
||||
input [31:0] InstMem_In,
|
||||
output [29:0] InstMem_Address, // Addresses are words, not bytes.
|
||||
input InstMem_Ready,
|
||||
output InstMem_Read,
|
||||
output [7:0] IP // Pending interrupts (diagnostic)
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
|
||||
/*** MIPS Instruction and Components (ID Stage) ***/
|
||||
wire [31:0] Instruction;
|
||||
wire [5:0] OpCode = Instruction[31:26];
|
||||
wire [4:0] Rs = Instruction[25:21];
|
||||
wire [4:0] Rt = Instruction[20:16];
|
||||
wire [4:0] Rd = Instruction[15:11];
|
||||
wire [5:0] Funct = Instruction[5:0];
|
||||
wire [15:0] Immediate = Instruction[15:0];
|
||||
wire [25:0] JumpAddress = Instruction[25:0];
|
||||
wire [2:0] Cp0_Sel = Instruction[2:0];
|
||||
|
||||
/*** IF (Instruction Fetch) Signals ***/
|
||||
wire IF_Stall, IF_Flush;
|
||||
wire IF_EXC_AdIF;
|
||||
wire IF_Exception_Stall;
|
||||
wire IF_Exception_Flush;
|
||||
wire IF_IsBDS;
|
||||
wire [31:0] IF_PCAdd4, IF_PC_PreExc, IF_PCIn, IF_PCOut, IF_Instruction;
|
||||
|
||||
/*** ID (Instruction Decode) Signals ***/
|
||||
wire ID_Stall;
|
||||
wire [1:0] ID_PCSrc;
|
||||
wire [1:0] ID_RsFwdSel, ID_RtFwdSel;
|
||||
wire ID_Link, ID_Movn, ID_Movz;
|
||||
wire ID_SignExtend;
|
||||
wire ID_LLSC;
|
||||
wire ID_RegDst, ID_ALUSrcImm, ID_MemWrite, ID_MemRead, ID_MemByte, ID_MemHalf, ID_MemSignExtend, ID_RegWrite, ID_MemtoReg;
|
||||
wire [4:0] ID_ALUOp;
|
||||
wire ID_Mfc0, ID_Mtc0, ID_Eret;
|
||||
wire ID_NextIsDelay;
|
||||
wire ID_CanErr, ID_ID_CanErr, ID_EX_CanErr, ID_M_CanErr;
|
||||
wire ID_KernelMode;
|
||||
wire ID_ReverseEndian;
|
||||
wire ID_Trap, ID_TrapCond;
|
||||
wire ID_EXC_Sys, ID_EXC_Bp, ID_EXC_RI;
|
||||
wire ID_Exception_Stall;
|
||||
wire ID_Exception_Flush;
|
||||
wire ID_PCSrc_Exc;
|
||||
wire [31:0] ID_ExceptionPC;
|
||||
wire ID_CP1, ID_CP2, ID_CP3;
|
||||
wire [31:0] ID_PCAdd4;
|
||||
wire [31:0] ID_ReadData1_RF, ID_ReadData1_End;
|
||||
wire [31:0] ID_ReadData2_RF, ID_ReadData2_End;
|
||||
wire [31:0] CP0_RegOut;
|
||||
wire ID_CmpEQ, ID_CmpGZ, ID_CmpLZ, ID_CmpGEZ, ID_CmpLEZ;
|
||||
wire [29:0] ID_SignExtImm = (ID_SignExtend & Immediate[15]) ? {14'h3FFF, Immediate} : {14'h0000, Immediate};
|
||||
wire [31:0] ID_ImmLeftShift2 = {ID_SignExtImm[29:0], 2'b00};
|
||||
wire [31:0] ID_JumpAddress = {ID_PCAdd4[31:28], JumpAddress[25:0], 2'b00};
|
||||
wire [31:0] ID_BranchAddress;
|
||||
wire [31:0] ID_RestartPC;
|
||||
wire ID_IsBDS;
|
||||
wire ID_Left, ID_Right;
|
||||
wire ID_IsFlushed;
|
||||
|
||||
/*** EX (Execute) Signals ***/
|
||||
wire EX_ALU_Stall, EX_Stall;
|
||||
wire [1:0] EX_RsFwdSel, EX_RtFwdSel;
|
||||
wire EX_Link;
|
||||
wire [1:0] EX_LinkRegDst;
|
||||
wire EX_ALUSrcImm;
|
||||
wire [4:0] EX_ALUOp;
|
||||
wire EX_Movn, EX_Movz;
|
||||
wire EX_LLSC;
|
||||
wire EX_MemRead, EX_MemWrite, EX_MemByte, EX_MemHalf, EX_MemSignExtend, EX_RegWrite, EX_MemtoReg;
|
||||
wire [4:0] EX_Rs, EX_Rt;
|
||||
wire EX_WantRsByEX, EX_NeedRsByEX, EX_WantRtByEX, EX_NeedRtByEX;
|
||||
wire EX_Trap, EX_TrapCond;
|
||||
wire EX_CanErr, EX_EX_CanErr, EX_M_CanErr;
|
||||
wire EX_KernelMode;
|
||||
wire EX_ReverseEndian;
|
||||
wire EX_Exception_Stall;
|
||||
wire EX_Exception_Flush;
|
||||
wire [31:0] EX_ReadData1_PR, EX_ReadData1_Fwd, EX_ReadData2_PR, EX_ReadData2_Fwd, EX_ReadData2_Imm;
|
||||
wire [31:0] EX_SignExtImm;
|
||||
wire [4:0] EX_Rd, EX_RtRd, EX_Shamt;
|
||||
wire [31:0] EX_ALUResult;
|
||||
wire EX_BZero;
|
||||
wire EX_EXC_Ov;
|
||||
wire [31:0] EX_RestartPC;
|
||||
wire EX_IsBDS;
|
||||
wire EX_Left, EX_Right;
|
||||
|
||||
/*** MEM (Memory) Signals ***/
|
||||
wire M_Stall, M_Stall_Controller;
|
||||
wire M_LLSC;
|
||||
wire M_MemRead, M_MemWrite, M_MemByte, M_MemHalf, M_MemSignExtend;
|
||||
wire M_RegWrite, M_MemtoReg;
|
||||
wire M_WriteDataFwdSel;
|
||||
wire M_EXC_AdEL, M_EXC_AdES;
|
||||
wire M_M_CanErr;
|
||||
wire M_KernelMode;
|
||||
wire M_ReverseEndian;
|
||||
wire M_Trap, M_TrapCond;
|
||||
wire M_EXC_Tr;
|
||||
wire M_Exception_Flush;
|
||||
wire [31:0] M_ALUResult, M_ReadData2_PR;
|
||||
wire [4:0] M_RtRd;
|
||||
wire [31:0] M_MemReadData;
|
||||
wire [31:0] M_RestartPC;
|
||||
wire M_IsBDS;
|
||||
wire [31:0] M_WriteData_Pre;
|
||||
wire M_Left, M_Right;
|
||||
wire M_Exception_Stall;
|
||||
|
||||
/*** WB (Writeback) Signals ***/
|
||||
wire WB_Stall, WB_RegWrite;
|
||||
wire [31:0] WB_ReadData, WB_ALUResult;
|
||||
wire [4:0] WB_RtRd;
|
||||
wire [31:0] WB_WriteData;
|
||||
|
||||
/*** Other Signals ***/
|
||||
wire [7:0] ID_DP_Hazards, HAZ_DP_Hazards;
|
||||
|
||||
/*** Assignments ***/
|
||||
assign IF_Instruction = (IF_Stall) ? 32'h00000000 : InstMem_In;
|
||||
assign IF_IsBDS = ID_NextIsDelay;
|
||||
assign HAZ_DP_Hazards = {ID_DP_Hazards[7:4], EX_WantRsByEX, EX_NeedRsByEX, EX_WantRtByEX, EX_NeedRtByEX};
|
||||
assign IF_EXC_AdIF = IF_PCOut[1] | IF_PCOut[0];
|
||||
assign ID_CanErr = ID_ID_CanErr | ID_EX_CanErr | ID_M_CanErr;
|
||||
assign EX_CanErr = EX_EX_CanErr | EX_M_CanErr;
|
||||
assign M_CanErr = M_M_CanErr;
|
||||
|
||||
// External Memory Interface
|
||||
reg IRead, IReadMask;
|
||||
assign InstMem_Address = IF_PCOut[31:2];
|
||||
assign DataMem_Address = M_ALUResult[31:2];
|
||||
always @(posedge clock) begin
|
||||
IRead <= (reset) ? 1 : ~InstMem_Ready;
|
||||
IReadMask <= (reset) ? 0 : ((IRead & InstMem_Ready) ? 1 : ((~IF_Stall) ? 0 : IReadMask));
|
||||
end
|
||||
assign InstMem_Read = IRead & ~IReadMask;
|
||||
|
||||
|
||||
/*** Datapath Controller ***/
|
||||
Control Controller (
|
||||
.ID_Stall (ID_Stall),
|
||||
.OpCode (OpCode),
|
||||
.Funct (Funct),
|
||||
.Rs (Rs),
|
||||
.Rt (Rt),
|
||||
.Cmp_EQ (ID_CmpEQ),
|
||||
.Cmp_GZ (ID_CmpGZ),
|
||||
.Cmp_GEZ (ID_CmpGEZ),
|
||||
.Cmp_LZ (ID_CmpLZ),
|
||||
.Cmp_LEZ (ID_CmpLEZ),
|
||||
.IF_Flush (IF_Flush),
|
||||
.DP_Hazards (ID_DP_Hazards),
|
||||
.PCSrc (ID_PCSrc),
|
||||
.SignExtend (ID_SignExtend),
|
||||
.Link (ID_Link),
|
||||
.Movn (ID_Movn),
|
||||
.Movz (ID_Movz),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.Mtc0 (ID_Mtc0),
|
||||
.CP1 (ID_CP1),
|
||||
.CP2 (ID_CP2),
|
||||
.CP3 (ID_CP3),
|
||||
.Eret (ID_Eret),
|
||||
.Trap (ID_Trap),
|
||||
.TrapCond (ID_TrapCond),
|
||||
.EXC_Sys (ID_EXC_Sys),
|
||||
.EXC_Bp (ID_EXC_Bp),
|
||||
.EXC_RI (ID_EXC_RI),
|
||||
.ID_CanErr (ID_ID_CanErr),
|
||||
.EX_CanErr (ID_EX_CanErr),
|
||||
.M_CanErr (ID_M_CanErr),
|
||||
.NextIsDelay (ID_NextIsDelay),
|
||||
.RegDst (ID_RegDst),
|
||||
.ALUSrcImm (ID_ALUSrcImm),
|
||||
.ALUOp (ID_ALUOp),
|
||||
.LLSC (ID_LLSC),
|
||||
.MemWrite (ID_MemWrite),
|
||||
.MemRead (ID_MemRead),
|
||||
.MemByte (ID_MemByte),
|
||||
.MemHalf (ID_MemHalf),
|
||||
.MemSignExtend (ID_MemSignExtend),
|
||||
.Left (ID_Left),
|
||||
.Right (ID_Right),
|
||||
.RegWrite (ID_RegWrite),
|
||||
.MemtoReg (ID_MemtoReg)
|
||||
);
|
||||
|
||||
/*** Hazard and Forward Control Unit ***/
|
||||
Hazard_Detection HazardControl (
|
||||
.DP_Hazards (HAZ_DP_Hazards),
|
||||
.ID_Rs (Rs),
|
||||
.ID_Rt (Rt),
|
||||
.EX_Rs (EX_Rs),
|
||||
.EX_Rt (EX_Rt),
|
||||
.EX_RtRd (EX_RtRd),
|
||||
.MEM_RtRd (M_RtRd),
|
||||
.WB_RtRd (WB_RtRd),
|
||||
.EX_Link (EX_Link),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.MEM_RegWrite (M_RegWrite),
|
||||
.WB_RegWrite (WB_RegWrite),
|
||||
.MEM_MemRead (M_MemRead),
|
||||
.MEM_MemWrite (M_MemWrite),
|
||||
.InstMem_Read (InstMem_Read),
|
||||
.InstMem_Ready (InstMem_Ready),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.IF_Exception_Stall (IF_Exception_Stall),
|
||||
.ID_Exception_Stall (ID_Exception_Stall),
|
||||
.EX_Exception_Stall (EX_Exception_Stall),
|
||||
.EX_ALU_Stall (EX_ALU_Stall),
|
||||
.M_Stall_Controller (M_Stall_Controller),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.EX_Stall (EX_Stall),
|
||||
.M_Stall (M_Stall),
|
||||
.WB_Stall (WB_Stall),
|
||||
.ID_RsFwdSel (ID_RsFwdSel),
|
||||
.ID_RtFwdSel (ID_RtFwdSel),
|
||||
.EX_RsFwdSel (EX_RsFwdSel),
|
||||
.EX_RtFwdSel (EX_RtFwdSel),
|
||||
.M_WriteDataFwdSel (M_WriteDataFwdSel)
|
||||
);
|
||||
|
||||
/*** Coprocessor 0: Exceptions and Interrupts ***/
|
||||
CPZero CP0 (
|
||||
.clock (clock),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.Mtc0 (ID_Mtc0),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.COP1 (ID_CP1),
|
||||
.COP2 (ID_CP2),
|
||||
.COP3 (ID_CP3),
|
||||
.ERET (ID_Eret),
|
||||
.Rd (Rd),
|
||||
.Sel (Cp0_Sel),
|
||||
.Reg_In (ID_ReadData2_End),
|
||||
.Reg_Out (CP0_RegOut),
|
||||
.KernelMode (ID_KernelMode),
|
||||
.ReverseEndian (ID_ReverseEndian),
|
||||
.Int (Interrupts),
|
||||
.reset (reset),
|
||||
.EXC_NMI (NMI),
|
||||
.EXC_AdIF (IF_EXC_AdIF),
|
||||
.EXC_AdEL (M_EXC_AdEL),
|
||||
.EXC_AdES (M_EXC_AdES),
|
||||
.EXC_Ov (EX_EXC_Ov),
|
||||
.EXC_Tr (M_EXC_Tr),
|
||||
.EXC_Sys (ID_EXC_Sys),
|
||||
.EXC_Bp (ID_EXC_Bp),
|
||||
.EXC_RI (ID_EXC_RI),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.M_RestartPC (M_RestartPC),
|
||||
.ID_IsFlushed (ID_IsFlushed),
|
||||
.IF_IsBD (IF_IsBDS),
|
||||
.ID_IsBD (ID_IsBDS),
|
||||
.EX_IsBD (EX_IsBDS),
|
||||
.M_IsBD (M_IsBDS),
|
||||
.BadAddr_M (M_ALUResult),
|
||||
.BadAddr_IF (IF_PCOut),
|
||||
.ID_CanErr (ID_CanErr),
|
||||
.EX_CanErr (EX_CanErr),
|
||||
.M_CanErr (M_CanErr),
|
||||
.IF_Exception_Stall (IF_Exception_Stall),
|
||||
.ID_Exception_Stall (ID_Exception_Stall),
|
||||
.EX_Exception_Stall (EX_Exception_Stall),
|
||||
.M_Exception_Stall (M_Exception_Stall),
|
||||
.IF_Exception_Flush (IF_Exception_Flush),
|
||||
.ID_Exception_Flush (ID_Exception_Flush),
|
||||
.EX_Exception_Flush (EX_Exception_Flush),
|
||||
.M_Exception_Flush (M_Exception_Flush),
|
||||
.Exc_PC_Sel (ID_PCSrc_Exc),
|
||||
.Exc_PC_Out (ID_ExceptionPC),
|
||||
.IP (IP)
|
||||
);
|
||||
|
||||
/*** PC Source Non-Exception Mux ***/
|
||||
Mux4 #(.WIDTH(32)) PCSrcStd_Mux (
|
||||
.sel (ID_PCSrc),
|
||||
.in0 (IF_PCAdd4),
|
||||
.in1 (ID_JumpAddress),
|
||||
.in2 (ID_BranchAddress),
|
||||
.in3 (ID_ReadData1_End),
|
||||
.out (IF_PC_PreExc)
|
||||
);
|
||||
|
||||
/*** PC Source Exception Mux ***/
|
||||
Mux2 #(.WIDTH(32)) PCSrcExc_Mux (
|
||||
.sel (ID_PCSrc_Exc),
|
||||
.in0 (IF_PC_PreExc),
|
||||
.in1 (ID_ExceptionPC),
|
||||
.out (IF_PCIn)
|
||||
);
|
||||
|
||||
/*** Program Counter (MIPS spec is 0xBFC00000 starting address) ***/
|
||||
Register #(.WIDTH(32), .INIT(EXC_Vector_Base_Reset)) PC (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
//.enable (~IF_Stall), // XXX verify. HERE. Was 1 but on stall latches PC+4, ad nauseum.
|
||||
.enable (~(IF_Stall | ID_Stall)),
|
||||
.D (IF_PCIn),
|
||||
.Q (IF_PCOut)
|
||||
);
|
||||
|
||||
/*** PC +4 Adder ***/
|
||||
Add PC_Add4 (
|
||||
.A (IF_PCOut),
|
||||
.B (32'h00000004),
|
||||
.C (IF_PCAdd4)
|
||||
);
|
||||
|
||||
/*** Instruction Fetch -> Instruction Decode Stage Register ***/
|
||||
IFID_Stage IFID (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.IF_Flush (IF_Exception_Flush | IF_Flush),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.IF_Instruction (IF_Instruction),
|
||||
.IF_PCAdd4 (IF_PCAdd4),
|
||||
.IF_PC (IF_PCOut),
|
||||
.IF_IsBDS (IF_IsBDS),
|
||||
.ID_Instruction (Instruction),
|
||||
.ID_PCAdd4 (ID_PCAdd4),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.ID_IsBDS (ID_IsBDS),
|
||||
.ID_IsFlushed (ID_IsFlushed)
|
||||
);
|
||||
|
||||
/*** Register File ***/
|
||||
RegisterFile RegisterFile (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.ReadReg1 (Rs),
|
||||
.ReadReg2 (Rt),
|
||||
.WriteReg (WB_RtRd),
|
||||
.WriteData (WB_WriteData),
|
||||
.RegWrite (WB_RegWrite),
|
||||
.ReadData1 (ID_ReadData1_RF),
|
||||
.ReadData2 (ID_ReadData2_RF)
|
||||
);
|
||||
|
||||
/*** ID Rs Forwarding/Link Mux ***/
|
||||
Mux4 #(.WIDTH(32)) IDRsFwd_Mux (
|
||||
.sel (ID_RsFwdSel),
|
||||
.in0 (ID_ReadData1_RF),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (32'hxxxxxxxx),
|
||||
.out (ID_ReadData1_End)
|
||||
);
|
||||
|
||||
/*** ID Rt Forwarding/CP0 Mfc0 Mux ***/
|
||||
Mux4 #(.WIDTH(32)) IDRtFwd_Mux (
|
||||
.sel (ID_RtFwdSel),
|
||||
.in0 (ID_ReadData2_RF),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (CP0_RegOut),
|
||||
.out (ID_ReadData2_End)
|
||||
);
|
||||
|
||||
/*** Condition Compare Unit ***/
|
||||
Compare Compare (
|
||||
.A (ID_ReadData1_End),
|
||||
.B (ID_ReadData2_End),
|
||||
.EQ (ID_CmpEQ),
|
||||
.GZ (ID_CmpGZ),
|
||||
.LZ (ID_CmpLZ),
|
||||
.GEZ (ID_CmpGEZ),
|
||||
.LEZ (ID_CmpLEZ)
|
||||
);
|
||||
|
||||
/*** Branch Address Adder ***/
|
||||
Add BranchAddress_Add (
|
||||
.A (ID_PCAdd4),
|
||||
.B (ID_ImmLeftShift2),
|
||||
.C (ID_BranchAddress)
|
||||
);
|
||||
|
||||
/*** Instruction Decode -> Execute Pipeline Stage ***/
|
||||
IDEX_Stage IDEX (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.ID_Flush (ID_Exception_Flush),
|
||||
.ID_Stall (ID_Stall),
|
||||
.EX_Stall (EX_Stall),
|
||||
.ID_Link (ID_Link),
|
||||
.ID_RegDst (ID_RegDst),
|
||||
.ID_ALUSrcImm (ID_ALUSrcImm),
|
||||
.ID_ALUOp (ID_ALUOp),
|
||||
.ID_Movn (ID_Movn),
|
||||
.ID_Movz (ID_Movz),
|
||||
.ID_LLSC (ID_LLSC),
|
||||
.ID_MemRead (ID_MemRead),
|
||||
.ID_MemWrite (ID_MemWrite),
|
||||
.ID_MemByte (ID_MemByte),
|
||||
.ID_MemHalf (ID_MemHalf),
|
||||
.ID_MemSignExtend (ID_MemSignExtend),
|
||||
.ID_Left (ID_Left),
|
||||
.ID_Right (ID_Right),
|
||||
.ID_RegWrite (ID_RegWrite),
|
||||
.ID_MemtoReg (ID_MemtoReg),
|
||||
.ID_ReverseEndian (ID_ReverseEndian),
|
||||
.ID_Rs (Rs),
|
||||
.ID_Rt (Rt),
|
||||
.ID_WantRsByEX (ID_DP_Hazards[3]),
|
||||
.ID_NeedRsByEX (ID_DP_Hazards[2]),
|
||||
.ID_WantRtByEX (ID_DP_Hazards[1]),
|
||||
.ID_NeedRtByEX (ID_DP_Hazards[0]),
|
||||
.ID_KernelMode (ID_KernelMode),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.ID_IsBDS (ID_IsBDS),
|
||||
.ID_Trap (ID_Trap),
|
||||
.ID_TrapCond (ID_TrapCond),
|
||||
.ID_EX_CanErr (ID_EX_CanErr),
|
||||
.ID_M_CanErr (ID_M_CanErr),
|
||||
.ID_ReadData1 (ID_ReadData1_End),
|
||||
.ID_ReadData2 (ID_ReadData2_End),
|
||||
.ID_SignExtImm (ID_SignExtImm[16:0]),
|
||||
.EX_Link (EX_Link),
|
||||
.EX_LinkRegDst (EX_LinkRegDst),
|
||||
.EX_ALUSrcImm (EX_ALUSrcImm),
|
||||
.EX_ALUOp (EX_ALUOp),
|
||||
.EX_Movn (EX_Movn),
|
||||
.EX_Movz (EX_Movz),
|
||||
.EX_LLSC (EX_LLSC),
|
||||
.EX_MemRead (EX_MemRead),
|
||||
.EX_MemWrite (EX_MemWrite),
|
||||
.EX_MemByte (EX_MemByte),
|
||||
.EX_MemHalf (EX_MemHalf),
|
||||
.EX_MemSignExtend (EX_MemSignExtend),
|
||||
.EX_Left (EX_Left),
|
||||
.EX_Right (EX_Right),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.EX_MemtoReg (EX_MemtoReg),
|
||||
.EX_ReverseEndian (EX_ReverseEndian),
|
||||
.EX_Rs (EX_Rs),
|
||||
.EX_Rt (EX_Rt),
|
||||
.EX_WantRsByEX (EX_WantRsByEX),
|
||||
.EX_NeedRsByEX (EX_NeedRsByEX),
|
||||
.EX_WantRtByEX (EX_WantRtByEX),
|
||||
.EX_NeedRtByEX (EX_NeedRtByEX),
|
||||
.EX_KernelMode (EX_KernelMode),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.EX_IsBDS (EX_IsBDS),
|
||||
.EX_Trap (EX_Trap),
|
||||
.EX_TrapCond (EX_TrapCond),
|
||||
.EX_EX_CanErr (EX_EX_CanErr),
|
||||
.EX_M_CanErr (EX_M_CanErr),
|
||||
.EX_ReadData1 (EX_ReadData1_PR),
|
||||
.EX_ReadData2 (EX_ReadData2_PR),
|
||||
.EX_SignExtImm (EX_SignExtImm),
|
||||
.EX_Rd (EX_Rd),
|
||||
.EX_Shamt (EX_Shamt)
|
||||
);
|
||||
|
||||
/*** EX Rs Forwarding Mux ***/
|
||||
Mux4 #(.WIDTH(32)) EXRsFwd_Mux (
|
||||
.sel (EX_RsFwdSel),
|
||||
.in0 (EX_ReadData1_PR),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (EX_RestartPC),
|
||||
.out (EX_ReadData1_Fwd)
|
||||
);
|
||||
|
||||
/*** EX Rt Forwarding / Link Mux ***/
|
||||
Mux4 #(.WIDTH(32)) EXRtFwdLnk_Mux (
|
||||
.sel (EX_RtFwdSel),
|
||||
.in0 (EX_ReadData2_PR),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (32'h00000008),
|
||||
.out (EX_ReadData2_Fwd)
|
||||
);
|
||||
|
||||
/*** EX ALU Immediate Mux ***/
|
||||
Mux2 #(.WIDTH(32)) EXALUImm_Mux (
|
||||
.sel (EX_ALUSrcImm),
|
||||
.in0 (EX_ReadData2_Fwd),
|
||||
.in1 (EX_SignExtImm),
|
||||
.out (EX_ReadData2_Imm)
|
||||
);
|
||||
|
||||
/*** EX RtRd / Link Mux ***/
|
||||
Mux4 #(.WIDTH(5)) EXRtRdLnk_Mux (
|
||||
.sel (EX_LinkRegDst),
|
||||
.in0 (EX_Rt),
|
||||
.in1 (EX_Rd),
|
||||
.in2 (5'b11111),
|
||||
.in3 (5'bxxxxx),
|
||||
.out (EX_RtRd)
|
||||
);
|
||||
|
||||
/*** Arithmetic Logic Unit ***/
|
||||
ALU ALU (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.EX_Stall (EX_Stall),
|
||||
.EX_Flush (EX_Exception_Flush),
|
||||
.A (EX_ReadData1_Fwd),
|
||||
.B (EX_ReadData2_Imm),
|
||||
.Operation (EX_ALUOp),
|
||||
.Shamt (EX_Shamt),
|
||||
.Result (EX_ALUResult),
|
||||
.BZero (EX_BZero),
|
||||
.EXC_Ov (EX_EXC_Ov),
|
||||
.ALU_Stall (EX_ALU_Stall)
|
||||
);
|
||||
|
||||
/*** Execute -> Memory Pipeline Stage ***/
|
||||
EXMEM_Stage EXMEM (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.EX_Flush (EX_Exception_Flush),
|
||||
.EX_Stall (EX_Stall),
|
||||
.M_Stall (M_Stall),
|
||||
.EX_Movn (EX_Movn),
|
||||
.EX_Movz (EX_Movz),
|
||||
.EX_BZero (EX_BZero),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.EX_MemtoReg (EX_MemtoReg),
|
||||
.EX_ReverseEndian (EX_ReverseEndian),
|
||||
.EX_LLSC (EX_LLSC),
|
||||
.EX_MemRead (EX_MemRead),
|
||||
.EX_MemWrite (EX_MemWrite),
|
||||
.EX_MemByte (EX_MemByte),
|
||||
.EX_MemHalf (EX_MemHalf),
|
||||
.EX_MemSignExtend (EX_MemSignExtend),
|
||||
.EX_Left (EX_Left),
|
||||
.EX_Right (EX_Right),
|
||||
.EX_KernelMode (EX_KernelMode),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.EX_IsBDS (EX_IsBDS),
|
||||
.EX_Trap (EX_Trap),
|
||||
.EX_TrapCond (EX_TrapCond),
|
||||
.EX_M_CanErr (EX_M_CanErr),
|
||||
.EX_ALU_Result (EX_ALUResult),
|
||||
.EX_ReadData2 (EX_ReadData2_Fwd),
|
||||
.EX_RtRd (EX_RtRd),
|
||||
.M_RegWrite (M_RegWrite),
|
||||
.M_MemtoReg (M_MemtoReg),
|
||||
.M_ReverseEndian (M_ReverseEndian),
|
||||
.M_LLSC (M_LLSC),
|
||||
.M_MemRead (M_MemRead),
|
||||
.M_MemWrite (M_MemWrite),
|
||||
.M_MemByte (M_MemByte),
|
||||
.M_MemHalf (M_MemHalf),
|
||||
.M_MemSignExtend (M_MemSignExtend),
|
||||
.M_Left (M_Left),
|
||||
.M_Right (M_Right),
|
||||
.M_KernelMode (M_KernelMode),
|
||||
.M_RestartPC (M_RestartPC),
|
||||
.M_IsBDS (M_IsBDS),
|
||||
.M_Trap (M_Trap),
|
||||
.M_TrapCond (M_TrapCond),
|
||||
.M_M_CanErr (M_M_CanErr),
|
||||
.M_ALU_Result (M_ALUResult),
|
||||
.M_ReadData2 (M_ReadData2_PR),
|
||||
.M_RtRd (M_RtRd)
|
||||
);
|
||||
|
||||
/*** Trap Detection Unit ***/
|
||||
TrapDetect TrapDetect (
|
||||
.Trap (M_Trap),
|
||||
.TrapCond (M_TrapCond),
|
||||
.ALUResult (M_ALUResult),
|
||||
.EXC_Tr (M_EXC_Tr)
|
||||
);
|
||||
|
||||
/*** MEM Write Data Mux ***/
|
||||
Mux2 #(.WIDTH(32)) MWriteData_Mux (
|
||||
.sel (M_WriteDataFwdSel),
|
||||
.in0 (M_ReadData2_PR),
|
||||
.in1 (WB_WriteData),
|
||||
.out (M_WriteData_Pre)
|
||||
);
|
||||
|
||||
/*** Data Memory Controller ***/
|
||||
MemControl DataMem_Controller (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.DataIn (M_WriteData_Pre),
|
||||
.Address (M_ALUResult),
|
||||
.MReadData (DataMem_In),
|
||||
.MemRead (M_MemRead),
|
||||
.MemWrite (M_MemWrite),
|
||||
.DataMem_Ready (DataMem_Ready),
|
||||
.Byte (M_MemByte),
|
||||
.Half (M_MemHalf),
|
||||
.SignExtend (M_MemSignExtend),
|
||||
.KernelMode (M_KernelMode),
|
||||
.ReverseEndian (M_ReverseEndian),
|
||||
.LLSC (M_LLSC),
|
||||
.ERET (ID_Eret),
|
||||
.Left (M_Left),
|
||||
.Right (M_Right),
|
||||
.M_Exception_Stall (M_Exception_Stall),
|
||||
|
||||
.IF_Stall (IF_Stall),
|
||||
|
||||
.DataOut (M_MemReadData),
|
||||
.MWriteData (DataMem_Out),
|
||||
.WriteEnable (DataMem_Write),
|
||||
.ReadEnable (DataMem_Read),
|
||||
.M_Stall (M_Stall_Controller),
|
||||
.EXC_AdEL (M_EXC_AdEL),
|
||||
.EXC_AdES (M_EXC_AdES)
|
||||
);
|
||||
|
||||
/*** Memory -> Writeback Pipeline Stage ***/
|
||||
MEMWB_Stage MEMWB (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.M_Flush (M_Exception_Flush),
|
||||
.M_Stall (M_Stall),
|
||||
.WB_Stall (WB_Stall),
|
||||
.M_RegWrite (M_RegWrite),
|
||||
.M_MemtoReg (M_MemtoReg),
|
||||
.M_ReadData (M_MemReadData),
|
||||
.M_ALU_Result (M_ALUResult),
|
||||
.M_RtRd (M_RtRd),
|
||||
.WB_RegWrite (WB_RegWrite),
|
||||
.WB_MemtoReg (WB_MemtoReg),
|
||||
.WB_ReadData (WB_ReadData),
|
||||
.WB_ALU_Result (WB_ALUResult),
|
||||
.WB_RtRd (WB_RtRd)
|
||||
);
|
||||
|
||||
/*** WB MemtoReg Mux ***/
|
||||
Mux2 #(.WIDTH(32)) WBMemtoReg_Mux (
|
||||
.sel (WB_MemtoReg),
|
||||
.in0 (WB_ALUResult),
|
||||
.in1 (WB_ReadData),
|
||||
.out (WB_WriteData)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
MIPS32-R1 Standalone
|
||||
--------------------
|
||||
|
||||
The files in this directory create a complete MIPS32 processor. The top-level
|
||||
module is "Processor.v". The interface includes 5 general-purpose hardware
|
||||
interrupts, a non-maskable hardware interrupt, the 8 pending ISA interrupts
|
||||
(for diagnostics--this can be removed), and a memory interface for both
|
||||
instructions and data.
|
||||
|
||||
The memory interface is implemented as a four-way handshake:
|
||||
|
||||
1. Read/Write request goes high.
|
||||
2. Ack goes high when data is available.
|
||||
3. Read/Write request goes low.
|
||||
4. Ack signal goes low.
|
||||
____
|
||||
R/W: __| |____
|
||||
____
|
||||
Ack: _____| |____
|
||||
|
||||
This interface is simple and robust but can limit the performance of the
|
||||
system. In the SoC design this is currently the case, since the instruction
|
||||
memory fetches only once per handshake. This greatly increases the maximum
|
||||
theoretical IPC from 1 to between 3 and 4.
|
||||
|
||||
If your application requires maximum performance out of this processor,
|
||||
you should modify the memory handshake accordingly.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Register.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A variable-width register (d flip-flop) with configurable initial
|
||||
* value. Default is 32-bit width and 0s for initial value.
|
||||
*/
|
||||
module Register #(parameter WIDTH = 32, INIT = 0)(
|
||||
input clock,
|
||||
input reset,
|
||||
input enable,
|
||||
input [(WIDTH-1):0] D,
|
||||
output reg [(WIDTH-1):0] Q
|
||||
);
|
||||
|
||||
initial
|
||||
Q = INIT;
|
||||
|
||||
always @(posedge clock) begin
|
||||
Q <= (reset) ? INIT : ((enable) ? D : Q);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : RegisterFile.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A Register File for a MIPS processor. Contains 32 general-purpose
|
||||
* 32-bit wide registers and two read ports. Register 0 always reads
|
||||
* as zero.
|
||||
*/
|
||||
module RegisterFile(
|
||||
input clock,
|
||||
input reset,
|
||||
input [4:0] ReadReg1, ReadReg2, WriteReg,
|
||||
input [31:0] WriteData,
|
||||
input RegWrite,
|
||||
output [31:0] ReadData1, ReadData2
|
||||
);
|
||||
|
||||
// Register file of 32 32-bit registers. Register 0 is hardwired to 0s
|
||||
reg [31:0] registers [1:31];
|
||||
|
||||
// Initialize all to zero
|
||||
integer i;
|
||||
initial begin
|
||||
for (i=1; i<32; i=i+1) begin
|
||||
registers[i] <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
// Sequential (clocked) write.
|
||||
// 'WriteReg' is the register index to write. 'RegWrite' is the command.
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
for (i=1; i<32; i=i+1) begin
|
||||
registers[i] <= 0;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
if (WriteReg != 0)
|
||||
registers[WriteReg] <= (RegWrite) ? WriteData : registers[WriteReg];
|
||||
end
|
||||
end
|
||||
|
||||
// Combinatorial Read. Register 0 is all 0s.
|
||||
assign ReadData1 = (ReadReg1 == 0) ? 32'h00000000 : registers[ReadReg1];
|
||||
assign ReadData2 = (ReadReg2 == 0) ? 32'h00000000 : registers[ReadReg2];
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : TrapDetect.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 15-May-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Detects a Trap Exception in the pipeline.
|
||||
*/
|
||||
module TrapDetect(
|
||||
input Trap,
|
||||
input TrapCond,
|
||||
input [31:0] ALUResult,
|
||||
output EXC_Tr
|
||||
);
|
||||
|
||||
wire ALUZero = (ALUResult == 32'h00000000);
|
||||
assign EXC_Tr = Trap & (TrapCond ^ ALUZero);
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
MIPS32-R1 SoC HOWTO
|
||||
-------------------
|
||||
|
||||
This document is a step-by-step procedure for building the MIPS32 hardware
|
||||
and software and running it on the XUPV5-LX110T FPGA development board. With
|
||||
minimal changes, other hardware platforms may be used as well (see FAQ).
|
||||
|
||||
Procedure
|
||||
---------
|
||||
|
||||
1. Build the software toolchain. Instructions for doing this are located
|
||||
in the "Software/toolchain" directory.
|
||||
|
||||
2. Open the project file "MIPS32-Pipelined-Hw.xise" located in the
|
||||
"Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw" directory. This is
|
||||
a Xilinx ISE 14.1 project file.
|
||||
|
||||
3. Build the Block RAM core by using the Block Memory Generator in
|
||||
the Core Generator. See details below.
|
||||
|
||||
4. Build the hardware project and generate the programming .bit file.
|
||||
Send the programming file to the board through Impact (you may need
|
||||
to create a new Impact project file for your system, but no options
|
||||
are needed other than the configuration .bit file targeted for the
|
||||
Virtex-5 device). A default program built into the BRAM will print
|
||||
a hello message to the LCD screen.
|
||||
|
||||
Alternatively, a pre-built .bit file is located in the
|
||||
"Hardware/XUPV5-LX110T_SoC" directory. It is timed conservatively
|
||||
at 33 MHz (66 MHz bus).
|
||||
|
||||
5. Compile any of the software demos located in "Software/demos" using
|
||||
the Makefile included with the demo. One of the output files from
|
||||
the compilation will have a .xum extension. This is a binary file that
|
||||
contains the code and data for the program. Use the XUM Bootloader
|
||||
software (Windows) to send the .xum file over a serial port to the
|
||||
FPGA. When the program is sent, the CPU will reset and run it.
|
||||
|
||||
Rebuilding the Block RAM
|
||||
------------------------
|
||||
The following settings will allow you to build the Block RAM module
|
||||
and add a default program to it assuming Xilinx Block Memory Generator
|
||||
version 7.1): True Dual Port RAM, Common Clock, Byte Write Enable of 8
|
||||
bits, Write/Read width of 32 bits, Write depth of 151552 (for full
|
||||
592 KB), Always Enabled, same options for port B, Register Port A Output
|
||||
of Memory Primitives AND Memory Core (for 2R version, this can be
|
||||
customized), same settings for Port B, fill remaining locations with
|
||||
0x00000000, optionally load a .coe file with initial memory contents,
|
||||
use RSTA and RSTB. The file 'Boot.coe' provides the simple hello message
|
||||
program.
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
||||
Q: What if I don't have the XUPV5-LX110T board?
|
||||
A: If you have the same Virtex 5 FPGA but a different board, all you need
|
||||
to do is update the pin locations in the User Constraints File (.ucf)
|
||||
and either make sure your clock input is 100 MHz or adjust the PLL
|
||||
in the clocking module of the design accordingly. Note that some
|
||||
hardware such as the LCD screen or piezo speaker may not be present
|
||||
on your board, in which case you should remove them from the design.
|
||||
|
||||
Q: What if I don't have a Virtex 5 FPGA?
|
||||
A: Any FPGA can implement this design if it has enough logic resources.
|
||||
There are only two Xilinx-specific modules in the MIPS32 SoC design;
|
||||
the clocking module and BRAM module. Replace these with whatever suits
|
||||
your hardware. Note however that the MIPS32 memory interface uses
|
||||
byte-width write enables to memory (4 bits per 32-bit word), so if you
|
||||
use Block Memory or equivalents they must either support this or
|
||||
you must fake it somehow. You must also update the UCF.
|
||||
|
||||
Q: What if I don't have or use the Xilinx development tools?
|
||||
A: If you only care about the MIPS32 processor and not the full SoC, start
|
||||
with the "Hardware/MIPS32_Standalone" directory which contains only
|
||||
Verilog files. The top-most module is "Processor.v". For the full SoC,
|
||||
copy the "Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src" directory
|
||||
to whatever development environment you use. This directory contains
|
||||
all of the Verilog files with "Top.v" as the head. The "Clocks" and
|
||||
"BRAM" directories will need to be customized for your environment,
|
||||
as well as the pin constraints.
|
||||
|
||||
Q: Is there a non-Windows version of the bootloader?
|
||||
A: No, but the boot protocol is simple and can be implemented for any OS.
|
||||
See "Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src/UART/
|
||||
uart_bootloader_v2.v" for a description of the protocol. If you
|
||||
implement another version of the bootloader, please contribute it back
|
||||
to the project.
|
||||
|
||||
BIN
Binary file not shown.
Executable
+1033
File diff suppressed because it is too large
Load Diff
+30
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
|
||||
|
||||
<!-- -->
|
||||
|
||||
<!-- For tool use only. Do not edit. -->
|
||||
|
||||
<!-- -->
|
||||
|
||||
<!-- ProjectNavigator created generated project file. -->
|
||||
|
||||
<!-- For use in tracking generated file and other information -->
|
||||
|
||||
<!-- allowing preservation of process status. -->
|
||||
|
||||
<!-- -->
|
||||
|
||||
<!-- Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. -->
|
||||
|
||||
<version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
|
||||
|
||||
<sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="MIPS32-Pipelined-Hw.xise"/>
|
||||
|
||||
<files xmlns="http://www.xilinx.com/XMLSchema">
|
||||
<file xil_pn:fileType="FILE_NCD" xil_pn:name="Top_guide.ncd" xil_pn:origination="imported"/>
|
||||
</files>
|
||||
|
||||
<transforms xmlns="http://www.xilinx.com/XMLSchema"/>
|
||||
|
||||
</generated_project>
|
||||
+523
@@ -0,0 +1,523 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
|
||||
|
||||
<header>
|
||||
<!-- ISE source project file created by Project Navigator. -->
|
||||
<!-- -->
|
||||
<!-- This file contains project source information including a list of -->
|
||||
<!-- project source files, project and process properties. This file, -->
|
||||
<!-- along with the project source files, is sufficient to open and -->
|
||||
<!-- implement in ISE Project Navigator. -->
|
||||
<!-- -->
|
||||
<!-- Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. -->
|
||||
</header>
|
||||
|
||||
<version xil_pn:ise_version="14.1" xil_pn:schema_version="2"/>
|
||||
|
||||
<files>
|
||||
<file xil_pn:name="src/Top.ucf" xil_pn:type="FILE_UCF">
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="0"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Top.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="38"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="39"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/UART/uart_bootloader_v2.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="29"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="30"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/UART/uart_clock.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="4"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="4"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/UART/uart_rx.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="3"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="3"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/UART/uart_tx.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="2"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="2"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/UART/uart-min.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="8"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="9"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Common/FIFO_Clear.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="7"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="8"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Common/FIFO_NoFull_Count.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="6"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="7"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Common/Mux2.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="27"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="28"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Common/Mux4.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="26"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="27"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Common/SRAM.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="1"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="1"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/I2C/I2C_Clock.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="5"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="6"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/I2C/I2C_Controller.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="35"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="36"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/I2C/I2C_Phy.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="25"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="26"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Add.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="23"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="24"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/ALU.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="22"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="23"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Compare.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="21"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="22"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Control.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="20"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="21"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/CPZero.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="19"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="20"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/EXMEM_Stage.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="18"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="19"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Hazard_Detection.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="17"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="18"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/IDEX_Stage.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="16"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="17"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/IFID_Stage.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="15"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="16"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/MemControl.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="14"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="15"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/MEMWB_Stage.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="13"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="14"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Processor.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="32"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="33"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Register.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="12"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="13"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/RegisterFile.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="11"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="12"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/TrapDetect.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="10"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="11"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/LED/LED.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="33"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="34"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/LCD/LCD.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="34"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="35"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/LCD/lcd_ctrl.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="24"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="25"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Piezo/Piezo.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="31"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="32"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Switches/Switch_Filter.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="9"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="10"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Switches/Switches.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="30"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="31"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/BRAM/BRAM_592KB_Wrapper.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="37"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="38"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Simulation/Top_Tester.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="39"/>
|
||||
<association xil_pn:name="PostMapSimulation" xil_pn:seqID="57"/>
|
||||
<association xil_pn:name="PostRouteSimulation" xil_pn:seqID="57"/>
|
||||
<association xil_pn:name="PostTranslateSimulation" xil_pn:seqID="57"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/MIPS32/Divide.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="49"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="5"/>
|
||||
</file>
|
||||
<file xil_pn:name="src/Clocks/PLL_100MHz_to_33MHz_66MHz.v" xil_pn:type="FILE_VERILOG">
|
||||
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="62"/>
|
||||
<association xil_pn:name="Implementation" xil_pn:seqID="37"/>
|
||||
</file>
|
||||
</files>
|
||||
|
||||
<properties>
|
||||
<property xil_pn:name="AES Initial Vector virtex5" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="AES Key (Hex String)" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Add I/O Buffers" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Allow Logic Optimization Across Hierarchy" xil_pn:value="true" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Allow SelectMAP Pins to Persist" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Allow Unexpanded Blocks" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Allow Unmatched LOC Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Allow Unmatched Timing Group Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Analysis Effort Level" xil_pn:value="Standard" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Asynchronous To Synchronous" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Auto Implementation Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Auto Implementation Top" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Automatic BRAM Packing" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Automatically Insert glbl Module in the Netlist" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Automatically Run Generate Target PROM/ACE File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="BPI Reads Per Page" xil_pn:value="1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="BRAM Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Bring Out Global Set/Reset Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Bring Out Global Tristate Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Bus Delimiter" xil_pn:value="<>" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Case" xil_pn:value="Maintain" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Case Implementation Style" xil_pn:value="None" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Change Device Speed To" xil_pn:value="-1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Change Device Speed To Post Trace" xil_pn:value="-1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Combinatorial Logic Optimization" xil_pn:value="true" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Compile EDK Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Compile SIMPRIM (Timing) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Compile UNISIM (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Compile XilinxCoreLib (CORE Generator) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Compile for HDL Debugging" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Clk (Configuration Pins)" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin Busy" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin CS" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin DIn" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin Done" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin HSWAPEN" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin Init" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin M0" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin M1" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin M2" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin Program" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Pin RdWr" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Configuration Rate virtex5" xil_pn:value="2" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Correlate Output to Input Design" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create ASCII Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create Binary Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create Bit File" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create I/O Pads from Ports" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create IEEE 1532 Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create Logic Allocation File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create Mask File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Create ReadBack Data Files" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Cross Clock Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Custom Waveform Configuration File Behav" xil_pn:value="src/Simulation/waveform.wcfg" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Cycles for First BPI Page Read" xil_pn:value="1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="DCI Update Mode" xil_pn:value="As Required" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="DSP Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Decoder Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Delay Values To Be Read from SDF" xil_pn:value="Setup Time" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Device" xil_pn:value="xc5vlx110t" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Device Family" xil_pn:value="Virtex5" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Device Speed Grade/Select ABS Minimum" xil_pn:value="-1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Disable Detailed Package Model Insertion" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Do Not Escape Signal and Instance Names in Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Done (Output Events)" xil_pn:value="Default (4)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Drive Done Pin High" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable BitStream Compression" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable Cyclic Redundancy Checking (CRC)" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable Debugging of Serial Mode BitStream" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable Hardware Co-Simulation" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable Internal Done Pipe" xil_pn:value="true" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Enable Message Filtering" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Enable Multi-Threading" xil_pn:value="2" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Enable Multi-Threading par virtex5" xil_pn:value="4" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Enable Outputs (Output Events)" xil_pn:value="Default (5)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Encrypt Bitstream" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Equivalent Register Removal" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Equivalent Register Removal XST" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Essential Bits" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Evaluation Development Board" xil_pn:value="None Specified" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Exclude Compilation of Deprecated EDK Cores" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Exclude Compilation of EDK Sub-Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Extra Effort (Highest PAR level only)" xil_pn:value="Normal" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="FPGA Start-Up Clock" xil_pn:value="CCLK" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="FSM Encoding Algorithm" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="FSM Style" xil_pn:value="LUT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Fallback Reconfiguration" xil_pn:value="Enable" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Filter Files From Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Flatten Output Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Functional Model Target Language ArchWiz" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Functional Model Target Language Coregen" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Functional Model Target Language Schematic" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Architecture Only (No Entity Declaration)" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Asynchronous Delay Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Clock Region Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Constraints Interaction Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Constraints Interaction Report Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Datasheet Section" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Datasheet Section Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Detailed MAP Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Multiple Hierarchical Netlist Files" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Post-Place & Route Power Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Post-Place & Route Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate RTL Schematic" xil_pn:value="Yes" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate SAIF File for Power Optimization/Estimation Par" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Testbench File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Timegroups Section" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generate Timegroups Section Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Generics, Parameters" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Global Optimization Goal" xil_pn:value="AllClockNets" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Global Optimization map virtex5" xil_pn:value="Speed" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Global Set/Reset Port Name" xil_pn:value="GSR_PORT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Global Tristate Port Name" xil_pn:value="GTS_PORT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="HDL Instantiation Template Target Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Hierarchy Separator" xil_pn:value="/" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="ISim UUT Instance Name" xil_pn:value="UUT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Ignore User Timing Constraints Map" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Ignore User Timing Constraints Par" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Implementation Top" xil_pn:value="Module|Top" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Implementation Top File" xil_pn:value="src/Top.v" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/Top" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Include 'uselib Directive in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Include SIMPRIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Include UNISIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Include sdf_annotate task in Verilog File" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Incremental Compilation" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Insert Buffers to Prevent Pulse Swallowing" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Instantiation Template Target Language Xps" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="JTAG Pin TCK" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="JTAG Pin TDI" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="JTAG Pin TDO" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="JTAG Pin TMS" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="JTAG to System Monitor Connection" xil_pn:value="Enable" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Keep Hierarchy" xil_pn:value="No" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="LUT Combining Map" xil_pn:value="Auto" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="LUT Combining Xst" xil_pn:value="Auto" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Language" xil_pn:value="VHDL" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Last Applied Goal" xil_pn:value="Balanced" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Last Applied Strategy" xil_pn:value="Xilinx Default (unlocked)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Last Unlock Status" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Launch SDK after Export" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Library for Verilog Sources" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Load glbl" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Logical Shifter Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Manual Implementation Compile Order" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Map Slice Logic into Unused Block RAMs" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Max Fanout" xil_pn:value="100000" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Maximum Compression" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Maximum Number of Lines in Report" xil_pn:value="1000" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Maximum Signal Name Length" xil_pn:value="20" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Move First Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Move Last Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Mux Extraction" xil_pn:value="Yes" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Mux Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Netlist Hierarchy" xil_pn:value="As Optimized" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Netlist Translation Type" xil_pn:value="Timestamp" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Number of Clock Buffers" xil_pn:value="32" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Number of Paths in Error/Verbose Report" xil_pn:value="3" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Number of Paths in Error/Verbose Report Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Optimization Effort" xil_pn:value="High" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Optimization Goal" xil_pn:value="Speed" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Optimization Strategy (Cover Mode)" xil_pn:value="Speed" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Optimize Instantiated Primitives" xil_pn:value="true" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Other Bitgen Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Compiler Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Compiler Options Map" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Compiler Options Par" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Compiler Options Translate" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Compxlib Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Map Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other NETGEN Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Ngdbuild Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Place & Route Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Simulator Commands Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Simulator Commands Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Simulator Commands Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other Simulator Commands Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other XPWR Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Other XST Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Output Extended Identifiers" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Output File Name" xil_pn:value="Top" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Overwrite Compiled Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Pack I/O Registers into IOBs" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Pack I/O Registers/Latches into IOBs" xil_pn:value="Off" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Package" xil_pn:value="ff1136" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Perform Advanced Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Perform Advanced Analysis Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Perform Timing-Driven Packing and Placement" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Place & Route Effort Level (Overall)" xil_pn:value="High" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Place And Route Mode" xil_pn:value="Route Only" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Placer Effort Level Map" xil_pn:value="High" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Placer Extra Effort Map" xil_pn:value="Normal" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Port to be used" xil_pn:value="Auto - default" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Post Map Simulation Model Name" xil_pn:value="Top_map.v" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Post Place & Route Simulation Model Name" xil_pn:value="Top_timesim.v" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Post Synthesis Simulation Model Name" xil_pn:value="Top_synthesis.v" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Post Translate Simulation Model Name" xil_pn:value="Top_translate.v" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Power Down Device if Over Safe Temperature" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Power Reduction Map" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Power Reduction Par" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Power Reduction Xst" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Priority Encoder Extraction" xil_pn:value="Yes" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Produce Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Project Description" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="RAM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="RAM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="ROM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="ROM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Read Cores" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Reduce Control Sets" xil_pn:value="Auto" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Regenerate Core" xil_pn:value="Under Current Project Setting" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Register Balancing" xil_pn:value="No" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Register Duplication Map" xil_pn:value="Off" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Register Duplication Xst" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Release Write Enable (Output Events)" xil_pn:value="Default (6)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Rename Design Instance in Testbench File to" xil_pn:value="UUT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Rename Top Level Architecture To" xil_pn:value="Structure" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Rename Top Level Entity to" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Rename Top Level Module To" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Fastest Path(s) in Each Constraint" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Fastest Path(s) in Each Constraint Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Paths by Endpoint" xil_pn:value="3" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Paths by Endpoint Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Type" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Type Post Trace" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Unconstrained Paths" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Report Unconstrained Paths Post Trace" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Reset On Configuration Pulse Width" xil_pn:value="100" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Resource Sharing" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Retain Hierarchy" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Revision Select" xil_pn:value="00" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Revision Select Tristate" xil_pn:value="Disable" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Run Design Rules Checker (DRC)" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Run for Specified Time" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Run for Specified Time Map" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Run for Specified Time Par" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Run for Specified Time Translate" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Safe Implementation" xil_pn:value="No" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Security" xil_pn:value="Enable Readback and Reconfiguration" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="SelectMAP Abort Sequence" xil_pn:value="Enable" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Selected Module Instance Name" xil_pn:value="/Top_Tester" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Selected Simulation Root Source Node Behavioral" xil_pn:value="work.Top_Tester" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Selected Simulation Root Source Node Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Selected Simulation Root Source Node Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Selected Simulation Root Source Node Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Selected Simulation Source Node" xil_pn:value="UUT" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulation Model Target" xil_pn:value="Verilog" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulation Run Time ISim" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulation Run Time Par" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulation Run Time Translate" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Slice Packing" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Slice Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Specify 'define Macro Name and Value" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Specify Top Level Instance Names Behavioral" xil_pn:value="work.Top_Tester" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Specify Top Level Instance Names Post-Map" xil_pn:value="Default" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Specify Top Level Instance Names Post-Route" xil_pn:value="Default" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Specify Top Level Instance Names Post-Translate" xil_pn:value="Default" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Speed Grade" xil_pn:value="-1" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Starting Placer Cost Table (1-100)" xil_pn:value="1" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Target Simulator" xil_pn:value="Please Specify" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Timing Mode Map" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Timing Mode Par" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Top-Level Module Name in Output Netlist" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Trim Unconnected Signals" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Tristate On Configuration Pulse Width" xil_pn:value="0" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Unused IOB Pins" xil_pn:value="Pull Down" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use 64-bit PlanAhead on 64-bit Systems" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Clock Enable" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Project File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Project File Post-Map" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Project File Post-Route" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Project File Post-Translate" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Simulation Command File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Simulation Command File Map" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Simulation Command File Par" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Simulation Command File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Waveform Configuration File Behav" xil_pn:value="true" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Use Custom Waveform Configuration File Map" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Waveform Configuration File Par" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Custom Waveform Configuration File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use DSP Block" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use LOC Constraints" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use RLOC Constraints" xil_pn:value="Yes" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Smart Guide" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Synchronous Reset" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Synchronous Set" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Use Synthesis Constraints File" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="User Access Register Value" xil_pn:value="None" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="User Browsed Strategy Files" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="UserID Code (8 Digit Hexadecimal)" xil_pn:value="0xFFFFFFFF" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="VHDL Source Analysis Standard" xil_pn:value="VHDL-93" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Value Range Check" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Verilog 2001 Xst" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Verilog Macros" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Wait for DCI Match (Output Events) virtex5" xil_pn:value="Auto" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Wait for DLL Lock (Output Events) virtex5" xil_pn:value="Default (NoWait)" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Watchdog Timer Mode virtex5" xil_pn:value="Off" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Watchdog Timer Value virtex5" xil_pn:value="0x000000" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="Write Timing Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="XOR Collapsing" xil_pn:value="true" xil_pn:valueState="default"/>
|
||||
<!-- -->
|
||||
<!-- The following properties are for internal use only. These should not be modified.-->
|
||||
<!-- -->
|
||||
<property xil_pn:name="PROP_BehavioralSimTop" xil_pn:value="Module|Top_Tester" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="PROP_DesignName" xil_pn:value="MIPS32-Pipelined-Hw" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="virtex5" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_FPGAConfiguration" xil_pn:value="FPGAConfiguration" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_PostMapSimTop" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_PostParSimTop" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_PostSynthSimTop" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_PostXlateSimTop" xil_pn:value="" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_PreSynthesis" xil_pn:value="PreSynthesis" xil_pn:valueState="default"/>
|
||||
<property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2012-09-08T00:00:44" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="AE9A2C604201437980E6BE5F7A73A833" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
|
||||
<property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
|
||||
</properties>
|
||||
|
||||
<bindings/>
|
||||
|
||||
<libraries/>
|
||||
|
||||
<autoManagedFiles>
|
||||
<!-- The following files are identified by `include statements in verilog -->
|
||||
<!-- source files and are automatically managed by Project Navigator. -->
|
||||
<!-- -->
|
||||
<!-- Do not hand-edit this section, as it will be overwritten when the -->
|
||||
<!-- project is analyzed based on files automatically identified as -->
|
||||
<!-- include files. -->
|
||||
<file xil_pn:name="src/MIPS32/MIPS_Parameters.v" xil_pn:type="FILE_VERILOG"/>
|
||||
</autoManagedFiles>
|
||||
|
||||
</project>
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
INTSTYLE=ise
|
||||
INFILE=C:\root\Work\Gauss\opencores_svn\mips32r1\trunk\Hardware\XUPV5-LX110T_SoC\MIPS32-Pipelined-Hw\Top.ncd
|
||||
OUTFILE=C:\root\Work\Gauss\opencores_svn\mips32r1\trunk\Hardware\XUPV5-LX110T_SoC\MIPS32-Pipelined-Hw\Top.bit
|
||||
FAMILY=Virtex5
|
||||
PART=xc5vlx110t-1ff1136
|
||||
WORKINGDIR=C:\root\Work\Gauss\opencores_svn\mips32r1\trunk\Hardware\XUPV5-LX110T_SoC\MIPS32-Pipelined-Hw
|
||||
LICENSE=ISE
|
||||
USER_INFO=177303621_177303623_177303625_226
|
||||
Executable
+3
File diff suppressed because one or more lines are too long
Executable
+78
@@ -0,0 +1,78 @@
|
||||
<HTML><HEAD><TITLE>Xilinx Design Summary</TITLE></HEAD>
|
||||
<BODY TEXT='#000000' BGCOLOR='#FFFFFF' LINK='#0000EE' VLINK='#551A8B' ALINK='#FF0000'>
|
||||
<TABLE BORDER CELLSPACING=0 CELLPADDING=3 WIDTH='100%'>
|
||||
<TR ALIGN=CENTER BGCOLOR='#99CCFF'>
|
||||
<TD ALIGN=CENTER COLSPAN='4'><B>Top Project Status</B></TD></TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Project File:</B></TD>
|
||||
<TD>MIPS32-Pipelined-Hw.xise</TD>
|
||||
<TD BGCOLOR='#FFFF99'><b>Parser Errors:</b></TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Module Name:</B></TD>
|
||||
<TD>Top</TD>
|
||||
<TD BGCOLOR='#FFFF99'><B>Implementation State:</B></TD>
|
||||
<TD>New</TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Target Device:</B></TD>
|
||||
<TD>xc5vlx110t-1ff1136</TD>
|
||||
<TD BGCOLOR='#FFFF99'><UL><LI><B>Errors:</B></LI></UL></TD>
|
||||
<TD> </TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Product Version:</B></TD><TD>ISE 14.1</TD>
|
||||
<TD BGCOLOR='#FFFF99'><UL><LI><B>Warnings:</B></LI></UL></TD>
|
||||
<TD> </TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Design Goal:</B></dif></TD>
|
||||
<TD>Balanced</TD>
|
||||
<TD BGCOLOR='#FFFF99'><UL><LI><B>Routing Results:</B></LI></UL></TD>
|
||||
<TD>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Design Strategy:</B></dif></TD>
|
||||
<TD><A HREF_DISABLED='Xilinx Default (unlocked)?&DataKey=Strategy'>Xilinx Default (unlocked)</A></TD>
|
||||
<TD BGCOLOR='#FFFF99'><UL><LI><B>Timing Constraints:</B></LI></UL></TD>
|
||||
<TD> </TD>
|
||||
</TR>
|
||||
<TR ALIGN=LEFT>
|
||||
<TD BGCOLOR='#FFFF99'><B>Environment:</B></dif></TD>
|
||||
<TD> </TD>
|
||||
<TD BGCOLOR='#FFFF99'><UL><LI><B>Final Timing Score:</B></LI></UL></TD>
|
||||
<TD> </TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<BR><TABLE BORDER CELLSPACING=0 CELLPADDING=3 WIDTH='100%'>
|
||||
<TR ALIGN=CENTER BGCOLOR='#99CCFF'><TD ALIGN=CENTER COLSPAN='6'><B>Detailed Reports</B></TD><TD ALIGN=RIGHT WIDTH='10%'COLSPAN=1> <A HREF_DISABLED="?&ExpandedTable=DetailedReports"><B>[-]</B></a></TD></TR>
|
||||
<TR BGCOLOR='#FFFF99'><TD><B>Report Name</B></TD><TD><B>Status</B></TD><TD><B>Generated</B></TD>
|
||||
<TD ALIGN=LEFT><B>Errors</B></TD><TD ALIGN=LEFT><B>Warnings</B></TD><TD ALIGN=LEFT COLSPAN='2'><B>Infos</B></TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Synthesis Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Translation Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Map Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Place and Route Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Power Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Post-PAR Static Timing Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
<TR ALIGN=LEFT><TD>Bitgen Report</TD><TD> </TD><TD> </TD><TD> </TD><TD> </TD><TD COLSPAN='2'> </TD></TR>
|
||||
</TABLE>
|
||||
<BR><TABLE BORDER CELLSPACING=0 CELLPADDING=3 WIDTH='100%'>
|
||||
<TR ALIGN=CENTER BGCOLOR='#99CCFF'><TD ALIGN=CENTER COLSPAN='3'><B>Secondary Reports</B></TD><TD ALIGN=RIGHT WIDTH='10%'COLSPAN=1> <A HREF_DISABLED="?&ExpandedTable=SecondaryReports"><B>[-]</B></a></TD></TR>
|
||||
<TR BGCOLOR='#FFFF99'><TD><B>Report Name</B></TD><TD><B>Status</B></TD><TD COLSPAN='2'><B>Generated</B></TD></TR>
|
||||
</TABLE>
|
||||
|
||||
|
||||
<br><center><b>Date Generated:</b> 11/18/2012 - 13:58:40</center>
|
||||
</BODY></HTML>
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<!--This is an ISE project configuration file.-->
|
||||
<!--It holds project specific layout data for the projectmgr plugin.-->
|
||||
<!--Copyright (c) 1995-2009 Xilinx, Inc. All rights reserved.-->
|
||||
<Project version="2" owner="projectmgr" name="MIPS32-Pipelined-Hw" >
|
||||
<!--This is an ISE project configuration file.-->
|
||||
<ItemView engineview="SynthesisOnly" guiview="Source" compilemode="AutoCompile" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>2</ClosedNodesVersion>
|
||||
<ClosedNode>/Automatic `includes</ClosedNode>
|
||||
<ClosedNode>/FIFO_Clear C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Common|FIFO_Clear.v</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/I2C - I2C_Controller</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/LCD_Screen - LCD</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/MIPS32 - Processor</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/Memory - BRAM_592KB_Wrapper</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/Switches - Switches</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/UART - uart_bootloader</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/I2C - I2C_Controller</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/LCD_Screen - LCD</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/MIPS32 - Processor</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/Memory - BRAM_592KB_Wrapper</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/Switches - Switches</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v/UART - uart_bootloader</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/I2C - I2C_Controller</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/I2C - I2C_Controller/PHY - I2C_Phy/FIFO - FIFO_Clear</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/LCD_Screen - LCD</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/MIPS32 - Processor</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/Switches - Switches</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/UART - uart_bootloader</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/UART - uart_bootloader/UART - uart_min/rx_buffer - FIFO_NoFull_Count</ClosedNode>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|opencores_svn|mips32r1|trunk|Hardware|XUPV5-LX110T_SoC|MIPS32-Pipelined-Hw|src|Top.v/UART - uart_bootloader/UART - uart_min/tx_buffer - FIFO_NoFull_Count</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem>Top (C:/root/Work/Gauss/opencores_svn/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src/Top.v)</SelectedItem>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000202000000010000000100000064000000ae000000020000000000000000000000000200000064ffffffff000000810000000300000002000000ae0000000100000003000000000000000100000003</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >true</UserChangedColumnWidths>
|
||||
<CurrentItem>Top (C:/root/Work/Gauss/opencores_svn/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src/Top.v)</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView engineview="SynthesisOnly" sourcetype="" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
<ClosedNode>Design Utilities</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem/>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000000ed000000010000000100000000000000000000000064ffffffff000000810000000000000001000000ed0000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem/>
|
||||
</ItemView>
|
||||
<ItemView guiview="File" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
</ClosedNodes>
|
||||
<SelectedItems/>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000000000000000100000000000000000000000000000000000002f2000000040101000100000000000000000000000064ffffffff000000810000000000000004000000420000000100000000000000240000000100000000000000660000000100000000000002260000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem>Add.v</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView guiview="Library" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
<ClosedNode>work</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems/>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000000000000010000000000000000000000000000000000000109000000010001000100000000000000000000000064ffffffff000000810000000000000001000001090000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem>work</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView engineview="SynthesisOnly" sourcetype="DESUT_VERILOG" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
<ClosedNode>Configure Target Device</ClosedNode>
|
||||
<ClosedNode>Implement Design</ClosedNode>
|
||||
<ClosedNode>Synthesize - XST</ClosedNode>
|
||||
<ClosedNode>User Constraints</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem>Configure Target Device</SelectedItem>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000000c9000000010000000100000000000000000000000064ffffffff000000810000000000000001000000c90000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem>Configure Target Device</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView engineview="SynthesisOnly" sourcetype="DESUT_UCF" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
<ClosedNode>User Constraints</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem/>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000000ed000000010000000100000000000000000000000064ffffffff000000810000000000000001000000ed0000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem/>
|
||||
</ItemView>
|
||||
<SourceProcessView>000000ff00000000000000020000011b0000011b01000000050100000002</SourceProcessView>
|
||||
<CurrentView>Implementation</CurrentView>
|
||||
<ItemView engineview="BehavioralSim" guiview="Source" compilemode="AutoCompile" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>2</ClosedNodesVersion>
|
||||
<ClosedNode>/Top C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Top.v</ClosedNode>
|
||||
<ClosedNode>/Top_Tester C:|root|Work|Gauss|Final|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Simulation|Top_Tester.v</ClosedNode>
|
||||
<ClosedNode>/Top_Tester C:|root|Work|Gauss|XUM_2|Hardware|XUM_Singlecore|MIPS32-Pipelined-Hw|src|Simulation|Top_Tester.v/uut - Top</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem>Unassigned User Library Modules</SelectedItem>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000202000000010000000100000064000000c3000000020000000000000000000000000200000064ffffffff000000810000000300000002000000c30000000100000003000000000000000100000003</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >true</UserChangedColumnWidths>
|
||||
<CurrentItem>Unassigned User Library Modules</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView engineview="BehavioralSim" sourcetype="" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
<ClosedNode>Design Utilities</ClosedNode>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem/>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000000ed000000010000000100000000000000000000000064ffffffff000000810000000000000001000000ed0000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem/>
|
||||
</ItemView>
|
||||
<ItemView engineview="BehavioralSim" sourcetype="DESUT_VERILOG" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
</ClosedNodes>
|
||||
<SelectedItems>
|
||||
<SelectedItem>Simulate Behavioral Model</SelectedItem>
|
||||
</SelectedItems>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000000ed000000010000000100000000000000000000000064ffffffff000000810000000000000001000000ed0000000100000000</ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem>Simulate Behavioral Model</CurrentItem>
|
||||
</ItemView>
|
||||
<ItemView engineview="SynthesisOnly" sourcetype="DESUT_XCO" guiview="Process" >
|
||||
<ClosedNodes>
|
||||
<ClosedNodesVersion>1</ClosedNodesVersion>
|
||||
</ClosedNodes>
|
||||
<SelectedItems/>
|
||||
<ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>
|
||||
<ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>
|
||||
<ViewHeaderState orientation="horizontal" ></ViewHeaderState>
|
||||
<UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>
|
||||
<CurrentItem></CurrentItem>
|
||||
</ItemView>
|
||||
</Project>
|
||||
demo_chip_rtl/rtl/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/iseconfig/Top.xreport
Executable
+215
@@ -0,0 +1,215 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<report-views version="2.0" >
|
||||
<header>
|
||||
<DateModified>2012-11-18T13:58:40</DateModified>
|
||||
<ModuleName>Top</ModuleName>
|
||||
<SummaryTimeStamp>2012-11-18T13:55:48</SummaryTimeStamp>
|
||||
<SavedFilePath>C:/root/Work/Gauss/opencores_svn/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/iseconfig/Top.xreport</SavedFilePath>
|
||||
<ImplementationReportsDirectory>C:/root/Work/Gauss/opencores_svn/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw\</ImplementationReportsDirectory>
|
||||
<DateInitialized>2012-09-08T00:01:22</DateInitialized>
|
||||
<EnableMessageFiltering>false</EnableMessageFiltering>
|
||||
</header>
|
||||
<body>
|
||||
<viewgroup label="Design Overview" >
|
||||
<view inputState="Unknown" program="implementation" ShowPartitionData="false" type="FPGASummary" file="Top_summary.html" label="Summary" >
|
||||
<toc-item title="Design Overview" target="Design Overview" />
|
||||
<toc-item title="Design Utilization Summary" target="Design Utilization Summary" />
|
||||
<toc-item title="Performance Summary" target="Performance Summary" />
|
||||
<toc-item title="Failing Constraints" target="Failing Constraints" />
|
||||
<toc-item title="Detailed Reports" target="Detailed Reports" />
|
||||
</view>
|
||||
<view inputState="Unknown" program="implementation" contextTags="FPGA_ONLY" hidden="true" type="HTML" file="Top_envsettings.html" label="System Settings" />
|
||||
<view inputState="Translated" program="map" locator="MAP_IOB_TABLE" contextTags="FPGA_ONLY" type="IOBProperties" file="Top_map.xrpt" label="IOB Properties" />
|
||||
<view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Control_Sets" file="Top_map.xrpt" label="Control Set Information" />
|
||||
<view inputState="Translated" program="map" locator="MAP_MODULE_HIERARCHY" contextTags="FPGA_ONLY" type="Module_Utilization" file="Top_map.xrpt" label="Module Level Utilization" />
|
||||
<view inputState="Mapped" program="par" locator="CONSTRAINT_TABLE" contextTags="FPGA_ONLY" type="ConstraintsData" file="Top.ptwx" showConstraints="0" label="Timing Constraints" translator="ptwxToTableXML.xslt" />
|
||||
<view inputState="Mapped" program="par" locator="PAR_PINOUT_BY_PIN_NUMBER" contextTags="FPGA_ONLY" type="PinoutData" file="Top_par.xrpt" label="Pinout Report" />
|
||||
<view inputState="Mapped" program="par" locator="PAR_CLOCK_TABLE" contextTags="FPGA_ONLY" type="ClocksData" file="Top_par.xrpt" label="Clock Report" />
|
||||
<view inputState="Mapped" program="par" contextTags="FPGA_ONLY,EDK_OFF" type="Timing_Analyzer" file="Top.twx" label="Static Timing" />
|
||||
<view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="Top_html/fit/report.htm" label="CPLD Fitter Report" />
|
||||
<view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="Top_html/tim/report.htm" label="CPLD Timing Report" />
|
||||
</viewgroup>
|
||||
<viewgroup label="XPS Errors and Warnings" >
|
||||
<view program="platgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/platgen.xmsgs" label="Platgen Messages" />
|
||||
<view program="simgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/simgen.xmsgs" label="Simgen Messages" />
|
||||
<view program="bitinit" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/bitinit.xmsgs" label="BitInit Messages" />
|
||||
</viewgroup>
|
||||
<viewgroup label="XPS Reports" >
|
||||
<view inputState="PreSynthesized" program="platgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="platgen.log" label="Platgen Log File" />
|
||||
<view inputState="PreSynthesized" program="simgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="simgen.log" label="Simgen Log File" />
|
||||
<view inputState="PreSynthesized" program="bitinit" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="bitinit.log" label="BitInit Log File" />
|
||||
<view inputState="PreSynthesized" program="system" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="Top.log" label="System Log File" />
|
||||
</viewgroup>
|
||||
<viewgroup label="Errors and Warnings" >
|
||||
<view program="pn" WrapMessages="true" contextTags="EDK_OFF" type="MessageList" hideColumns="Filtered, New" file="_xmsgs/pn_parser.xmsgs" label="Parser Messages" />
|
||||
<view program="xst" WrapMessages="true" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="MessageList" hideColumns="Filtered" file="_xmsgs/xst.xmsgs" label="Synthesis Messages" />
|
||||
<view inputState="Synthesized" program="ngdbuild" WrapMessages="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/ngdbuild.xmsgs" label="Translation Messages" />
|
||||
<view inputState="Translated" program="map" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/map.xmsgs" label="Map Messages" />
|
||||
<view inputState="Mapped" program="par" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/par.xmsgs" label="Place and Route Messages" />
|
||||
<view inputState="Routed" program="trce" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/trce.xmsgs" label="Timing Messages" />
|
||||
<view inputState="Routed" program="xpwr" WrapMessages="true" contextTags="EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/xpwr.xmsgs" label="Power Messages" />
|
||||
<view inputState="Routed" program="bitgen" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/bitgen.xmsgs" label="Bitgen Messages" />
|
||||
<view inputState="Translated" program="cpldfit" WrapMessages="true" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/cpldfit.xmsgs" label="Fitter Messages" />
|
||||
<view inputState="Current" program="implementation" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/map.xmsgs,_xmsgs/par.xmsgs,_xmsgs/trce.xmsgs,_xmsgs/xpwr.xmsgs,_xmsgs/bitgen.xmsgs" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages" />
|
||||
<view inputState="Current" program="fitting" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/cpldfit.xmsgs,_xmsgs/xpwr.xmsgs" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="CPLD_MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages (CPLD)" />
|
||||
</viewgroup>
|
||||
<viewgroup label="Detailed Reports" >
|
||||
<view program="xst" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="Report" file="Top.syr" label="Synthesis Report" >
|
||||
<toc-item title="Top of Report" target="Copyright " searchDir="Forward" />
|
||||
<toc-item title="Synthesis Options Summary" target=" Synthesis Options Summary " />
|
||||
<toc-item title="HDL Compilation" target=" HDL Compilation " />
|
||||
<toc-item title="Design Hierarchy Analysis" target=" Design Hierarchy Analysis " />
|
||||
<toc-item title="HDL Analysis" target=" HDL Analysis " />
|
||||
<toc-item title="HDL Parsing" target=" HDL Parsing " />
|
||||
<toc-item title="HDL Elaboration" target=" HDL Elaboration " />
|
||||
<toc-item title="HDL Synthesis" target=" HDL Synthesis " />
|
||||
<toc-item title="HDL Synthesis Report" target="HDL Synthesis Report" searchCnt="2" searchDir="Backward" subItemLevel="1" />
|
||||
<toc-item title="Advanced HDL Synthesis" target=" Advanced HDL Synthesis " searchDir="Backward" />
|
||||
<toc-item title="Advanced HDL Synthesis Report" target="Advanced HDL Synthesis Report" subItemLevel="1" />
|
||||
<toc-item title="Low Level Synthesis" target=" Low Level Synthesis " />
|
||||
<toc-item title="Partition Report" target=" Partition Report " />
|
||||
<toc-item title="Final Report" target=" Final Report " />
|
||||
<toc-item title="Design Summary" target=" Design Summary " />
|
||||
<toc-item title="Primitive and Black Box Usage" target="Primitive and Black Box Usage:" subItemLevel="1" />
|
||||
<toc-item title="Device Utilization Summary" target="Device utilization summary:" subItemLevel="1" />
|
||||
<toc-item title="Partition Resource Summary" target="Partition Resource Summary:" subItemLevel="1" />
|
||||
<toc-item title="Timing Report" target="Timing Report" subItemLevel="1" />
|
||||
<toc-item title="Clock Information" target="Clock Information" subItemLevel="2" />
|
||||
<toc-item title="Asynchronous Control Signals Information" target="Asynchronous Control Signals Information" subItemLevel="2" />
|
||||
<toc-item title="Timing Summary" target="Timing Summary" subItemLevel="2" />
|
||||
<toc-item title="Timing Details" target="Timing Details" subItemLevel="2" />
|
||||
<toc-item title="Cross Clock Domains Report" target="Cross Clock Domains Report:" subItemLevel="2" />
|
||||
</view>
|
||||
<view program="synplify" contextTags="SYNPLIFY_ONLY,EDK_OFF" hidden="true" type="Report" file="Top.srr" label="Synplify Report" />
|
||||
<view program="precision" contextTags="PRECISION_ONLY,EDK_OFF" hidden="true" type="Report" file="Top.prec_log" label="Precision Report" />
|
||||
<view inputState="Synthesized" program="ngdbuild" type="Report" file="Top.bld" label="Translation Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Command Line" target="Command Line:" />
|
||||
<toc-item title="Partition Status" target="Partition Implementation Status" />
|
||||
<toc-item title="Final Summary" target="NGDBUILD Design Results Summary:" />
|
||||
</view>
|
||||
<view inputState="Translated" program="map" contextTags="FPGA_ONLY" type="Report" file="Top_map.mrp" label="Map Report" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
<toc-item title="Section 1: Errors" target="Section 1 -" searchDir="Backward" />
|
||||
<toc-item title="Section 2: Warnings" target="Section 2 -" searchDir="Backward" />
|
||||
<toc-item title="Section 3: Infos" target="Section 3 -" searchDir="Backward" />
|
||||
<toc-item title="Section 4: Removed Logic Summary" target="Section 4 -" searchDir="Backward" />
|
||||
<toc-item title="Section 5: Removed Logic" target="Section 5 -" searchDir="Backward" />
|
||||
<toc-item title="Section 6: IOB Properties" target="Section 6 -" searchDir="Backward" />
|
||||
<toc-item title="Section 7: RPMs" target="Section 7 -" searchDir="Backward" />
|
||||
<toc-item title="Section 8: Guide Report" target="Section 8 -" searchDir="Backward" />
|
||||
<toc-item title="Section 9: Area Group and Partition Summary" target="Section 9 -" searchDir="Backward" />
|
||||
<toc-item title="Section 10: Timing Report" target="Section 10 -" searchDir="Backward" />
|
||||
<toc-item title="Section 11: Configuration String Details" target="Section 11 -" searchDir="Backward" />
|
||||
<toc-item title="Section 12: Control Set Information" target="Section 12 -" searchDir="Backward" />
|
||||
<toc-item title="Section 13: Utilization by Hierarchy" target="Section 13 -" searchDir="Backward" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="par" contextTags="FPGA_ONLY" type="Report" file="Top.par" label="Place and Route Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Device Utilization" target="Device Utilization Summary:" />
|
||||
<toc-item title="Router Information" target="Starting Router" />
|
||||
<toc-item title="Partition Status" target="Partition Implementation Status" />
|
||||
<toc-item title="Clock Report" target="Generating Clock Report" />
|
||||
<toc-item title="Timing Results" target="Timing Score:" />
|
||||
<toc-item title="Final Summary" target="Peak Memory Usage:" />
|
||||
</view>
|
||||
<view inputState="Routed" program="trce" contextTags="FPGA_ONLY" type="Report" file="Top.twr" label="Post-PAR Static Timing Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Timing Report Description" target="Device,package,speed:" />
|
||||
<toc-item title="Informational Messages" target="INFO:" />
|
||||
<toc-item title="Warning Messages" target="WARNING:" />
|
||||
<toc-item title="Timing Constraints" target="Timing constraint:" />
|
||||
<toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
|
||||
<toc-item title="Data Sheet Report" target="Data Sheet report:" />
|
||||
<toc-item title="Timing Summary" target="Timing summary:" />
|
||||
<toc-item title="Trace Settings" target="Trace Settings:" />
|
||||
</view>
|
||||
<view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="Top.rpt" label="CPLD Fitter Report (Text)" >
|
||||
<toc-item title="Top of Report" target="cpldfit:" searchDir="Forward" />
|
||||
<toc-item title="Resources Summary" target="** Mapped Resource Summary **" />
|
||||
<toc-item title="Pin Resources" target="** Pin Resources **" />
|
||||
<toc-item title="Global Resources" target="** Global Control Resources **" />
|
||||
</view>
|
||||
<view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="Top.tim" label="CPLD Timing Report (Text)" >
|
||||
<toc-item title="Top of Report" target="Performance Summary Report" searchDir="Forward" />
|
||||
<toc-item title="Performance Summary" target="Performance Summary:" />
|
||||
</view>
|
||||
<view inputState="Routed" program="xpwr" contextTags="EDK_OFF" type="Report" file="Top.pwr" label="Power Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Power summary" target="Power summary" />
|
||||
<toc-item title="Thermal summary" target="Thermal summary" />
|
||||
</view>
|
||||
<view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" type="Report" file="Top.bgn" label="Bitgen Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Bitgen Options" target="Summary of Bitgen Options:" />
|
||||
<toc-item title="Final Summary" target="DRC detected" />
|
||||
</view>
|
||||
</viewgroup>
|
||||
<viewgroup label="Secondary Reports" >
|
||||
<view inputState="PreSynthesized" program="isim" hidden="if_missing" type="Secondary_Report" file="isim.log" label="ISIM Simulator Log" />
|
||||
<view inputState="Synthesized" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/synthesis/Top_synthesis.nlf" label="Post-Synthesis Simulation Model Report" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/translate/Top_translate.nlf" label="Post-Translate Simulation Model Report" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="Top_tran_fecn.nlf" label="Post-Translate Formality Netlist Report" />
|
||||
<view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="Top_map.map" label="Map Log File" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
<toc-item title="Design Information" target="Design Information" />
|
||||
<toc-item title="Design Summary" target="Design Summary" />
|
||||
</view>
|
||||
<view inputState="Routed" program="smartxplorer" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="smartxplorer_results/smartxplorer.txt" label="SmartXplorer Report" />
|
||||
<view inputState="Mapped" program="trce" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top_preroute.twr" label="Post-Map Static Timing Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
<toc-item title="Timing Report Description" target="Device,package,speed:" />
|
||||
<toc-item title="Informational Messages" target="INFO:" />
|
||||
<toc-item title="Warning Messages" target="WARNING:" />
|
||||
<toc-item title="Timing Constraints" target="Timing constraint:" />
|
||||
<toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
|
||||
<toc-item title="Data Sheet Report" target="Data Sheet report:" />
|
||||
<toc-item title="Timing Summary" target="Timing summary:" />
|
||||
<toc-item title="Trace Settings" target="Trace Settings:" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/map/Top_map.nlf" label="Post-Map Simulation Model Report" />
|
||||
<view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top_map.psr" label="Physical Synthesis Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Pad_Report" file="Top_pad.txt" label="Pad Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="Top.unroutes" label="Unroutes Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top_preroute.tsi" label="Post-Map Constraints Interaction Report" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.grf" label="Guide Results Report" />
|
||||
<view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.dly" label="Asynchronous Delay Report" />
|
||||
<view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.clk_rgn" label="Clock Region Report" />
|
||||
<view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.tsi" label="Post-Place and Route Constraints Interaction Report" >
|
||||
<toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="Top_par_fecn.nlf" label="Post-Place and Route Formality Netlist Report" />
|
||||
<view inputState="Routed" program="netgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="netgen/par/Top_timesim.nlf" label="Post-Place and Route Simulation Model Report" />
|
||||
<view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="Top_sta.nlf" label="Primetime Netlist Report" >
|
||||
<toc-item title="Top of Report" target="Release" searchDir="Forward" />
|
||||
</view>
|
||||
<view inputState="Routed" program="ibiswriter" hidden="if_missing" type="Secondary_Report" file="Top.ibs" label="IBIS Model" >
|
||||
<toc-item title="Top of Report" target="IBIS Models for" searchDir="Forward" />
|
||||
<toc-item title="Component" target="Component " />
|
||||
</view>
|
||||
<view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.lck" label="Back-annotate Pin Report" >
|
||||
<toc-item title="Top of Report" target="pin2ucf Report File" searchDir="Forward" />
|
||||
<toc-item title="Constraint Conflicts Information" target="Constraint Conflicts Information" />
|
||||
</view>
|
||||
<view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="Top.lpc" label="Locked Pin Constraints" >
|
||||
<toc-item title="Top of Report" target="top.lpc" searchDir="Forward" />
|
||||
<toc-item title="Newly Added Constraints" target="The following constraints were newly added" />
|
||||
</view>
|
||||
<view inputState="Translated" program="netgen" contextTags="CPLD_ONLY,EDK_OFF" hidden="if_missing" type="Secondary_Report" file="netgen/fit/Top_timesim.nlf" label="Post-Fit Simulation Model Report" />
|
||||
<view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="HTML" file="usage_statistics_webtalk.html" label="WebTalk Report" />
|
||||
<view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="webtalk.log" label="WebTalk Log File" />
|
||||
</viewgroup>
|
||||
</body>
|
||||
</report-views>
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : BRAM_592KB_Wrapper.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 6-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Provides access to Block Memory through a 4-way handshaking protocol,
|
||||
* which allows for multi-cycle and variably-timed operations on the
|
||||
* data bus.
|
||||
*/
|
||||
module BRAM_592KB_Wrapper(
|
||||
input clock,
|
||||
input reset,
|
||||
input rea,
|
||||
input [3:0] wea,
|
||||
input [17:0] addra,
|
||||
input [31:0] dina,
|
||||
output [31:0] douta,
|
||||
output reg dreadya,
|
||||
input reb,
|
||||
input [3:0] web,
|
||||
input [17:0] addrb,
|
||||
input [31:0] dinb,
|
||||
output [31:0] doutb,
|
||||
output reg dreadyb
|
||||
);
|
||||
|
||||
/* Four-Way Memory Handshake Protocol:
|
||||
1. Read/Write request goes high.
|
||||
2. Ack goes high when data is available.
|
||||
3. Read/Write request goes low.
|
||||
4. Ack signal goes low.
|
||||
____
|
||||
R/W: __| |____
|
||||
____
|
||||
Ack: _____| |____
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Writes require one clock cycle, and reads require 2 or 3 clock cycles (registered output).
|
||||
// The following logic controls the Ready signal based on these latencies.
|
||||
reg [1:0] delay_A, delay_B;
|
||||
|
||||
always @(posedge clock) begin
|
||||
delay_A <= (reset | ~rea) ? 2'b00 : ((delay_A == 2'b10) ? delay_A : delay_A + 1);
|
||||
delay_B <= (reset | ~reb) ? 2'b00 : ((delay_B == 2'b10) ? delay_B : delay_B + 1);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
dreadya <= (reset) ? 0 : ((wea != 4'b0000) || ((delay_A == 2'b10) && rea)) ? 1 : 0;
|
||||
dreadyb <= (reset) ? 0 : ((web != 4'b0000) || ((delay_B == 2'b10) && reb)) ? 1 : 0;
|
||||
end
|
||||
|
||||
BRAM_592KB_2R RAM (
|
||||
.clka (clock), // input clka
|
||||
.rsta (reset), // input rsta
|
||||
.wea (wea), // input [3 : 0] wea
|
||||
.addra (addra), // input [17 : 0] addra
|
||||
.dina (dina), // input [31 : 0] dina
|
||||
.douta (douta), // output [31 : 0] douta
|
||||
.clkb (clock), // input clkb
|
||||
.rstb (reset), // input rstb
|
||||
.web (web), // input [3 : 0] web
|
||||
.addrb (addrb), // input [17 : 0] addrb
|
||||
.dinb (dinb), // input [31 : 0] dinb
|
||||
.doutb (doutb) // output [31 : 0] doutb
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+1035
File diff suppressed because it is too large
Load Diff
+90
@@ -0,0 +1,90 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : PLL_100MHz_to_33MHz_66MHz.v
|
||||
// /___/ /\ Timestamp : 11/18/2012 13:35:59
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -st C:\root\Work\Gauss\delclk\ipcore_dir\.\PLL_100MHz_to_33MHz_66MHz.xaw C:\root\Work\Gauss\delclk\ipcore_dir\.\PLL_100MHz_to_33MHz_66MHz
|
||||
//Design Name: PLL_100MHz_to_33MHz_66MHz
|
||||
//Device: xc5vlx110t-1ff1136
|
||||
//
|
||||
// Module PLL_100MHz_to_33MHz_66MHz
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.186 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT1 = 0.162 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_33MHz_66MHz(CLKIN1_IN,
|
||||
RST_IN,
|
||||
CLKOUT0_OUT,
|
||||
CLKOUT1_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
input RST_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output CLKOUT1_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire CLKOUT1_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
BUFG CLKOUT1_BUFG_INST (.I(CLKOUT1_BUF),
|
||||
.O(CLKOUT1_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(12), .CLKOUT1_DIVIDE(6),
|
||||
.CLKOUT0_PHASE(0.000), .CLKOUT1_PHASE(0.000),
|
||||
.CLKOUT0_DUTY_CYCLE(0.500), .CLKOUT1_DUTY_CYCLE(0.500),
|
||||
.COMPENSATION("SYSTEM_SYNCHRONOUS"), .DIVCLK_DIVIDE(1),
|
||||
.CLKFBOUT_MULT(4), .CLKFBOUT_PHASE(0.0), .REF_JITTER(0.005000) )
|
||||
PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(RST_IN),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(CLKOUT1_BUF),
|
||||
.CLKOUT2(),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : pll2.v
|
||||
// /___/ /\ Timestamp : 06/15/2012 18:19:44
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -intstyle C:/root/Work/Gauss/XUM/delz/ipcore_dir/pll2.xaw -st pll2.v
|
||||
//Design Name: pll2
|
||||
//Device: xc5vlx110t-2ff1136
|
||||
//
|
||||
// Module pll2
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.171 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT1 = 0.149 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_50MHz_100MHz(CLKIN1_IN,
|
||||
RST_IN,
|
||||
CLKOUT0_OUT,
|
||||
CLKOUT1_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
input RST_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output CLKOUT1_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire CLKOUT1_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
BUFG CLKOUT1_BUFG_INST (.I(CLKOUT1_BUF),
|
||||
.O(CLKOUT1_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(8), .CLKOUT1_DIVIDE(4),
|
||||
.CLKOUT0_PHASE(0.000), .CLKOUT1_PHASE(0.000),
|
||||
.CLKOUT0_DUTY_CYCLE(0.500), .CLKOUT1_DUTY_CYCLE(0.500),
|
||||
.COMPENSATION("SYSTEM_SYNCHRONOUS"), .DIVCLK_DIVIDE(1),
|
||||
.CLKFBOUT_MULT(4), .CLKFBOUT_PHASE(0.0), .REF_JITTER(0.005000) )
|
||||
PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(RST_IN),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(CLKOUT1_BUF),
|
||||
.CLKOUT2(),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : pl3.v
|
||||
// /___/ /\ Timestamp : 06/15/2012 18:39:50
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -intstyle C:/root/Work/Gauss/XUM/delz/ipcore_dir/pl3.xaw -st pl3.v
|
||||
//Design Name: pl3
|
||||
//Device: xc5vlx110t-2ff1136
|
||||
//
|
||||
// Module pl3
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.171 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT1 = 0.149 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT2 = 0.162 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_50MHz_100MHz_66MHz(CLKIN1_IN,
|
||||
RST_IN,
|
||||
CLKOUT0_OUT,
|
||||
CLKOUT1_OUT,
|
||||
CLKOUT2_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
input RST_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output CLKOUT1_OUT;
|
||||
output CLKOUT2_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire CLKOUT1_BUF;
|
||||
wire CLKOUT2_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
BUFG CLKOUT1_BUFG_INST (.I(CLKOUT1_BUF),
|
||||
.O(CLKOUT1_OUT));
|
||||
BUFG CLKOUT2_BUFG_INST (.I(CLKOUT2_BUF),
|
||||
.O(CLKOUT2_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(8), .CLKOUT1_DIVIDE(4),
|
||||
.CLKOUT2_DIVIDE(6), .CLKOUT0_PHASE(0.000), .CLKOUT1_PHASE(0.000),
|
||||
.CLKOUT2_PHASE(0.000), .CLKOUT0_DUTY_CYCLE(0.500),
|
||||
.CLKOUT1_DUTY_CYCLE(0.500), .CLKOUT2_DUTY_CYCLE(0.500),
|
||||
.COMPENSATION("SYSTEM_SYNCHRONOUS"), .DIVCLK_DIVIDE(1),
|
||||
.CLKFBOUT_MULT(4), .CLKFBOUT_PHASE(0.0), .REF_JITTER(0.005000) )
|
||||
PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(RST_IN),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(CLKOUT1_BUF),
|
||||
.CLKOUT2(CLKOUT2_BUF),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : clk3.v
|
||||
// /___/ /\ Timestamp : 06/06/2012 16:09:06
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -intstyle C:/root/Work/Gauss/XUM/del/ipcore_dir/clk3.xaw -st clk3.v
|
||||
//Design Name: clk3
|
||||
//Device: xc5vlx110t-ff1136-2
|
||||
//
|
||||
// Module clk3
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.162 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_66MHz(CLKIN1_IN,
|
||||
RST_IN,
|
||||
CLKOUT0_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
input RST_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(6), .CLKOUT0_PHASE(0.000),
|
||||
.CLKOUT0_DUTY_CYCLE(0.500), .COMPENSATION("SYSTEM_SYNCHRONOUS"),
|
||||
.DIVCLK_DIVIDE(1), .CLKFBOUT_MULT(4), .CLKFBOUT_PHASE(0.0),
|
||||
.REF_JITTER(0.005000) ) PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(RST_IN),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(),
|
||||
.CLKOUT2(),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : PLL2.v
|
||||
// /___/ /\ Timestamp : 06/07/2012 10:56:40
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -intstyle C:/root/Work/Gauss/XUM/del2/ipcore_dir/PLL2.xaw -st PLL2.v
|
||||
//Design Name: PLL2
|
||||
//Device: xc5vlx110t-ff1136-2
|
||||
//
|
||||
// Module PLL2
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.162 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT1 = 0.141 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_66MHz_133MHz(CLKIN1_IN,
|
||||
RST_IN,
|
||||
CLKOUT0_OUT,
|
||||
CLKOUT1_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
input RST_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output CLKOUT1_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire CLKOUT1_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
BUFG CLKOUT1_BUFG_INST (.I(CLKOUT1_BUF),
|
||||
.O(CLKOUT1_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(6), .CLKOUT1_DIVIDE(3),
|
||||
.CLKOUT0_PHASE(0.000), .CLKOUT1_PHASE(0.000),
|
||||
.CLKOUT0_DUTY_CYCLE(0.500), .CLKOUT1_DUTY_CYCLE(0.500),
|
||||
.COMPENSATION("SYSTEM_SYNCHRONOUS"), .DIVCLK_DIVIDE(1),
|
||||
.CLKFBOUT_MULT(4), .CLKFBOUT_PHASE(0.0), .REF_JITTER(0.005000) )
|
||||
PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(RST_IN),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(CLKOUT1_BUF),
|
||||
.CLKOUT2(),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ____ ____
|
||||
// / /\/ /
|
||||
// /___/ \ / Vendor: Xilinx
|
||||
// \ \ \/ Version : 14.1
|
||||
// \ \ Application : xaw2verilog
|
||||
// / / Filename : pll.v
|
||||
// /___/ /\ Timestamp : 06/12/2012 10:24:28
|
||||
// \ \ / \
|
||||
// \___\/\___\
|
||||
//
|
||||
//Command: xaw2verilog -intstyle C:/root/Work/Gauss/XUM/delz/ipcore_dir/pll.xaw -st pll.v
|
||||
//Design Name: pll
|
||||
//Device: xc5vlx110t-ff1136-2
|
||||
//
|
||||
// Module pll
|
||||
// Generated by Xilinx Architecture Wizard
|
||||
// Written for synthesis tool: XST
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT0 = 0.174 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT1 = 0.152 ns
|
||||
// For block PLL_ADV_INST, Estimated PLL Jitter for CLKOUT2 = 0.133 ns
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module PLL_100MHz_to_66MHz_133MHz_266MHz(CLKIN1_IN,
|
||||
CLKOUT0_OUT,
|
||||
CLKOUT1_OUT,
|
||||
CLKOUT2_OUT,
|
||||
LOCKED_OUT);
|
||||
|
||||
input CLKIN1_IN;
|
||||
output CLKOUT0_OUT;
|
||||
output CLKOUT1_OUT;
|
||||
output CLKOUT2_OUT;
|
||||
output LOCKED_OUT;
|
||||
|
||||
wire CLKFBOUT_CLKFBIN;
|
||||
wire CLKIN1_IBUFG;
|
||||
wire CLKOUT0_BUF;
|
||||
wire CLKOUT1_BUF;
|
||||
wire CLKOUT2_BUF;
|
||||
wire GND_BIT;
|
||||
wire [4:0] GND_BUS_5;
|
||||
wire [15:0] GND_BUS_16;
|
||||
wire VCC_BIT;
|
||||
|
||||
assign GND_BIT = 0;
|
||||
assign GND_BUS_5 = 5'b00000;
|
||||
assign GND_BUS_16 = 16'b0000000000000000;
|
||||
assign VCC_BIT = 1;
|
||||
IBUFG CLKIN1_IBUFG_INST (.I(CLKIN1_IN),
|
||||
.O(CLKIN1_IBUFG));
|
||||
BUFG CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF),
|
||||
.O(CLKOUT0_OUT));
|
||||
BUFG CLKOUT1_BUFG_INST (.I(CLKOUT1_BUF),
|
||||
.O(CLKOUT1_OUT));
|
||||
BUFG CLKOUT2_BUFG_INST (.I(CLKOUT2_BUF),
|
||||
.O(CLKOUT2_OUT));
|
||||
PLL_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.000),
|
||||
.CLKIN2_PERIOD(10.000), .CLKOUT0_DIVIDE(12), .CLKOUT1_DIVIDE(6),
|
||||
.CLKOUT2_DIVIDE(3), .CLKOUT0_PHASE(0.000), .CLKOUT1_PHASE(0.000),
|
||||
.CLKOUT2_PHASE(0.000), .CLKOUT0_DUTY_CYCLE(0.500),
|
||||
.CLKOUT1_DUTY_CYCLE(0.500), .CLKOUT2_DUTY_CYCLE(0.500),
|
||||
.COMPENSATION("SYSTEM_SYNCHRONOUS"), .DIVCLK_DIVIDE(1),
|
||||
.CLKFBOUT_MULT(8), .CLKFBOUT_PHASE(0.0), .REF_JITTER(0.005000) )
|
||||
PLL_ADV_INST (.CLKFBIN(CLKFBOUT_CLKFBIN),
|
||||
.CLKINSEL(VCC_BIT),
|
||||
.CLKIN1(CLKIN1_IBUFG),
|
||||
.CLKIN2(GND_BIT),
|
||||
.DADDR(GND_BUS_5[4:0]),
|
||||
.DCLK(GND_BIT),
|
||||
.DEN(GND_BIT),
|
||||
.DI(GND_BUS_16[15:0]),
|
||||
.DWE(GND_BIT),
|
||||
.REL(GND_BIT),
|
||||
.RST(GND_BIT),
|
||||
.CLKFBDCM(),
|
||||
.CLKFBOUT(CLKFBOUT_CLKFBIN),
|
||||
.CLKOUTDCM0(),
|
||||
.CLKOUTDCM1(),
|
||||
.CLKOUTDCM2(),
|
||||
.CLKOUTDCM3(),
|
||||
.CLKOUTDCM4(),
|
||||
.CLKOUTDCM5(),
|
||||
.CLKOUT0(CLKOUT0_BUF),
|
||||
.CLKOUT1(CLKOUT1_BUF),
|
||||
.CLKOUT2(CLKOUT2_BUF),
|
||||
.CLKOUT3(),
|
||||
.CLKOUT4(),
|
||||
.CLKOUT5(),
|
||||
.DO(),
|
||||
.DRDY(),
|
||||
.LOCKED(LOCKED_OUT));
|
||||
endmodule
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Decoder_2to4.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 14-Aug-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A simple 2-to-4 line single bit decoder. Accepts a two bit number
|
||||
* and sets one of four outputs high based on that number.
|
||||
*
|
||||
* Mapping:
|
||||
* 00 -> 0001
|
||||
* 01 -> 0010
|
||||
* 10 -> 0100
|
||||
* 11 -> 1000
|
||||
*/
|
||||
module Decoder_2to4(
|
||||
input [1:0] A,
|
||||
output reg [3:0] B
|
||||
);
|
||||
|
||||
always @(A) begin
|
||||
case (A)
|
||||
2'd0 : B <= 4'b0001;
|
||||
2'd1 : B <= 4'b0010;
|
||||
2'd2 : B <= 4'b0100;
|
||||
2'd3 : B <= 4'b1000;
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : FIFO.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 4-Apr-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A synchronous FIFO of variable data width and depth. 'enQ' is ignored when
|
||||
* the FIFO is full and 'deQ' is ignored when the FIFO is empty. If 'enQ' and
|
||||
* 'deQ' are asserted simultaneously, the FIFO is unchanged and the output data
|
||||
* is the same as the input data.
|
||||
*
|
||||
* This FIFO is "First word fall-through" meaning data can be read without
|
||||
* asserting 'deQ' by merely supplying an address. However, when 'deQ' is
|
||||
* asserted, the data is "removed" from the FIFO and one location is freed.
|
||||
* If the FIFO is empty and 'enQ' and 'deQ' are not asserted simultaneously,
|
||||
* the output data will be 0s.
|
||||
*
|
||||
* Variation:
|
||||
* - None. This is the basic FIFO module.
|
||||
*/
|
||||
module FIFO(clock, reset, clear, enQ, deQ, data_in, data_out, empty, full);
|
||||
parameter DATA_WIDTH = 8;
|
||||
parameter ADDR_WIDTH = 8;
|
||||
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
|
||||
input clock;
|
||||
input reset;
|
||||
input enQ;
|
||||
input deQ;
|
||||
input [(DATA_WIDTH-1):0] data_in;
|
||||
output [(DATA_WIDTH-1):0] data_out;
|
||||
output empty;
|
||||
output full;
|
||||
|
||||
reg [(ADDR_WIDTH-1):0] enQ_ptr, deQ_ptr; // Addresses for reading from and writing to internal memory
|
||||
reg [(ADDR_WIDTH):0] count; // How many elements are in the FIFO (0->256)
|
||||
assign empty = (count == 0);
|
||||
assign full = (count == (1 << ADDR_WIDTH));
|
||||
|
||||
wire [(DATA_WIDTH-1):0] w_data_out;
|
||||
assign data_out = (empty) ? ((enQ & deQ) ? data_in : 0) : w_data_out;
|
||||
|
||||
wire w_enQ = (full) ? 0 : enQ; // Mask 'enQ' when the FIFO is full
|
||||
wire w_deQ = (empty) ? 0 : deQ; // Mask 'deQ' when the FIFO is empty
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
enQ_ptr <= 0;
|
||||
deQ_ptr <= 0;
|
||||
count <= 0;
|
||||
end
|
||||
else begin
|
||||
enQ_ptr <= (w_enQ) ? enQ_ptr +1 : enQ_ptr;
|
||||
deQ_ptr <= (w_deQ) ? deQ_ptr +1 : deQ_ptr;
|
||||
count <= (w_enQ ~^ w_deQ) ? count : ((w_enQ) ? count +1 : count -1);
|
||||
end
|
||||
end
|
||||
|
||||
SRAM #(
|
||||
.DATA_WIDTH (DATA_WIDTH),
|
||||
.ADDR_WIDTH (ADDR_WIDTH),
|
||||
.RAM_DEPTH (RAM_DEPTH))
|
||||
RAM(
|
||||
.clock (clock),
|
||||
.wEn (w_enQ),
|
||||
.rAddr (deQ_ptr),
|
||||
.wAddr (enQ_ptr),
|
||||
.dIn (data_in),
|
||||
.dOut (w_data_out)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : FIFO_Clear.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 4-Apr-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A synchronous FIFO of variable data width and depth. 'enQ' is ignored when
|
||||
* the FIFO is full and 'deQ' is ignored when the FIFO is empty. If 'enQ' and
|
||||
* 'deQ' are asserted simultaneously, the FIFO is unchanged and the output data
|
||||
* is the same as the input data.
|
||||
*
|
||||
* This FIFO is "First word fall-through" meaning data can be read without
|
||||
* asserting 'deQ' by merely supplying an address. However, when 'deQ' is
|
||||
* asserted, the data is "removed" from the FIFO and one location is freed.
|
||||
* If the FIFO is empty and 'enQ' and 'deQ' are not asserted simultaneously,
|
||||
* the output data will be 0s.
|
||||
*
|
||||
* Variation:
|
||||
* - Input 'clear' empties the FIFO exactly like 'reset' does.
|
||||
*/
|
||||
module FIFO_Clear(clock, reset, clear, enQ, deQ, data_in, data_out, empty, full);
|
||||
parameter DATA_WIDTH = 8;
|
||||
parameter ADDR_WIDTH = 8;
|
||||
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
|
||||
input clock;
|
||||
input reset;
|
||||
input clear;
|
||||
input enQ;
|
||||
input deQ;
|
||||
input [(DATA_WIDTH-1):0] data_in;
|
||||
output [(DATA_WIDTH-1):0] data_out;
|
||||
output empty;
|
||||
output full;
|
||||
|
||||
reg [(ADDR_WIDTH-1):0] enQ_ptr, deQ_ptr; // Addresses for reading from and writing to internal memory
|
||||
reg [(ADDR_WIDTH):0] count; // How many elements are in the FIFO (0->256)
|
||||
assign empty = (count == 0);
|
||||
assign full = (count == (1 << ADDR_WIDTH));
|
||||
|
||||
wire [(DATA_WIDTH-1):0] w_data_out;
|
||||
assign data_out = (empty) ? ((enQ & deQ) ? data_in : 0) : w_data_out;
|
||||
|
||||
wire w_enQ = (full) ? 0 : enQ; // Mask 'enQ' when the FIFO is full
|
||||
wire w_deQ = (empty) ? 0 : deQ; // Mask 'deQ' when the FIFO is empty
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset | clear) begin
|
||||
enQ_ptr <= 0;
|
||||
deQ_ptr <= 0;
|
||||
count <= 0;
|
||||
end
|
||||
else begin
|
||||
enQ_ptr <= (w_enQ) ? enQ_ptr +1 : enQ_ptr;
|
||||
deQ_ptr <= (w_deQ) ? deQ_ptr +1 : deQ_ptr;
|
||||
count <= (w_enQ ~^ w_deQ) ? count : ((w_enQ) ? count +1 : count -1);
|
||||
end
|
||||
end
|
||||
|
||||
SRAM #(
|
||||
.DATA_WIDTH (DATA_WIDTH),
|
||||
.ADDR_WIDTH (ADDR_WIDTH),
|
||||
.RAM_DEPTH (RAM_DEPTH))
|
||||
RAM(
|
||||
.clock (clock),
|
||||
.wEn (w_enQ),
|
||||
.rAddr (deQ_ptr),
|
||||
.wAddr (enQ_ptr),
|
||||
.dIn (data_in),
|
||||
.dOut (w_data_out)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : FIFO_NoFull_Count.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-May-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A synchronous FIFO of variable data width and depth. 'enQ' is ignored when
|
||||
* the FIFO is full and 'deQ' is ignored when the FIFO is empty. If 'enQ' and
|
||||
* 'deQ' are asserted simultaneously, the FIFO is unchanged and the output data
|
||||
* is the same as the input data.
|
||||
*
|
||||
* This FIFO is "First word fall-through" meaning data can be read without
|
||||
* asserting 'deQ' by merely supplying an address. However, when 'deQ' is
|
||||
* asserted, the data is "removed" from the FIFO and one location is freed.
|
||||
* If the FIFO is empty and 'enQ' and 'deQ' are not asserted simultaneously,
|
||||
* the output data will be 0s.
|
||||
*
|
||||
* Variation:
|
||||
* - There is no output to indicate the FIFO is full.
|
||||
* - Output 'count' indicates how many elements are in the FIFO, from 0 to 256
|
||||
* (for 8-bit ADDR_WIDTH).
|
||||
*/
|
||||
module FIFO_NoFull_Count(clock, reset, enQ, deQ, data_in, data_out, empty, count);
|
||||
parameter DATA_WIDTH = 8;
|
||||
parameter ADDR_WIDTH = 8;
|
||||
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
|
||||
input clock;
|
||||
input reset;
|
||||
input enQ;
|
||||
input deQ;
|
||||
input [(DATA_WIDTH-1):0] data_in;
|
||||
output [(DATA_WIDTH-1):0] data_out;
|
||||
output empty;
|
||||
output reg [(ADDR_WIDTH):0] count; // How many elements are in the FIFO (0->256)
|
||||
|
||||
reg [(ADDR_WIDTH-1):0] enQ_ptr, deQ_ptr; // Addresses for reading from and writing to internal memory
|
||||
|
||||
assign empty = (count == 0);
|
||||
wire full = (count == (1 << ADDR_WIDTH));
|
||||
|
||||
wire [(DATA_WIDTH-1):0] w_data_out;
|
||||
assign data_out = (empty) ? ((enQ & deQ) ? data_in : 0) : w_data_out;
|
||||
|
||||
wire w_enQ = (full) ? 0 : enQ; // Mask 'enQ' when the FIFO is full
|
||||
wire w_deQ = (empty) ? 0 : deQ; // Mask 'deQ' when the FIFO is empty
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
enQ_ptr <= 0;
|
||||
deQ_ptr <= 0;
|
||||
count <= 0;
|
||||
end
|
||||
else begin
|
||||
enQ_ptr <= (w_enQ) ? enQ_ptr +1 : enQ_ptr;
|
||||
deQ_ptr <= (w_deQ) ? deQ_ptr +1 : deQ_ptr;
|
||||
count <= (w_enQ ~^ w_deQ) ? count : ((w_enQ) ? count +1 : count -1);
|
||||
end
|
||||
end
|
||||
|
||||
SRAM #(
|
||||
.DATA_WIDTH (DATA_WIDTH),
|
||||
.ADDR_WIDTH (ADDR_WIDTH),
|
||||
.RAM_DEPTH (RAM_DEPTH))
|
||||
ram(
|
||||
.clock (clock),
|
||||
.wEn (w_enQ),
|
||||
.rAddr (deQ_ptr),
|
||||
.wAddr (enQ_ptr),
|
||||
.dIn (data_in),
|
||||
.dOut (w_data_out)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Mux2.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A 2-input Mux of variable width, defaulting to 32-bit width.
|
||||
*/
|
||||
module Mux2 #(parameter WIDTH = 32)(
|
||||
input sel,
|
||||
input [(WIDTH-1):0] in0, in1,
|
||||
output [(WIDTH-1):0] out
|
||||
);
|
||||
|
||||
assign out = (sel) ? in1 : in0;
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Mux4.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A 4-input Mux of variable width, defaulting to 32-bit width.
|
||||
*/
|
||||
module Mux4 #(parameter WIDTH = 32)(
|
||||
input [1:0] sel,
|
||||
input [(WIDTH-1):0] in0, in1, in2, in3,
|
||||
output reg [(WIDTH-1):0] out
|
||||
);
|
||||
|
||||
always @(*) begin
|
||||
case (sel)
|
||||
2'b00 : out <= in0;
|
||||
2'b01 : out <= in1;
|
||||
2'b10 : out <= in2;
|
||||
2'b11 : out <= in3;
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : SRAM.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 4-Apr-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A simple memory of varying width and depth. Reads are asynchronous,
|
||||
* writes are synchronous. Defaults to 8-bit width and 8-bit depth for
|
||||
* a total of 8-bit * 256 entry or 256 bytes of storage.
|
||||
*/
|
||||
module SRAM(clock, wEn, rAddr, wAddr, dIn, dOut);
|
||||
parameter DATA_WIDTH = 8;
|
||||
parameter ADDR_WIDTH = 8;
|
||||
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
|
||||
input clock;
|
||||
input wEn;
|
||||
input [(ADDR_WIDTH-1):0] rAddr;
|
||||
input [(ADDR_WIDTH-1):0] wAddr;
|
||||
input [(DATA_WIDTH-1):0] dIn;
|
||||
output [(DATA_WIDTH-1):0] dOut;
|
||||
|
||||
reg [(DATA_WIDTH-1):0] mem [0:(RAM_DEPTH-1)];
|
||||
assign dOut = mem[rAddr];
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (wEn) mem[wAddr] <= dIn;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : I2C_Clock.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 21-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Generates a 100 kHz clock signal and an indicator which pulses
|
||||
* in the middle of the high and low periods of the clock.
|
||||
*/
|
||||
module I2C_Clock(
|
||||
input clock, // 100 (66) MHz
|
||||
input reset,
|
||||
inout scl, // A 100 (66) kHz clock
|
||||
output scl_tick_90 // A pulse indicating the middle of the +/- scl levels
|
||||
);
|
||||
|
||||
reg [7:0] count_4x;
|
||||
|
||||
|
||||
always @(posedge clock) begin
|
||||
//count_4x <= (reset) ? 8'h00 : (scl) ? count_4x + 1 : count_4x;
|
||||
count_4x <= (reset) ? 8'h00 : count_4x + 1; // XXX SIMULATION ONLY
|
||||
end
|
||||
|
||||
// A single pulse once every 250 cycles
|
||||
wire tick_4x = (count_4x == 8'hFA);
|
||||
|
||||
reg [1:0] state;
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
case (state)
|
||||
2'd0 : state <= (tick_4x) ? 2'd1 : 2'd0;
|
||||
2'd1 : state <= (tick_4x) ? 2'd2 : 2'd1;
|
||||
2'd2 : state <= (tick_4x) ? 2'd3 : 2'd2;
|
||||
2'd3 : state <= (tick_4x) ? 2'd0 : 2'd3;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
assign scl = ((state == 2'd0) || (state == 2'd1));
|
||||
assign scl_tick_90 = tick_4x & ((state == 2'd0) || (state == 2'd2));
|
||||
|
||||
endmodule
|
||||
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : I2C_Controller.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 25-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A top-level I2C controller which bridges the I2C physical layer with
|
||||
* the data memory bus. This controller accepts the following commands:
|
||||
*
|
||||
* Clear : [Bit 8] Empties the I2C FIFO of all data.
|
||||
* EnQ : [Bit 9] Enqueues a byte of data to the FIFO for transmission.
|
||||
* Tx : [Bit 10] Transmits all bytes within the FIFO.
|
||||
* Rx : [Bit 11] Transmits the first byte in the FIFO (bus address),
|
||||
* then receives a requested number of bytes into the FIFO.
|
||||
* RxN : [Bit 12] Sets the number of bytes to receive on an 'Rx' command.
|
||||
*
|
||||
* To read data from the FIFO, the data memory bus issues a Read command. The received
|
||||
* data is arranged as follows:
|
||||
*
|
||||
* Bit 10 : 'Nack' which indicates if the last Tx/Rx command did not receive
|
||||
* an acknowledgment from the slave device.
|
||||
* Bit 9 : Indicates if the FIFO is currently full.
|
||||
* Bit 8 : Indicates if the FIFO is currently empty.
|
||||
* Bit 7-0 : The first byte in the FIFO.
|
||||
*/
|
||||
module I2C_Controller(
|
||||
input clock,
|
||||
input reset,
|
||||
input Read,
|
||||
input Write,
|
||||
input [12:0] DataIn,
|
||||
output [10:0] DataOut,
|
||||
output Ack,
|
||||
|
||||
inout i2c_scl,
|
||||
inout i2c_sda
|
||||
);
|
||||
|
||||
// I2C Physical layer signals
|
||||
wire I2C_Read, I2C_Write;
|
||||
wire I2C_ReadCountSet;
|
||||
wire I2C_EnQ, I2C_DeQ, I2C_Clear;
|
||||
wire [7:0] I2C_DataIn, I2C_DataOut;
|
||||
wire I2C_Ack, I2C_Nack;
|
||||
wire I2C_FifoEmpty, I2C_FifoFull;
|
||||
|
||||
|
||||
wire Cmd_Clear = DataIn[8];
|
||||
wire Cmd_EnQ = DataIn[9];
|
||||
wire Cmd_Tx = DataIn[10];
|
||||
wire Cmd_Rx = DataIn[11];
|
||||
wire Cmd_RxN = DataIn[12];
|
||||
|
||||
|
||||
assign I2C_Read = Write & Cmd_Rx;
|
||||
assign I2C_Write = Write & Cmd_Tx;
|
||||
assign I2C_ReadCountSet = Write & Cmd_RxN;
|
||||
assign I2C_EnQ = Write & Cmd_EnQ;
|
||||
assign I2C_DeQ = Read;
|
||||
assign I2C_Clear = Write & Cmd_Clear;
|
||||
assign I2C_DataIn = DataIn[7:0];
|
||||
assign DataOut[7:0] = I2C_DataOut;
|
||||
assign DataOut[8] = I2C_FifoEmpty;
|
||||
assign DataOut[9] = I2C_FifoFull;
|
||||
assign DataOut[10] = I2C_Nack;
|
||||
assign Ack = I2C_Ack;
|
||||
|
||||
|
||||
// I2C Physical layer
|
||||
I2C_Phy PHY (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.Read (I2C_Read),
|
||||
.Write (I2C_Write),
|
||||
.ReadCountSet (I2C_ReadCountSet),
|
||||
.EnQ (I2C_EnQ),
|
||||
.DeQ (I2C_DeQ),
|
||||
.Clear (I2C_Clear),
|
||||
.DataIn (I2C_DataIn),
|
||||
.DataOut (I2C_DataOut),
|
||||
.Ack (I2C_Ack),
|
||||
.Nack (I2C_Nack),
|
||||
.Fifo_Empty (I2C_FifoEmpty),
|
||||
.Fifo_Full (I2C_FifoFull),
|
||||
.i2c_scl (i2c_scl),
|
||||
.i2c_sda (i2c_sda)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+237
@@ -0,0 +1,237 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : I2C_Phy.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 25-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* I2C Master controller made for a single-master I2C bus.
|
||||
* Uses a FIFO to store transmit and receive data, and is made
|
||||
* to be generic enough to use with a wide variety of I2C slave devices.
|
||||
* A Read command sends a bus address byte then receives a requested number
|
||||
* of bytes, while a Write command writes all bytes that are presently in
|
||||
* the FIFO.
|
||||
*/
|
||||
|
||||
module I2C_Phy(
|
||||
input clock,
|
||||
input reset,
|
||||
input Read,
|
||||
input Write,
|
||||
input ReadCountSet,
|
||||
input EnQ,
|
||||
input DeQ,
|
||||
input Clear,
|
||||
input [7:0] DataIn,
|
||||
output reg [7:0] DataOut,
|
||||
output Ack,
|
||||
output reg Nack,
|
||||
output Fifo_Empty,
|
||||
output Fifo_Full,
|
||||
inout i2c_scl,
|
||||
inout i2c_sda
|
||||
);
|
||||
|
||||
localparam [5:0] IDLE=0, ENQ=1, DEQ=2, START=3, ADDR6=4, ADDR5=5, ADDR4=6, ADDR3=7, ADDR2=8,
|
||||
ADDR1=9, ADDR0=10, RWBIT=11, A_DEQ=12, A_ACK=13, WDWAIT=14, WDATA7=15,
|
||||
WDATA6=16, WDATA5=17, WDATA4=18, WDATA3=19, WDATA2=20, WDATA1=21, WDATA0=22,
|
||||
W_DEQ=23, W_ACK=24, RDATA7=25, RDATA6=26, RDATA5=27, RDATA4=28, RDATA3=29,
|
||||
RDATA2=30, RDATA1=31, RDATA0=32, R_ENQ=33, R_ACKW=34, R_ACK=35, NACK=36,
|
||||
STOPW=37, STOP=38, BUSW=39, CLEAR=40, RNSET=41;
|
||||
|
||||
// FIFO signals
|
||||
wire Fifo_Clear, Fifo_EnQ, Fifo_DeQ;
|
||||
wire [7:0] Fifo_In, Fifo_Out;
|
||||
|
||||
wire scl, scl_tick_90;
|
||||
reg [5:0] state;
|
||||
reg [7:0] Rx_Data;
|
||||
reg sda;
|
||||
reg [7:0] Rx_Todo, Rx_Remain;
|
||||
|
||||
// The I2C bus is high-impedance instead of a driven 1.
|
||||
assign i2c_sda = (sda) ? 1'bz : 1'b0;
|
||||
assign i2c_scl = (scl | (state == IDLE)) ? 1'bz : 1'b0;
|
||||
|
||||
// Control logic : 4-way handshaking
|
||||
assign Ack = (state == BUSW);
|
||||
|
||||
always @(posedge clock) begin
|
||||
Rx_Todo <= (reset) ? 8'h00 : ((state == RNSET) ? DataIn : Rx_Todo);
|
||||
Rx_Remain <= (reset) ? 8'h00 : ((state == IDLE) ? Rx_Todo : ((state == R_ENQ) ? Rx_Remain - 1 : Rx_Remain));
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
DataOut <= (reset) ? 8'h00 : ((state == DEQ) ? Fifo_Out : DataOut);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
Nack <= (reset | (state == START)) ? 0 : ((state == NACK) ? 1 : Nack);
|
||||
end
|
||||
|
||||
assign Fifo_EnQ = (state == ENQ) || (state == R_ENQ);
|
||||
assign Fifo_DeQ = (state == DEQ) || (state == A_DEQ) || (state == W_DEQ);
|
||||
assign Fifo_In = (state == R_ENQ) ? Rx_Data : DataIn;
|
||||
assign Fifo_Clear = (state == CLEAR);
|
||||
|
||||
// Main state machine
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= IDLE;
|
||||
end
|
||||
else begin
|
||||
case (state)
|
||||
IDLE: begin
|
||||
if (EnQ) state <= ENQ;
|
||||
else if (DeQ) state <= DEQ;
|
||||
else if (Clear) state <= CLEAR;
|
||||
else if (ReadCountSet) state <= RNSET;
|
||||
else if ((Read | Write) & scl & scl_tick_90) state <= START;
|
||||
else state <= IDLE;
|
||||
end
|
||||
ENQ: state <= BUSW;
|
||||
DEQ: state <= BUSW;
|
||||
CLEAR: state <= BUSW;
|
||||
RNSET: state <= BUSW;
|
||||
START: state <= (~scl & scl_tick_90) ? ADDR6 : START;
|
||||
ADDR6: state <= (~scl & scl_tick_90) ? ADDR5 : ADDR6;
|
||||
ADDR5: state <= (~scl & scl_tick_90) ? ADDR4 : ADDR5;
|
||||
ADDR4: state <= (~scl & scl_tick_90) ? ADDR3 : ADDR4;
|
||||
ADDR3: state <= (~scl & scl_tick_90) ? ADDR2 : ADDR3;
|
||||
ADDR2: state <= (~scl & scl_tick_90) ? ADDR1 : ADDR2;
|
||||
ADDR1: state <= (~scl & scl_tick_90) ? ADDR0 : ADDR1;
|
||||
ADDR0: state <= (~scl & scl_tick_90) ? RWBIT : ADDR0;
|
||||
RWBIT: state <= (~scl & scl_tick_90) ? A_DEQ : RWBIT;
|
||||
A_DEQ: state <= A_ACK;
|
||||
A_ACK: state <= ( scl & scl_tick_90) ? ((i2c_sda) ? NACK : ((Read) ? RDATA7 : WDWAIT)) : A_ACK;
|
||||
|
||||
// Writes
|
||||
WDWAIT: state <= (~scl & scl_tick_90) ? WDATA7 : WDWAIT;
|
||||
WDATA7: state <= (~scl & scl_tick_90) ? WDATA6 : WDATA7;
|
||||
WDATA6: state <= (~scl & scl_tick_90) ? WDATA5 : WDATA6;
|
||||
WDATA5: state <= (~scl & scl_tick_90) ? WDATA4 : WDATA5;
|
||||
WDATA4: state <= (~scl & scl_tick_90) ? WDATA3 : WDATA4;
|
||||
WDATA3: state <= (~scl & scl_tick_90) ? WDATA2 : WDATA3;
|
||||
WDATA2: state <= (~scl & scl_tick_90) ? WDATA1 : WDATA2;
|
||||
WDATA1: state <= (~scl & scl_tick_90) ? WDATA0 : WDATA1;
|
||||
WDATA0: state <= (~scl & scl_tick_90) ? W_DEQ : WDATA0;
|
||||
W_DEQ: state <= W_ACK;
|
||||
W_ACK: state <= ( scl & scl_tick_90) ? ((i2c_sda) ? NACK : ((Fifo_Empty) ? STOPW : WDWAIT)) : W_ACK;
|
||||
|
||||
// Reads
|
||||
RDATA7: state <= ( scl & scl_tick_90) ? RDATA6 : RDATA7;
|
||||
RDATA6: state <= ( scl & scl_tick_90) ? RDATA5 : RDATA6;
|
||||
RDATA5: state <= ( scl & scl_tick_90) ? RDATA4 : RDATA5;
|
||||
RDATA4: state <= ( scl & scl_tick_90) ? RDATA3 : RDATA4;
|
||||
RDATA3: state <= ( scl & scl_tick_90) ? RDATA2 : RDATA3;
|
||||
RDATA2: state <= ( scl & scl_tick_90) ? RDATA1 : RDATA2;
|
||||
RDATA1: state <= ( scl & scl_tick_90) ? RDATA0 : RDATA1;
|
||||
RDATA0: state <= ( scl & scl_tick_90) ? R_ENQ : RDATA0;
|
||||
R_ENQ: state <= R_ACKW;
|
||||
R_ACKW: state <= (~scl & scl_tick_90) ? R_ACK : R_ACKW;
|
||||
R_ACK: state <= (~scl & scl_tick_90) ? ((Rx_Remain != 8'h00) ? RDATA7 : STOP) : R_ACK;
|
||||
|
||||
// Termination
|
||||
NACK: state <= STOPW;
|
||||
STOPW: state <= (~scl & scl_tick_90) ? STOP : STOPW;
|
||||
STOP: state <= ( scl & scl_tick_90) ? BUSW : STOP;
|
||||
BUSW: state <= (Read | Write | EnQ | DeQ) ? BUSW : IDLE;
|
||||
default: state <= 6'bxxxxxx;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// Incoming data capture
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Rx_Data <= 8'h00;
|
||||
end
|
||||
else begin
|
||||
Rx_Data[7] <= ((state == RDATA7) & scl & scl_tick_90) ? i2c_sda : Rx_Data[7];
|
||||
Rx_Data[6] <= ((state == RDATA6) & scl & scl_tick_90) ? i2c_sda : Rx_Data[6];
|
||||
Rx_Data[5] <= ((state == RDATA5) & scl & scl_tick_90) ? i2c_sda : Rx_Data[5];
|
||||
Rx_Data[4] <= ((state == RDATA4) & scl & scl_tick_90) ? i2c_sda : Rx_Data[4];
|
||||
Rx_Data[3] <= ((state == RDATA3) & scl & scl_tick_90) ? i2c_sda : Rx_Data[3];
|
||||
Rx_Data[2] <= ((state == RDATA2) & scl & scl_tick_90) ? i2c_sda : Rx_Data[2];
|
||||
Rx_Data[1] <= ((state == RDATA1) & scl & scl_tick_90) ? i2c_sda : Rx_Data[1];
|
||||
Rx_Data[0] <= ((state == RDATA0) & scl & scl_tick_90) ? i2c_sda : Rx_Data[0];
|
||||
end
|
||||
end
|
||||
|
||||
// I2C data line assignment
|
||||
always @(*) begin
|
||||
case (state)
|
||||
IDLE: sda <= 1;
|
||||
ENQ: sda <= 1;
|
||||
DEQ: sda <= 1;
|
||||
CLEAR: sda <= 1;
|
||||
START: sda <= 0;
|
||||
ADDR6: sda <= Fifo_Out[6];
|
||||
ADDR5: sda <= Fifo_Out[5];
|
||||
ADDR4: sda <= Fifo_Out[4];
|
||||
ADDR3: sda <= Fifo_Out[3];
|
||||
ADDR2: sda <= Fifo_Out[2];
|
||||
ADDR1: sda <= Fifo_Out[1];
|
||||
ADDR0: sda <= Fifo_Out[0];
|
||||
RWBIT: sda <= Read; // 0 is write, 1 is read
|
||||
A_DEQ: sda <= 1;
|
||||
A_ACK: sda <= 1;
|
||||
WDWAIT: sda <= 1;
|
||||
WDATA7: sda <= Fifo_Out[7];
|
||||
WDATA6: sda <= Fifo_Out[6];
|
||||
WDATA5: sda <= Fifo_Out[5];
|
||||
WDATA4: sda <= Fifo_Out[4];
|
||||
WDATA3: sda <= Fifo_Out[3];
|
||||
WDATA2: sda <= Fifo_Out[2];
|
||||
WDATA1: sda <= Fifo_Out[1];
|
||||
WDATA0: sda <= Fifo_Out[0];
|
||||
W_DEQ: sda <= 1;
|
||||
W_ACK: sda <= 1;
|
||||
RDATA7: sda <= 1;
|
||||
RDATA6: sda <= 1;
|
||||
RDATA5: sda <= 1;
|
||||
RDATA4: sda <= 1;
|
||||
RDATA3: sda <= 1;
|
||||
RDATA2: sda <= 1;
|
||||
RDATA1: sda <= 1;
|
||||
RDATA0: sda <= 1;
|
||||
R_ENQ: sda <= 1;
|
||||
R_ACKW: sda <= 1;
|
||||
R_ACK: sda <= (Rx_Remain == 8'h00); // Low for more data, high for done
|
||||
NACK: sda <= 1;
|
||||
STOPW: sda <= 1;
|
||||
STOP: sda <= 0;
|
||||
BUSW: sda <= 1;
|
||||
default: sda <= 1;
|
||||
endcase
|
||||
end
|
||||
|
||||
// I2C Clock Generation
|
||||
I2C_Clock I2C_Clock (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.scl (scl),
|
||||
.scl_tick_90 (scl_tick_90)
|
||||
);
|
||||
|
||||
FIFO_Clear FIFO (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.clear (Fifo_Clear),
|
||||
.enQ (Fifo_EnQ),
|
||||
.deQ (Fifo_DeQ),
|
||||
.data_in (Fifo_In),
|
||||
.data_out (Fifo_Out),
|
||||
.empty (Fifo_Empty),
|
||||
.full (Fifo_Full)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+204
@@ -0,0 +1,204 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : LCD.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 16-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The top-level LCD controller. This module bridges the underlying 16x2 LCD
|
||||
* hardware controller and the data memory bus. It caches 32 bytes of data which
|
||||
* each correspond to a location on the LCD screen. The LCD screen is continuously
|
||||
* updated with these 32 bytes as quickly as possible.
|
||||
*/
|
||||
module LCD(
|
||||
input clock_100MHz,
|
||||
input clock_Mem,
|
||||
input reset,
|
||||
input [2:0] address,
|
||||
input [31:0] data,
|
||||
input [3:0] writeEnable,
|
||||
output reg ack,
|
||||
output [6:0] LCD
|
||||
);
|
||||
|
||||
localparam [5:0] INIT_1=1, INIT_2=2, INIT_3=3, INIT_4=4, LOC_0=5, LOC_1=6, LOC_2=7,
|
||||
LOC_3=8, LOC_4=9, LOC_5=10, LOC_6=11, LOC_7=12, LOC_8=13, LOC_9=14, LOC_10=15,
|
||||
LOC_11=16, LOC_12=17, LOC_13=18, LOC_14=19, LOC_15=20, LOC_16=21, LOC_17=22,
|
||||
LOC_18=23, LOC_19=24, LOC_20=25, LOC_21=26, LOC_22=27, LOC_23=28, LOC_24=29,
|
||||
LOC_25=30, LOC_26=31, LOC_27=32, LOC_28=33, LOC_29=34, LOC_30=35, LOC_31=36,
|
||||
LINE_2=37, HOME=38;
|
||||
|
||||
|
||||
wire clock = clock_100MHz;
|
||||
reg [31:0] a0, a1, a2, a3, a4, a5, a6, a7;
|
||||
reg [5:0] state;
|
||||
wire bell;
|
||||
|
||||
// LCD driver signals
|
||||
reg [8:0] lcd_command;
|
||||
reg lcd_write;
|
||||
wire lcd_ack;
|
||||
|
||||
assign bell = ~(lcd_write | lcd_ack);
|
||||
|
||||
always @(posedge clock_Mem) begin
|
||||
ack <= (reset) ? 0 : (writeEnable != 4'b0000);
|
||||
end
|
||||
|
||||
/* 32 bytes of LCD memory held on the FPGA fabric. The following is BIG ENDIAN */
|
||||
always @(posedge clock_Mem) begin
|
||||
a0[31:24] <= (reset) ? 8'h20 : (((address == 3'd0) & writeEnable[3]) ? data[31:24] : a0[31:24]);
|
||||
a0[23:16] <= (reset) ? 8'h20 : (((address == 3'd0) & writeEnable[2]) ? data[23:16] : a0[23:16]);
|
||||
a0[15:8] <= (reset) ? 8'h20 : (((address == 3'd0) & writeEnable[1]) ? data[15:8] : a0[15:8]);
|
||||
a0[7:0] <= (reset) ? 8'h20 : (((address == 3'd0) & writeEnable[0]) ? data[7:0] : a0[7:0]);
|
||||
a1[31:24] <= (reset) ? 8'h20 : (((address == 3'd1) & writeEnable[3]) ? data[31:24] : a1[31:24]);
|
||||
a1[23:16] <= (reset) ? 8'h20 : (((address == 3'd1) & writeEnable[2]) ? data[23:16] : a1[23:16]);
|
||||
a1[15:8] <= (reset) ? 8'h20 : (((address == 3'd1) & writeEnable[1]) ? data[15:8] : a1[15:8]);
|
||||
a1[7:0] <= (reset) ? 8'h20 : (((address == 3'd1) & writeEnable[0]) ? data[7:0] : a1[7:0]);
|
||||
a2[31:24] <= (reset) ? 8'h20 : (((address == 3'd2) & writeEnable[3]) ? data[31:24] : a2[31:24]);
|
||||
a2[23:16] <= (reset) ? 8'h20 : (((address == 3'd2) & writeEnable[2]) ? data[23:16] : a2[23:16]);
|
||||
a2[15:8] <= (reset) ? 8'h20 : (((address == 3'd2) & writeEnable[1]) ? data[15:8] : a2[15:8]);
|
||||
a2[7:0] <= (reset) ? 8'h20 : (((address == 3'd2) & writeEnable[0]) ? data[7:0] : a2[7:0]);
|
||||
a3[31:24] <= (reset) ? 8'h20 : (((address == 3'd3) & writeEnable[3]) ? data[31:24] : a3[31:24]);
|
||||
a3[23:16] <= (reset) ? 8'h20 : (((address == 3'd3) & writeEnable[2]) ? data[23:16] : a3[23:16]);
|
||||
a3[15:8] <= (reset) ? 8'h20 : (((address == 3'd3) & writeEnable[1]) ? data[15:8] : a3[15:8]);
|
||||
a3[7:0] <= (reset) ? 8'h21 : (((address == 3'd3) & writeEnable[0]) ? data[7:0] : a3[7:0]);
|
||||
a4[31:24] <= (reset) ? 8'h20 : (((address == 3'd4) & writeEnable[3]) ? data[31:24] : a4[31:24]);
|
||||
a4[23:16] <= (reset) ? 8'h20 : (((address == 3'd4) & writeEnable[2]) ? data[23:16] : a4[23:16]);
|
||||
a4[15:8] <= (reset) ? 8'h20 : (((address == 3'd4) & writeEnable[1]) ? data[15:8] : a4[15:8]);
|
||||
a4[7:0] <= (reset) ? 8'h20 : (((address == 3'd4) & writeEnable[0]) ? data[7:0] : a4[7:0]);
|
||||
a5[31:24] <= (reset) ? 8'h20 : (((address == 3'd5) & writeEnable[3]) ? data[31:24] : a5[31:24]);
|
||||
a5[23:16] <= (reset) ? 8'h20 : (((address == 3'd5) & writeEnable[2]) ? data[23:16] : a5[23:16]);
|
||||
a5[15:8] <= (reset) ? 8'h20 : (((address == 3'd5) & writeEnable[1]) ? data[15:8] : a5[15:8]);
|
||||
a5[7:0] <= (reset) ? 8'h20 : (((address == 3'd5) & writeEnable[0]) ? data[7:0] : a5[7:0]);
|
||||
a6[31:24] <= (reset) ? 8'h20 : (((address == 3'd6) & writeEnable[3]) ? data[31:24] : a6[31:24]);
|
||||
a6[23:16] <= (reset) ? 8'h20 : (((address == 3'd6) & writeEnable[2]) ? data[23:16] : a6[23:16]);
|
||||
a6[15:8] <= (reset) ? 8'h20 : (((address == 3'd6) & writeEnable[1]) ? data[15:8] : a6[15:8]);
|
||||
a6[7:0] <= (reset) ? 8'h20 : (((address == 3'd6) & writeEnable[0]) ? data[7:0] : a6[7:0]);
|
||||
a7[31:24] <= (reset) ? 8'h20 : (((address == 3'd7) & writeEnable[3]) ? data[31:24] : a7[31:24]);
|
||||
a7[23:16] <= (reset) ? 8'h20 : (((address == 3'd7) & writeEnable[2]) ? data[23:16] : a7[23:16]);
|
||||
a7[15:8] <= (reset) ? 8'h20 : (((address == 3'd7) & writeEnable[1]) ? data[15:8] : a7[15:8]);
|
||||
a7[7:0] <= (reset) ? 8'h20 : (((address == 3'd7) & writeEnable[0]) ? data[7:0] : a7[7:0]);
|
||||
end
|
||||
|
||||
/* The LCD continuously writes the memory locations as fast as possible */
|
||||
always @(posedge clock) begin
|
||||
lcd_write <= (reset) ? 1 : ~lcd_ack;
|
||||
end
|
||||
|
||||
/* LCD commands for initialization and looping through 32 locations */
|
||||
always @(*) begin
|
||||
case (state)
|
||||
INIT_1 : lcd_command <= 9'b000101000; // 0x28 'Function Set' Not sure what this means
|
||||
INIT_2 : lcd_command <= 9'b000000110; // Entry mode: set auto increment and no shifting
|
||||
INIT_3 : lcd_command <= 9'b000001100; // Turn LCD on, disable cursor/blinking
|
||||
INIT_4 : lcd_command <= 9'b000000001; // Clear display
|
||||
LOC_0 : lcd_command <= {1'b1, a0[31:24]};
|
||||
LOC_1 : lcd_command <= {1'b1, a0[23:16]};
|
||||
LOC_2 : lcd_command <= {1'b1, a0[15:8]};
|
||||
LOC_3 : lcd_command <= {1'b1, a0[7:0]};
|
||||
LOC_4 : lcd_command <= {1'b1, a1[31:24]};
|
||||
LOC_5 : lcd_command <= {1'b1, a1[23:16]};
|
||||
LOC_6 : lcd_command <= {1'b1, a1[15:8]};
|
||||
LOC_7 : lcd_command <= {1'b1, a1[7:0]};
|
||||
LOC_8 : lcd_command <= {1'b1, a2[31:24]};
|
||||
LOC_9 : lcd_command <= {1'b1, a2[23:16]};
|
||||
LOC_10 : lcd_command <= {1'b1, a2[15:8]};
|
||||
LOC_11 : lcd_command <= {1'b1, a2[7:0]};
|
||||
LOC_12 : lcd_command <= {1'b1, a3[31:24]};
|
||||
LOC_13 : lcd_command <= {1'b1, a3[23:16]};
|
||||
LOC_14 : lcd_command <= {1'b1, a3[15:8]};
|
||||
LOC_15 : lcd_command <= {1'b1, a3[7:0]};
|
||||
LINE_2 : lcd_command <= 9'b011000000;
|
||||
LOC_16 : lcd_command <= {1'b1, a4[31:24]};
|
||||
LOC_17 : lcd_command <= {1'b1, a4[23:16]};
|
||||
LOC_18 : lcd_command <= {1'b1, a4[15:8]};
|
||||
LOC_19 : lcd_command <= {1'b1, a4[7:0]};
|
||||
LOC_20 : lcd_command <= {1'b1, a5[31:24]};
|
||||
LOC_21 : lcd_command <= {1'b1, a5[23:16]};
|
||||
LOC_22 : lcd_command <= {1'b1, a5[15:8]};
|
||||
LOC_23 : lcd_command <= {1'b1, a5[7:0]};
|
||||
LOC_24 : lcd_command <= {1'b1, a6[31:24]};
|
||||
LOC_25 : lcd_command <= {1'b1, a6[23:16]};
|
||||
LOC_26 : lcd_command <= {1'b1, a6[15:8]};
|
||||
LOC_27 : lcd_command <= {1'b1, a6[7:0]};
|
||||
LOC_28 : lcd_command <= {1'b1, a7[31:24]};
|
||||
LOC_29 : lcd_command <= {1'b1, a7[23:16]};
|
||||
LOC_30 : lcd_command <= {1'b1, a7[15:8]};
|
||||
LOC_31 : lcd_command <= {1'b1, a7[7:0]};
|
||||
HOME : lcd_command <= 9'b010000000;
|
||||
default : lcd_command <= 9'bx_xxxx_xxxx;
|
||||
endcase
|
||||
end
|
||||
|
||||
/* Main state machine */
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= INIT_1;
|
||||
end
|
||||
else begin
|
||||
case (state)
|
||||
INIT_1 : state <= (bell) ? INIT_2 : INIT_1;
|
||||
INIT_2 : state <= (bell) ? INIT_3 : INIT_2;
|
||||
INIT_3 : state <= (bell) ? INIT_4 : INIT_3;
|
||||
INIT_4 : state <= (bell) ? LOC_0 : INIT_4;
|
||||
LOC_0 : state <= (bell) ? LOC_1 : LOC_0;
|
||||
LOC_1 : state <= (bell) ? LOC_2 : LOC_1;
|
||||
LOC_2 : state <= (bell) ? LOC_3 : LOC_2;
|
||||
LOC_3 : state <= (bell) ? LOC_4 : LOC_3;
|
||||
LOC_4 : state <= (bell) ? LOC_5 : LOC_4;
|
||||
LOC_5 : state <= (bell) ? LOC_6 : LOC_5;
|
||||
LOC_6 : state <= (bell) ? LOC_7 : LOC_6;
|
||||
LOC_7 : state <= (bell) ? LOC_8 : LOC_7;
|
||||
LOC_8 : state <= (bell) ? LOC_9 : LOC_8;
|
||||
LOC_9 : state <= (bell) ? LOC_10 : LOC_9;
|
||||
LOC_10 : state <= (bell) ? LOC_11 : LOC_10;
|
||||
LOC_11 : state <= (bell) ? LOC_12 : LOC_11;
|
||||
LOC_12 : state <= (bell) ? LOC_13 : LOC_12;
|
||||
LOC_13 : state <= (bell) ? LOC_14 : LOC_13;
|
||||
LOC_14 : state <= (bell) ? LOC_15 : LOC_14;
|
||||
LOC_15 : state <= (bell) ? LINE_2 : LOC_15;
|
||||
LINE_2 : state <= (bell) ? LOC_16 : LINE_2;
|
||||
LOC_16 : state <= (bell) ? LOC_17 : LOC_16;
|
||||
LOC_17 : state <= (bell) ? LOC_18 : LOC_17;
|
||||
LOC_18 : state <= (bell) ? LOC_19 : LOC_18;
|
||||
LOC_19 : state <= (bell) ? LOC_20 : LOC_19;
|
||||
LOC_20 : state <= (bell) ? LOC_21 : LOC_20;
|
||||
LOC_21 : state <= (bell) ? LOC_22 : LOC_21;
|
||||
LOC_22 : state <= (bell) ? LOC_23 : LOC_22;
|
||||
LOC_23 : state <= (bell) ? LOC_24 : LOC_23;
|
||||
LOC_24 : state <= (bell) ? LOC_25 : LOC_24;
|
||||
LOC_25 : state <= (bell) ? LOC_26 : LOC_25;
|
||||
LOC_26 : state <= (bell) ? LOC_27 : LOC_26;
|
||||
LOC_27 : state <= (bell) ? LOC_28 : LOC_27;
|
||||
LOC_28 : state <= (bell) ? LOC_29 : LOC_28;
|
||||
LOC_29 : state <= (bell) ? LOC_30 : LOC_29;
|
||||
LOC_30 : state <= (bell) ? LOC_31 : LOC_30;
|
||||
LOC_31 : state <= (bell) ? HOME : LOC_31;
|
||||
HOME : state <= (bell) ? LOC_0 : HOME;
|
||||
default : state <= 6'bxxxxxx;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
lcd_ctrl LCD_Driver (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.command (lcd_command),
|
||||
.write (lcd_write),
|
||||
.ack (lcd_ack),
|
||||
.LCD_D (LCD[6:3]),
|
||||
.LCD_E (LCD[2]),
|
||||
.LCD_RS (LCD[1]),
|
||||
.LCD_RW (LCD[0])
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+139
@@ -0,0 +1,139 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : lcd_ctrl.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 16-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A controller for the common 16x2-character LCD screen based on the
|
||||
* Sitronix ST7066U, Samsung S6A0069X / KS0066U, Hitachi HD44780, SMOS SED1278,
|
||||
* or other compatible device. This controller uses a 4-bit data bus, is write-only,
|
||||
* and requires a total of 7 output pins to the LCD. The timing must be adjusted for
|
||||
* different input clock frequencies where noted. The primary version is based on a
|
||||
* 100 MHz clock.
|
||||
*/
|
||||
module lcd_ctrl(
|
||||
input clock,
|
||||
input reset,
|
||||
input [8:0] command,
|
||||
input write,
|
||||
output reg ack,
|
||||
//---------------------------------
|
||||
output reg [3:0] LCD_D, // 4-bit LCD data bus
|
||||
output reg LCD_E, // Enable
|
||||
output LCD_RS, // Register Select (0->Register; 1->Data)
|
||||
output LCD_RW // Read/Write (0->Write; 1->Read)
|
||||
);
|
||||
|
||||
localparam [4:0] INIT_1=1, INIT_2=2, INIT_3=3, INIT_4=4, INIT_5=5, INIT_6=6, INIT_7=7, INIT_8=8,
|
||||
CMD_WAIT=9, NOP=10, U_SETUP=11, U_ENAB=12, U_HOLD=13, UL_WAIT=14, L_SETUP=15,
|
||||
L_ENAB=16, L_HOLD=17;
|
||||
|
||||
reg [18:0] count;
|
||||
reg [18:0] compare;
|
||||
reg [4:0] state;
|
||||
wire bell;
|
||||
wire long_instr;
|
||||
|
||||
assign LCD_RW = 0; // There is no reason to read from the LCD screen.
|
||||
assign LCD_RS = command[8];
|
||||
assign bell = (count == compare);
|
||||
assign long_instr = ((command == 9'b0_0000_0001) || (command[8:1] == 8'b0_0000_001));
|
||||
|
||||
|
||||
/* The count register increments until it equals 'compare' */
|
||||
always @(posedge clock) begin
|
||||
count <= (reset | bell) ? 19'b0 : count + 1;
|
||||
end
|
||||
|
||||
/* Time delays for various states */
|
||||
always @(*) begin
|
||||
case (state)
|
||||
INIT_1 : compare <= 19'd410000; // 15ms (4.1ms OK due to power-up delay)
|
||||
INIT_2 : compare <= 19'd24; // 240 ns
|
||||
INIT_3 : compare <= 19'd410000; // 4.1 ms
|
||||
INIT_4 : compare <= 19'd24; // 240 ns
|
||||
INIT_5 : compare <= 19'd10000; // 100 us or longer
|
||||
INIT_6 : compare <= 19'd24; // 240 ns
|
||||
INIT_7 : compare <= 19'd4000; // 40 us or longer
|
||||
INIT_8 : compare <= 19'd24; // 240 ns
|
||||
CMD_WAIT : compare <= (long_instr) ? 19'd164000 : 19'd4000; // 40 us or 1.64 ms
|
||||
NOP : compare <= 19'hxxxxx;
|
||||
U_SETUP : compare <= 19'd4; // 40 ns
|
||||
U_ENAB : compare <= 19'd23; // 230 ns
|
||||
U_HOLD : compare <= 19'd1; // 10 ns
|
||||
UL_WAIT : compare <= 19'd100; // 1 us
|
||||
L_SETUP : compare <= 19'd4; // 40 ns
|
||||
L_ENAB : compare <= 19'd23; // 230 ns
|
||||
L_HOLD : compare <= 19'd1; // 10 ns
|
||||
default : compare <= 19'hxxxxx;
|
||||
endcase
|
||||
end
|
||||
|
||||
/* The main state machine */
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= INIT_1;
|
||||
end
|
||||
else begin
|
||||
case (state)
|
||||
INIT_1 : state <= (bell) ? INIT_2 : INIT_1;
|
||||
INIT_2 : state <= (bell) ? INIT_3 : INIT_2;
|
||||
INIT_3 : state <= (bell) ? INIT_4 : INIT_3;
|
||||
INIT_4 : state <= (bell) ? INIT_5 : INIT_4;
|
||||
INIT_5 : state <= (bell) ? INIT_6 : INIT_5;
|
||||
INIT_6 : state <= (bell) ? INIT_7 : INIT_6;
|
||||
INIT_7 : state <= (bell) ? INIT_8 : INIT_7;
|
||||
INIT_8 : state <= (bell) ? CMD_WAIT : INIT_8;
|
||||
CMD_WAIT : state <= (bell) ? NOP : CMD_WAIT;
|
||||
NOP : state <= (write & ~ack) ? U_SETUP : NOP;
|
||||
U_SETUP : state <= (bell) ? U_ENAB : U_SETUP;
|
||||
U_ENAB : state <= (bell) ? U_HOLD : U_ENAB;
|
||||
U_HOLD : state <= (bell) ? UL_WAIT : U_HOLD;
|
||||
UL_WAIT : state <= (bell) ? L_SETUP : UL_WAIT;
|
||||
L_SETUP : state <= (bell) ? L_ENAB : L_SETUP;
|
||||
L_ENAB : state <= (bell) ? L_HOLD : L_ENAB;
|
||||
L_HOLD : state <= (bell) ? CMD_WAIT : L_HOLD;
|
||||
default : state <= 5'bxxxxx;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
/* Combinatorial enable and data assignments */
|
||||
always @(*) begin
|
||||
case (state)
|
||||
INIT_1 : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
INIT_2 : begin LCD_E <= 0; LCD_D <= 4'b0011; end
|
||||
INIT_3 : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
INIT_4 : begin LCD_E <= 1; LCD_D <= 4'b0011; end
|
||||
INIT_5 : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
INIT_6 : begin LCD_E <= 1; LCD_D <= 4'b0011; end
|
||||
INIT_7 : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
INIT_8 : begin LCD_E <= 1; LCD_D <= 4'b0010; end
|
||||
CMD_WAIT : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
NOP : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
U_SETUP : begin LCD_E <= 0; LCD_D <= command[7:4]; end
|
||||
U_ENAB : begin LCD_E <= 1; LCD_D <= command[7:4]; end
|
||||
U_HOLD : begin LCD_E <= 0; LCD_D <= command[7:4]; end
|
||||
UL_WAIT : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
L_SETUP : begin LCD_E <= 0; LCD_D <= command[3:0]; end
|
||||
L_ENAB : begin LCD_E <= 1; LCD_D <= command[3:0]; end
|
||||
L_HOLD : begin LCD_E <= 0; LCD_D <= command[3:0]; end
|
||||
default : begin LCD_E <= 0; LCD_D <= 4'b0000; end
|
||||
endcase
|
||||
end
|
||||
|
||||
/* Full 4-way Handshake */
|
||||
always @(posedge clock) begin
|
||||
ack <= (reset | ~write) ? 0 : (((state == L_HOLD) && (bell == 1'b1)) ? 1 : ack);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : LED.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 13-Jul-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A read/write interface between a 4-way handshaking data bus and
|
||||
* 8 LEDs.
|
||||
*
|
||||
* An optional mode allows the LEDs to show current interrupts
|
||||
* instead of bus data.
|
||||
*/
|
||||
module LED(
|
||||
input clock,
|
||||
input reset,
|
||||
input [14:0] dataIn,
|
||||
input [7:0] IP,
|
||||
input Write,
|
||||
input Read,
|
||||
output [13:0] dataOut,
|
||||
output reg Ack,
|
||||
output [13:0] LED
|
||||
);
|
||||
|
||||
reg [13:0] data;
|
||||
reg useInterrupts;
|
||||
|
||||
always @(posedge clock) begin
|
||||
data <= (reset) ? 14'b0 : ((Write) ? dataIn[13:0] : data);
|
||||
useInterrupts <= (reset) ? 0 : ((Write) ? dataIn[14] : useInterrupts);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
Ack <= (reset) ? 0 : (Write | Read);
|
||||
end
|
||||
|
||||
assign LED = (useInterrupts) ? {6'b0, IP[7:0]} : data;
|
||||
assign dataOut = data;
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+290
@@ -0,0 +1,290 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : ALU.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many changes have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* An Arithmetic Logic Unit for a MIPS32 processor. This module computes all
|
||||
* arithmetic operations, including the following:
|
||||
*
|
||||
* Add, Subtract, Multiply, And, Or, Nor, Xor, Shift, Count leading 1s/0s.
|
||||
*/
|
||||
module ALU(
|
||||
input clock,
|
||||
input reset,
|
||||
input EX_Stall,
|
||||
input EX_Flush,
|
||||
input [31:0] A, B,
|
||||
input [4:0] Operation,
|
||||
input signed [4:0] Shamt,
|
||||
output reg signed [31:0] Result,
|
||||
output BZero, // Used for Movc
|
||||
output reg EXC_Ov,
|
||||
output ALU_Stall // Stalls due to long ALU operations
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
/***
|
||||
Performance Notes:
|
||||
|
||||
The ALU is the longest delay path in the Execute stage, and one of the longest
|
||||
in the entire processor. This path varies based on the logic blocks that are
|
||||
chosen to implement various functions, but there is certainly room to improve
|
||||
the speed of arithmetic operations. The ALU could also be placed in a separate
|
||||
pipeline stage after the Execute forwarding has completed.
|
||||
***/
|
||||
|
||||
|
||||
/***
|
||||
Divider Logic:
|
||||
|
||||
The hardware divider requires 32 cycles to complete. Because it writes its
|
||||
results to HILO and not to the pipeline, the pipeline can proceed without
|
||||
stalling. When a later instruction tries to access HILO, the pipeline will
|
||||
stall if the divide operation has not yet completed.
|
||||
***/
|
||||
|
||||
|
||||
// Internal state registers
|
||||
reg [63:0] HILO;
|
||||
reg HILO_Access; // Behavioral; not DFFs
|
||||
reg [5:0] CLO_Result, CLZ_Result; // Behavioral; not DFFs
|
||||
reg div_fsm;
|
||||
|
||||
// Internal signals
|
||||
wire [31:0] HI, LO;
|
||||
wire HILO_Commit;
|
||||
wire signed [31:0] As, Bs;
|
||||
wire AddSub_Add;
|
||||
wire signed [31:0] AddSub_Result;
|
||||
wire signed [63:0] Mult_Result;
|
||||
wire [63:0] Multu_Result;
|
||||
wire [31:0] Quotient;
|
||||
wire [31:0] Remainder;
|
||||
wire Div_Stall;
|
||||
wire Div_Start, Divu_Start;
|
||||
wire DivOp;
|
||||
wire Div_Commit;
|
||||
|
||||
// Assignments
|
||||
assign HI = HILO[63:32];
|
||||
assign LO = HILO[31:0];
|
||||
assign HILO_Commit = ~(EX_Stall | EX_Flush);
|
||||
assign As = A;
|
||||
assign Bs = B;
|
||||
assign AddSub_Add = ((Operation == AluOp_Add) | (Operation == AluOp_Addu));
|
||||
assign AddSub_Result = (AddSub_Add) ? (A + B) : (A - B);
|
||||
assign Mult_Result = As * Bs;
|
||||
assign Multu_Result = A * B;
|
||||
assign BZero = (B == 32'h00000000);
|
||||
assign DivOp = (Operation == AluOp_Div) || (Operation == AluOp_Divu);
|
||||
assign Div_Commit = (div_fsm == 1'b1) && (Div_Stall == 1'b0);
|
||||
assign Div_Start = (div_fsm == 1'b0) && (Operation == AluOp_Div) && (HILO_Commit == 1'b1);
|
||||
assign Divu_Start = (div_fsm == 1'b0) && (Operation == AluOp_Divu) && (HILO_Commit == 1'b1);
|
||||
assign ALU_Stall = (div_fsm == 1'b1) && (HILO_Access == 1'b1);
|
||||
|
||||
always @(*) begin
|
||||
case (Operation)
|
||||
AluOp_Add : Result <= AddSub_Result;
|
||||
AluOp_Addu : Result <= AddSub_Result;
|
||||
AluOp_And : Result <= A & B;
|
||||
AluOp_Clo : Result <= {26'b0, CLO_Result};
|
||||
AluOp_Clz : Result <= {26'b0, CLZ_Result};
|
||||
AluOp_Mfhi : Result <= HI;
|
||||
AluOp_Mflo : Result <= LO;
|
||||
AluOp_Mul : Result <= Mult_Result[31:0];
|
||||
AluOp_Nor : Result <= ~(A | B);
|
||||
AluOp_Or : Result <= A | B;
|
||||
AluOp_Sll : Result <= B << Shamt;
|
||||
AluOp_Sllc : Result <= {B[15:0], 16'b0};
|
||||
AluOp_Sllv : Result <= B << A[4:0];
|
||||
AluOp_Slt : Result <= (As < Bs) ? 32'h00000001 : 32'h00000000;
|
||||
AluOp_Sltu : Result <= (A < B) ? 32'h00000001 : 32'h00000000;
|
||||
AluOp_Sra : Result <= Bs >>> Shamt;
|
||||
AluOp_Srav : Result <= Bs >>> As[4:0];
|
||||
AluOp_Srl : Result <= B >> Shamt;
|
||||
AluOp_Srlv : Result <= B >> A[4:0];
|
||||
AluOp_Sub : Result <= AddSub_Result;
|
||||
AluOp_Subu : Result <= AddSub_Result;
|
||||
AluOp_Xor : Result <= A ^ B;
|
||||
default : Result <= 32'bx;
|
||||
endcase
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
HILO <= 64'h00000000_00000000;
|
||||
end
|
||||
else if (Div_Commit) begin
|
||||
HILO <= {Remainder, Quotient};
|
||||
end
|
||||
else if (HILO_Commit) begin
|
||||
case (Operation)
|
||||
AluOp_Mult : HILO <= Mult_Result;
|
||||
AluOp_Multu : HILO <= Multu_Result;
|
||||
AluOp_Madd : HILO <= HILO + Mult_Result;
|
||||
AluOp_Maddu : HILO <= HILO + Multu_Result;
|
||||
AluOp_Msub : HILO <= HILO - Mult_Result;
|
||||
AluOp_Msubu : HILO <= HILO - Multu_Result;
|
||||
AluOp_Mthi : HILO <= {A, LO};
|
||||
AluOp_Mtlo : HILO <= {HI, B};
|
||||
default : HILO <= HILO;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
HILO <= HILO;
|
||||
end
|
||||
end
|
||||
|
||||
// Detect accesses to HILO. RAW and WAW hazards are possible while a
|
||||
// divide operation is computing, so reads and writes to HILO must stall
|
||||
// while the divider is busy.
|
||||
// (This logic could be put into an earlier pipeline stage or into the
|
||||
// datapath bits to improve timing.)
|
||||
always @(Operation) begin
|
||||
case (Operation)
|
||||
AluOp_Div : HILO_Access <= 1;
|
||||
AluOp_Divu : HILO_Access <= 1;
|
||||
AluOp_Mfhi : HILO_Access <= 1;
|
||||
AluOp_Mflo : HILO_Access <= 1;
|
||||
AluOp_Mult : HILO_Access <= 1;
|
||||
AluOp_Multu : HILO_Access <= 1;
|
||||
AluOp_Madd : HILO_Access <= 1;
|
||||
AluOp_Maddu : HILO_Access <= 1;
|
||||
AluOp_Msub : HILO_Access <= 1;
|
||||
AluOp_Msubu : HILO_Access <= 1;
|
||||
AluOp_Mthi : HILO_Access <= 1;
|
||||
AluOp_Mtlo : HILO_Access <= 1;
|
||||
default : HILO_Access <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Divider FSM: The divide unit is either available or busy.
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
div_fsm <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
case (div_fsm)
|
||||
1'd0 : div_fsm <= (DivOp & HILO_Commit) ? 1'd1 : 1'd0;
|
||||
1'd1 : div_fsm <= (~Div_Stall) ? 1'd0 : 1'd1;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// Detect overflow for signed operations. Note that MIPS32 has no overflow
|
||||
// detection for multiplication/division operations.
|
||||
always @(*) begin
|
||||
case (Operation)
|
||||
AluOp_Add : EXC_Ov <= ((A[31] ~^ B[31]) & (A[31] ^ AddSub_Result[31]));
|
||||
AluOp_Sub : EXC_Ov <= ((A[31] ^ B[31]) & (A[31] ^ AddSub_Result[31]));
|
||||
default : EXC_Ov <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Count Leading Ones
|
||||
always @(A) begin
|
||||
casex (A)
|
||||
32'b0xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd0;
|
||||
32'b10xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd1;
|
||||
32'b110x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd2;
|
||||
32'b1110_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd3;
|
||||
32'b1111_0xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd4;
|
||||
32'b1111_10xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd5;
|
||||
32'b1111_110x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd6;
|
||||
32'b1111_1110_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd7;
|
||||
32'b1111_1111_0xxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd8;
|
||||
32'b1111_1111_10xx_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd9;
|
||||
32'b1111_1111_110x_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd10;
|
||||
32'b1111_1111_1110_xxxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd11;
|
||||
32'b1111_1111_1111_0xxx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd12;
|
||||
32'b1111_1111_1111_10xx_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd13;
|
||||
32'b1111_1111_1111_110x_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd14;
|
||||
32'b1111_1111_1111_1110_xxxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd15;
|
||||
32'b1111_1111_1111_1111_0xxx_xxxx_xxxx_xxxx : CLO_Result <= 6'd16;
|
||||
32'b1111_1111_1111_1111_10xx_xxxx_xxxx_xxxx : CLO_Result <= 6'd17;
|
||||
32'b1111_1111_1111_1111_110x_xxxx_xxxx_xxxx : CLO_Result <= 6'd18;
|
||||
32'b1111_1111_1111_1111_1110_xxxx_xxxx_xxxx : CLO_Result <= 6'd19;
|
||||
32'b1111_1111_1111_1111_1111_0xxx_xxxx_xxxx : CLO_Result <= 6'd20;
|
||||
32'b1111_1111_1111_1111_1111_10xx_xxxx_xxxx : CLO_Result <= 6'd21;
|
||||
32'b1111_1111_1111_1111_1111_110x_xxxx_xxxx : CLO_Result <= 6'd22;
|
||||
32'b1111_1111_1111_1111_1111_1110_xxxx_xxxx : CLO_Result <= 6'd23;
|
||||
32'b1111_1111_1111_1111_1111_1111_0xxx_xxxx : CLO_Result <= 6'd24;
|
||||
32'b1111_1111_1111_1111_1111_1111_10xx_xxxx : CLO_Result <= 6'd25;
|
||||
32'b1111_1111_1111_1111_1111_1111_110x_xxxx : CLO_Result <= 6'd26;
|
||||
32'b1111_1111_1111_1111_1111_1111_1110_xxxx : CLO_Result <= 6'd27;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_0xxx : CLO_Result <= 6'd28;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_10xx : CLO_Result <= 6'd29;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_110x : CLO_Result <= 6'd30;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_1110 : CLO_Result <= 6'd31;
|
||||
32'b1111_1111_1111_1111_1111_1111_1111_1111 : CLO_Result <= 6'd32;
|
||||
default : CLO_Result <= 6'd0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Count Leading Zeros
|
||||
always @(A) begin
|
||||
casex (A)
|
||||
32'b1xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd0;
|
||||
32'b01xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd1;
|
||||
32'b001x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd2;
|
||||
32'b0001_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd3;
|
||||
32'b0000_1xxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd4;
|
||||
32'b0000_01xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd5;
|
||||
32'b0000_001x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd6;
|
||||
32'b0000_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd7;
|
||||
32'b0000_0000_1xxx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd8;
|
||||
32'b0000_0000_01xx_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd9;
|
||||
32'b0000_0000_001x_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd10;
|
||||
32'b0000_0000_0001_xxxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd11;
|
||||
32'b0000_0000_0000_1xxx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd12;
|
||||
32'b0000_0000_0000_01xx_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd13;
|
||||
32'b0000_0000_0000_001x_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd14;
|
||||
32'b0000_0000_0000_0001_xxxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd15;
|
||||
32'b0000_0000_0000_0000_1xxx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd16;
|
||||
32'b0000_0000_0000_0000_01xx_xxxx_xxxx_xxxx : CLZ_Result <= 6'd17;
|
||||
32'b0000_0000_0000_0000_001x_xxxx_xxxx_xxxx : CLZ_Result <= 6'd18;
|
||||
32'b0000_0000_0000_0000_0001_xxxx_xxxx_xxxx : CLZ_Result <= 6'd19;
|
||||
32'b0000_0000_0000_0000_0000_1xxx_xxxx_xxxx : CLZ_Result <= 6'd20;
|
||||
32'b0000_0000_0000_0000_0000_01xx_xxxx_xxxx : CLZ_Result <= 6'd21;
|
||||
32'b0000_0000_0000_0000_0000_001x_xxxx_xxxx : CLZ_Result <= 6'd22;
|
||||
32'b0000_0000_0000_0000_0000_0001_xxxx_xxxx : CLZ_Result <= 6'd23;
|
||||
32'b0000_0000_0000_0000_0000_0000_1xxx_xxxx : CLZ_Result <= 6'd24;
|
||||
32'b0000_0000_0000_0000_0000_0000_01xx_xxxx : CLZ_Result <= 6'd25;
|
||||
32'b0000_0000_0000_0000_0000_0000_001x_xxxx : CLZ_Result <= 6'd26;
|
||||
32'b0000_0000_0000_0000_0000_0000_0001_xxxx : CLZ_Result <= 6'd27;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_1xxx : CLZ_Result <= 6'd28;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_01xx : CLZ_Result <= 6'd29;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_001x : CLZ_Result <= 6'd30;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_0001 : CLZ_Result <= 6'd31;
|
||||
32'b0000_0000_0000_0000_0000_0000_0000_0000 : CLZ_Result <= 6'd32;
|
||||
default : CLZ_Result <= 6'd0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Multicycle divide unit
|
||||
Divide Divider (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.OP_div (Div_Start),
|
||||
.OP_divu (Divu_Start),
|
||||
.Dividend (A),
|
||||
.Divisor (B),
|
||||
.Quotient (Quotient),
|
||||
.Remainder (Remainder),
|
||||
.Stall (Div_Stall)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Add.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A simple 32-bit 2-input adder.
|
||||
*/
|
||||
module Add(
|
||||
input [31:0] A,
|
||||
input [31:0] B,
|
||||
output [31:0] C
|
||||
);
|
||||
|
||||
assign C = (A + B);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+529
@@ -0,0 +1,529 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : CPZero.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 16-Sep-2011 GEA Initial design.
|
||||
* 2.0 14-May-2012 GEA Complete rework.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The MIPS-32 Coprocessor 0 (CP0). This is the processor management unit that allows
|
||||
* interrupts, traps, system calls, and other exceptions. It distinguishes
|
||||
* user and kernel modes, provides status information, and can override program
|
||||
* flow. This processor is designed for "bare metal" memory access and thus does
|
||||
* not have virtual memory hardware as a part of it. However, the subset of CP0
|
||||
* is MIPS-32-compliant.
|
||||
*/
|
||||
module CPZero(
|
||||
input clock,
|
||||
//-- CP0 Functionality --//
|
||||
input Mfc0, // CPU instruction is Mfc0
|
||||
input Mtc0, // CPU instruction is Mtc0
|
||||
input IF_Stall,
|
||||
input ID_Stall, // Commits are not made during stalls
|
||||
input COP1, // Instruction for Coprocessor 1
|
||||
input COP2, // Instruction for Coprocessor 2
|
||||
input COP3, // Instruction for Coprocessor 3
|
||||
input ERET, // Instruction is ERET (Exception Return)
|
||||
input [4:0] Rd, // Specifies Cp0 register
|
||||
input [2:0] Sel, // Specifies Cp0 'select'
|
||||
input [31:0] Reg_In, // Data from GP register to replace CP0 register
|
||||
output reg [31:0] Reg_Out, // Data from CP0 register for GP register
|
||||
output KernelMode, // Kernel mode indicator for pipeline transit
|
||||
output ReverseEndian, // Reverse Endian memory indicator for User Mode
|
||||
//-- Hw Interrupts --//
|
||||
input [4:0] Int, // Five hardware interrupts external to the processor
|
||||
//-- Exceptions --//
|
||||
input reset, // Cold Reset (EXC_Reset)
|
||||
// input EXC_SReset, // Soft Reset (not implemented)
|
||||
input EXC_NMI, // Non-Maskable Interrupt
|
||||
input EXC_AdIF, // Address Error Exception from i-fetch (mapped to AdEL)
|
||||
input EXC_AdEL, // Address Error Exception from data memory load
|
||||
input EXC_AdES, // Address Error Exception from data memory store
|
||||
input EXC_Ov, // Integer Overflow Exception
|
||||
input EXC_Tr, // Trap Exception
|
||||
input EXC_Sys, // System Call Exception
|
||||
input EXC_Bp, // Breakpoint Exception
|
||||
input EXC_RI, // Reserved Instruction Exception
|
||||
//-- Exception Data --//
|
||||
input [31:0] ID_RestartPC, // PC for exception, whether PC of instruction or of branch (PC-4) if BDS
|
||||
input [31:0] EX_RestartPC, // Same as 'ID_RestartPC' but in EX stage
|
||||
input [31:0] M_RestartPC, // Same as 'ID_RestartPC' but in MEM stage
|
||||
input ID_IsFlushed,
|
||||
input IF_IsBD, // Indicator of IF exception being a branch delay slot instruction
|
||||
input ID_IsBD, // Indicator of ID exception being a branch delay slot instruction
|
||||
input EX_IsBD, // Indicator of EX exception being a branch delay slot instruction
|
||||
input M_IsBD, // Indicator of M exception being a branch delay slot instruction
|
||||
input [31:0] BadAddr_M, // Bad 'Virtual' Address for exceptions AdEL, AdES in MEM stage
|
||||
input [31:0] BadAddr_IF, // Bad 'Virtual' Address for AdIF (i.e. AdEL) in IF stage
|
||||
input ID_CanErr, // Cumulative signal, i.e. (ID_ID_CanErr | ID_EX_CanErr | ID_M_CanErr)
|
||||
input EX_CanErr, // Cumulative signal, i.e. (EX_EX_CanErr | EX_M_CanErr)
|
||||
input M_CanErr, // Memory stage can error (i.e. cause exception)
|
||||
//-- Exception Control Flow --/
|
||||
output IF_Exception_Stall,
|
||||
output ID_Exception_Stall,
|
||||
output EX_Exception_Stall,
|
||||
output M_Exception_Stall,
|
||||
output IF_Exception_Flush,
|
||||
output ID_Exception_Flush,
|
||||
output EX_Exception_Flush,
|
||||
output M_Exception_Flush,
|
||||
output Exc_PC_Sel, // Mux selector for exception PC override
|
||||
output reg [31:0] Exc_PC_Out, // Address for PC at the beginning of an exception
|
||||
output [7:0] IP // Pending Interrupts from Cause register (for diagnostic purposes)
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
|
||||
/***
|
||||
Exception Control Flow Notes
|
||||
|
||||
- Exceptions can occur in every pipeline stage. This implies that more than one exception
|
||||
can be raised in a single cycle. When this occurs, only the forward-most exception
|
||||
(i.e. MEM over EX) is handled. This and the following note guarantee program order.
|
||||
|
||||
- An exception in any pipeline stage must stall that stage until all following stages are
|
||||
exception-free. This is because it only makes sense for exceptions to occur in program order.
|
||||
|
||||
- A pipeline stage which causes an exception must flush, i.e. prevent any commits it would
|
||||
have normally made and convert itself to a NOP for the next pipeline stage. Furthermore,
|
||||
it must flush all previous pipeline stages as well in order to retain program order.
|
||||
|
||||
- Instructions reading CP0 (mtc0) read in ID without further action. Writes to CP0 (mtc0,
|
||||
eret) also write in ID, but only after forward pipeline stages have been cleared
|
||||
of possible exceptions. This prevents many insidious bugs, such as switching to User Mode
|
||||
in ID when a legitimate memory access in kernel mode is processing in MEM, or conversely
|
||||
a switch to Kernel Mode in ID when an instruction in User Mode is attempting a kernel region
|
||||
memory access (when a kernel mode signal does not propagate through the pipeline).
|
||||
|
||||
- Commits occur in ID (CP0), EX (HILO), MEM, and WB (registers).
|
||||
|
||||
- Hardware interrupts are detected and inserted in the ID stage, but only when there are no
|
||||
other possible exceptions in the pipeline. Because they appear 'asynchronous' to the
|
||||
processor, the remaining instructions in forward stages (EX, MEM, WB) can either be
|
||||
flushed or completed. It is simplest to have them complete to avoid restarts, but the
|
||||
interrupt latency is higher if e.g. the MEM stage stalls on a memory access (this would
|
||||
be unavoidable on single-cycle processors). This implementation allows all forward instructions
|
||||
to complete, for a greater instruction throughput but higher interrupt latency.
|
||||
|
||||
- Software interrupts should appear synchronous in the program order, meaning that all
|
||||
instructions previous to them should complete and no instructions after them should start
|
||||
until the interrupts has been processed.
|
||||
|
||||
Exception Name Short Name Pipeline Stage
|
||||
Address Error Ex (AdEL, AdES) MEM, IF
|
||||
Integer Overflow Ex (Ov) EX
|
||||
Trap Ex (Tr) MEM
|
||||
Syscall (Sys) ID
|
||||
Breakpoint (Bp) ID
|
||||
Reserved Instruction (RI) ID
|
||||
Coprocessor Unusable (CpU) ID
|
||||
Interrupt (Int) ID
|
||||
Reset, SReset, NMI ID
|
||||
***/
|
||||
|
||||
|
||||
// Exceptions Generated Internally
|
||||
wire EXC_CpU;
|
||||
|
||||
// Hardware Interrupt #5, caused by Timer/Perf counter
|
||||
wire Int5;
|
||||
|
||||
// Top-level Authoritative Interrupt Signal
|
||||
wire EXC_Int;
|
||||
|
||||
// General Exception detection (all but Interrupts, Reset, Soft Reset, and NMI)
|
||||
wire EXC_General = EXC_AdIF | EXC_AdEL | EXC_AdES | EXC_Ov | EXC_Tr | EXC_Sys | EXC_Bp | EXC_RI | EXC_CpU;
|
||||
|
||||
// Misc
|
||||
wire CP0_WriteCond;
|
||||
reg [3:0] Cause_ExcCode_bits;
|
||||
|
||||
reg reset_r;
|
||||
always @(posedge clock) begin
|
||||
reset_r <= reset;
|
||||
end
|
||||
|
||||
/***
|
||||
MIPS-32 COPROCESSOR 0 (Cp0) REGISTERS
|
||||
|
||||
These are defined in "MIPS32 Architecture for Programmers Volume III:
|
||||
The MIPS32 Privileged Resource Architecture" from MIPS Technologies, Inc.
|
||||
|
||||
Optional registers are omitted. Changes to the processor (such as adding
|
||||
an MMU/TLB, etc. must be reflected in these registers.
|
||||
*/
|
||||
|
||||
// BadVAddr Register (Register 8, Select 0)
|
||||
reg [31:0] BadVAddr;
|
||||
|
||||
// Count Register (Register 9, Select 0)
|
||||
reg [31:0] Count;
|
||||
|
||||
// Compare Register (Register 11, Select 0)
|
||||
reg [31:0] Compare;
|
||||
|
||||
// Status Register (Register 12, Select 0)
|
||||
wire [2:0] Status_CU_321 = 3'b000;
|
||||
reg Status_CU_0; // Access Control to CPs, [2]->Cp3, ... [0]->Cp0
|
||||
wire Status_RP = 0;
|
||||
wire Status_FR = 0;
|
||||
reg Status_RE; // Reverse Endian Memory for User Mode
|
||||
wire Status_MX = 0;
|
||||
wire Status_PX = 0;
|
||||
reg Status_BEV; // Exception vector locations (0->Norm, 1->Bootstrap)
|
||||
wire Status_TS = 0;
|
||||
wire Status_SR = 0; // Soft reset not implemented
|
||||
reg Status_NMI; // Non-Maskable Interrupt
|
||||
wire Status_RES = 0;
|
||||
wire [1:0] Status_Custom = 2'b00;
|
||||
reg [7:0] Status_IM; // Interrupt mask
|
||||
wire Status_KX = 0;
|
||||
wire Status_SX = 0;
|
||||
wire Status_UX = 0;
|
||||
reg Status_UM; // Base operating mode (0->Kernel, 1->User)
|
||||
wire Status_R0 = 0;
|
||||
reg Status_ERL; // Error Level (0->Normal, 1->Error (reset, NMI))
|
||||
reg Status_EXL; // Exception level (0->Normal, 1->Exception)
|
||||
reg Status_IE; // Interrupt Enable
|
||||
wire [31:0] Status = {Status_CU_321, Status_CU_0, Status_RP, Status_FR, Status_RE, Status_MX,
|
||||
Status_PX, Status_BEV, Status_TS, Status_SR, Status_NMI, Status_RES,
|
||||
Status_Custom, Status_IM, Status_KX, Status_SX, Status_UX,
|
||||
Status_UM, Status_R0, Status_ERL, Status_EXL, Status_IE};
|
||||
|
||||
// Cause Register (Register 13, Select 0)
|
||||
reg Cause_BD; // Exception occured in Branch Delay
|
||||
reg [1:0] Cause_CE; // CP number for CP Unusable exception
|
||||
reg Cause_IV; // Indicator of general IV (0->0x180) or special IV (1->0x200)
|
||||
wire Cause_WP = 0;
|
||||
reg [7:0] Cause_IP; // Pending HW Interrupt indicator.
|
||||
wire Cause_ExcCode4 = 0; // Can be made into a register when this bit is needed.
|
||||
reg [3:0] Cause_ExcCode30; // Description of Exception (only lower 4 bits currently used; see above)
|
||||
wire [31:0] Cause = {Cause_BD, 1'b0, Cause_CE, 4'b0000, Cause_IV, Cause_WP,
|
||||
6'b000000, Cause_IP, 1'b0, Cause_ExcCode4, Cause_ExcCode30, 2'b00};
|
||||
|
||||
// Exception Program Counter (Register 14, Select 0)
|
||||
reg [31:0] EPC;
|
||||
|
||||
// Processor Identification (Register 15, Select 0)
|
||||
wire [7:0] ID_Options = 8'b0000_0000;
|
||||
wire [7:0] ID_CID = 8'b0000_0000;
|
||||
wire [7:0] ID_PID = 8'b0000_0000;
|
||||
wire [7:0] ID_Rev = 8'b0000_0001;
|
||||
wire [31:0] PRId = {ID_Options, ID_CID, ID_PID, ID_Rev};
|
||||
|
||||
// Configuration Register (Register 16, Select 0)
|
||||
wire Config_M = 1;
|
||||
wire [14:0] Config_Impl = 15'b000_0000_0000_0000;
|
||||
wire Config_BE = Big_Endian; // From parameters file
|
||||
wire [1:0] Config_AT = 2'b00;
|
||||
wire [2:0] Config_AR = 3'b000;
|
||||
wire [2:0] Config_MT = 3'b000;
|
||||
wire [2:0] Config_K0 = 3'b000;
|
||||
wire [31:0] Config = {Config_M, Config_Impl, Config_BE, Config_AT, Config_AR, Config_MT,
|
||||
4'b0000, Config_K0};
|
||||
|
||||
// Configuration Register 1 (Register 16, Select 1)
|
||||
wire Config1_M = 0;
|
||||
wire [5:0] Config1_MMU = 6'b000000;
|
||||
wire [2:0] Config1_IS = 3'b000;
|
||||
wire [2:0] Config1_IL = 3'b000;
|
||||
wire [2:0] Config1_IA = 3'b000;
|
||||
wire [2:0] Config1_DS = 3'b000;
|
||||
wire [2:0] Config1_DL = 3'b000;
|
||||
wire [2:0] Config1_DA = 3'b000;
|
||||
wire Config1_C2 = 0;
|
||||
wire Config1_MD = 0;
|
||||
wire Config1_PC = 0; // XXX Performance Counters
|
||||
wire Config1_WR = 0; // XXX Watch Registers
|
||||
wire Config1_CA = 0;
|
||||
wire Config1_EP = 0;
|
||||
wire Config1_FP = 0;
|
||||
wire [31:0] Config1 = {Config1_M, Config1_MMU, Config1_IS, Config1_IL, Config1_IA,
|
||||
Config1_DS, Config1_DL, Config1_DA, Config1_C2,
|
||||
Config1_MD, Config1_PC, Config1_WR, Config1_CA,
|
||||
Config1_EP, Config1_FP};
|
||||
|
||||
// Performance Counter Register (Register 25) XXX TODO
|
||||
|
||||
// ErrorEPC Register (Register 30, Select 0)
|
||||
reg [31:0] ErrorEPC;
|
||||
|
||||
// Exception Detection and Processing
|
||||
wire M_Exception_Detect, EX_Exception_Detect, ID_Exception_Detect, IF_Exception_Detect;
|
||||
wire M_Exception_Mask, EX_Exception_Mask, ID_Exception_Mask, IF_Exception_Mask;
|
||||
wire M_Exception_Ready, EX_Exception_Ready, ID_Exception_Ready, IF_Exception_Ready;
|
||||
|
||||
assign IP = Cause_IP;
|
||||
|
||||
/*** Coprocessor Unusable Exception ***/
|
||||
assign EXC_CpU = COP1 | COP2 | COP3 | ((Mtc0 | Mfc0 | ERET) & ~(Status_CU_0 | KernelMode));
|
||||
|
||||
/*** Kernel Mode Signal ***/
|
||||
assign KernelMode = ~Status_UM | Status_EXL | Status_ERL;
|
||||
|
||||
/*** Reverse Endian for User Mode ***/
|
||||
assign ReverseEndian = Status_RE;
|
||||
|
||||
/*** Interrupts ***/
|
||||
assign Int5 = (Count == Compare);
|
||||
//assign EXC_Int = ((Cause_IP[7:0] & Status_IM[7:0]) != 8'h00) & Status_IE & ~Status_EXL & ~Status_ERL & ~ID_IsFlushed;
|
||||
wire Enabled_Interrupt = EXC_NMI | (Status_IE & ((Cause_IP[7:0] & Status_IM[7:0]) != 8'h00));
|
||||
assign EXC_Int = Enabled_Interrupt & ~Status_EXL & ~Status_ERL & ~ID_IsFlushed;
|
||||
|
||||
assign CP0_WriteCond = (Status_CU_0 | KernelMode) & Mtc0 & ~ID_Stall;
|
||||
|
||||
|
||||
/***
|
||||
Exception Hazard Flow Control Explanation:
|
||||
- An exception at any time in any stage causes its own and any previous stages to
|
||||
flush (clear own commits, NOPS to fwd stages).
|
||||
- An exception in a stage can also stall that stage (and inherently all previous stages) if and only if:
|
||||
1. A forward stage is capable of causing an exception AND
|
||||
2. A forward stage is not currently causing an exception.
|
||||
- An exception is ready to process when it is detected and not stalled in a stage.
|
||||
|
||||
Flush specifics per pipeline stage:
|
||||
MEM: Mask 'MemWrite' and 'MemRead' (for performance) after EX/M and before data memory. NOPs to M/WB.
|
||||
EX : Mask writes to HI/LO. NOPs to EX/M.
|
||||
ID : Mask writes (reads?) to CP0. NOPs to ID/EX.
|
||||
IF : NOP to IF/ID.
|
||||
***/
|
||||
|
||||
/*** Exceptions grouped by pipeline stage ***/
|
||||
assign M_Exception_Detect = EXC_AdEL | EXC_AdES | EXC_Tr;
|
||||
assign EX_Exception_Detect = EXC_Ov;
|
||||
assign ID_Exception_Detect = EXC_Sys | EXC_Bp | EXC_RI | EXC_CpU | EXC_Int;
|
||||
assign IF_Exception_Detect = EXC_AdIF;
|
||||
|
||||
/*** Exception mask conditions ***/
|
||||
|
||||
// A potential bug would occur if e.g. EX stalls, MEM has data, but MEM is not stalled and finishes
|
||||
// going through the pipeline so forwarding would fail. This is not a problem however because
|
||||
// EX would not need data since it would flush on an exception.
|
||||
assign M_Exception_Mask = IF_Stall;
|
||||
assign EX_Exception_Mask = IF_Stall | M_CanErr;
|
||||
assign ID_Exception_Mask = IF_Stall | M_CanErr | EX_CanErr;
|
||||
assign IF_Exception_Mask = M_CanErr | EX_CanErr | ID_CanErr | EXC_Int;
|
||||
|
||||
/***
|
||||
Exceptions which must wait for forward stages. A stage will not stall if a forward stage has an exception.
|
||||
These stalls must be inserted as stall conditions in the hazard unit so that it will take care of chaining.
|
||||
All writes to CP0 must also wait for forward hazard conditions to clear.
|
||||
*/
|
||||
assign M_Exception_Stall = M_Exception_Detect & M_Exception_Mask;
|
||||
assign EX_Exception_Stall = EX_Exception_Detect & EX_Exception_Mask & ~M_Exception_Detect;
|
||||
assign ID_Exception_Stall = (ID_Exception_Detect | ERET | Mtc0) & ID_Exception_Mask & ~(EX_Exception_Detect | M_Exception_Detect);
|
||||
assign IF_Exception_Stall = IF_Exception_Detect & IF_Exception_Mask & ~(ID_Exception_Detect | EX_Exception_Detect | M_Exception_Detect);
|
||||
|
||||
|
||||
/*** Exceptions which are ready to process (mutually exclusive) ***/
|
||||
// XXX can remove ~ID_Stall since in mask now (?)
|
||||
assign M_Exception_Ready = ~ID_Stall & M_Exception_Detect & ~M_Exception_Mask;
|
||||
assign EX_Exception_Ready = ~ID_Stall & EX_Exception_Detect & ~EX_Exception_Mask;
|
||||
assign ID_Exception_Ready = ~ID_Stall & ID_Exception_Detect & ~ID_Exception_Mask;
|
||||
assign IF_Exception_Ready = ~ID_Stall & IF_Exception_Detect & ~IF_Exception_Mask;
|
||||
|
||||
/***
|
||||
Flushes. A flush clears a pipeline stage's control signals and prevents the stage from committing any changes.
|
||||
Data such as 'RestartPC' and the detected exception must remain.
|
||||
*/
|
||||
assign M_Exception_Flush = M_Exception_Detect;
|
||||
assign EX_Exception_Flush = M_Exception_Detect | EX_Exception_Detect;
|
||||
assign ID_Exception_Flush = M_Exception_Detect | EX_Exception_Detect | ID_Exception_Detect;
|
||||
assign IF_Exception_Flush = M_Exception_Detect | EX_Exception_Detect | ID_Exception_Detect | IF_Exception_Detect | (ERET & ~ID_Stall) | reset_r;
|
||||
|
||||
|
||||
/*** Software reads of CP0 Registers ***/
|
||||
always @(*) begin
|
||||
if (Mfc0 & (Status_CU_0 | KernelMode)) begin
|
||||
case (Rd)
|
||||
5'd8 : Reg_Out <= BadVAddr;
|
||||
5'd9 : Reg_Out <= Count;
|
||||
5'd11 : Reg_Out <= Compare;
|
||||
5'd12 : Reg_Out <= Status;
|
||||
5'd13 : Reg_Out <= Cause;
|
||||
5'd14 : Reg_Out <= EPC;
|
||||
5'd15 : Reg_Out <= PRId;
|
||||
5'd16 : Reg_Out <= (Sel == 3'b000) ? Config : Config1;
|
||||
5'd30 : Reg_Out <= ErrorEPC;
|
||||
default : Reg_Out <= 32'h0000_0000;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
Reg_Out <= 32'h0000_0000;
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: Non-general exceptions (Reset, Soft Reset, NMI...) ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Status_BEV <= 1;
|
||||
Status_NMI <= 0;
|
||||
Status_ERL <= 1;
|
||||
ErrorEPC <= 32'b0;
|
||||
end
|
||||
else if (ID_Exception_Ready & EXC_NMI) begin
|
||||
Status_BEV <= 1;
|
||||
Status_NMI <= 1;
|
||||
Status_ERL <= 1;
|
||||
ErrorEPC <= ID_RestartPC;
|
||||
end
|
||||
else begin
|
||||
Status_BEV <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[22] : Status_BEV;
|
||||
Status_NMI <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[19] : Status_NMI;
|
||||
Status_ERL <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[2] : ((Status_ERL & ERET & ~ID_Stall) ? 0 : Status_ERL);
|
||||
ErrorEPC <= (CP0_WriteCond & (Rd == 5'd30) & (Sel == 3'b000)) ? Reg_In : ErrorEPC;
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: All other registers ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Count <= 32'b0;
|
||||
Compare <= 32'b0;
|
||||
Status_CU_0 <= 0;
|
||||
Status_RE <= 0;
|
||||
Status_IM <= 8'b0;
|
||||
Status_UM <= 0;
|
||||
Status_IE <= 0;
|
||||
Cause_IV <= 0;
|
||||
Cause_IP <= 8'b0;
|
||||
end
|
||||
else begin
|
||||
Count <= (CP0_WriteCond & (Rd == 5'd9 ) & (Sel == 3'b000)) ? Reg_In : ((Count == Compare) ? 32'b0 : Count + 1);
|
||||
Compare <= (CP0_WriteCond & (Rd == 5'd11) & (Sel == 3'b000)) ? Reg_In : Compare;
|
||||
Status_CU_0 <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[28] : Status_CU_0;
|
||||
Status_RE <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[25] : Status_RE;
|
||||
Status_IM <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[15:8] : Status_IM;
|
||||
Status_UM <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[4] : Status_UM;
|
||||
Status_IE <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[0] : Status_IE;
|
||||
Cause_IV <= (CP0_WriteCond & (Rd == 5'd13) & (Sel == 3'b000)) ? Reg_In[23] : Cause_IV;
|
||||
/* Cause_IP indicates 8 interrupts:
|
||||
[7] is set by the timer comparison, and cleared by reading 'Count'.
|
||||
[6:2] are set and cleared by external hardware.
|
||||
[1:0] are set and cleared by software.
|
||||
*/
|
||||
// If reading -> 0, Otherwise if 0 -> Int5.
|
||||
Cause_IP[7] <= ((Status_CU_0 | KernelMode) & Mfc0 & (Rd == 5'd9) & (Sel == 3'b000)) ? 0 : ((Cause_IP[7] == 0) ? Int5 : Cause_IP[7]);
|
||||
Cause_IP[6:2] <= Int[4:0];
|
||||
Cause_IP[1:0] <= (CP0_WriteCond & (Rd == 5'd13) & (Sel == 3'b000)) ? Reg_In[9:8] : Cause_IP[1:0];
|
||||
end
|
||||
end
|
||||
|
||||
/*** Cp0 Register Assignments: General Exception and Interrupt Processing ***/
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
Cause_BD <= 0;
|
||||
Cause_CE <= 2'b00;
|
||||
Cause_ExcCode30 <= 4'b0000;
|
||||
Status_EXL <= 0;
|
||||
EPC <= 32'h0;
|
||||
BadVAddr <= 32'h0;
|
||||
end
|
||||
else begin
|
||||
// MEM stage
|
||||
if (M_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : M_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : M_RestartPC;
|
||||
BadVAddr <= BadAddr_M;
|
||||
end
|
||||
// EX stage
|
||||
else if (EX_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : EX_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : EX_RestartPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
// ID stage
|
||||
else if (ID_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : ID_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : ID_RestartPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
// IF stage
|
||||
else if (IF_Exception_Ready) begin
|
||||
Cause_BD <= (Status_EXL) ? Cause_BD : IF_IsBD;
|
||||
Cause_CE <= (COP3) ? 2'b11 : ((COP2) ? 2'b10 : ((COP1) ? 2'b01 : 2'b00));
|
||||
Cause_ExcCode30 <= Cause_ExcCode_bits;
|
||||
Status_EXL <= 1;
|
||||
EPC <= (Status_EXL) ? EPC : BadAddr_IF;
|
||||
BadVAddr <= BadAddr_IF;
|
||||
end
|
||||
// No exceptions this cycle
|
||||
else begin
|
||||
Cause_BD <= 1'b0;
|
||||
Cause_CE <= Cause_CE;
|
||||
Cause_ExcCode30 <= Cause_ExcCode30;
|
||||
// Without new exceptions, 'Status_EXL' is set by software or cleared by ERET.
|
||||
Status_EXL <= (CP0_WriteCond & (Rd == 5'd12) & (Sel == 3'b000)) ? Reg_In[1] : ((Status_EXL & ERET & ~ID_Stall) ? 0 : Status_EXL);
|
||||
// The EPC is also writable by software
|
||||
EPC <= (CP0_WriteCond & (Rd == 5'd14) & (Sel == 3'b000)) ? Reg_In : EPC;
|
||||
BadVAddr <= BadVAddr;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
/*** Program Counter for all Exceptions/Interrupts ***/
|
||||
always @(*) begin
|
||||
// Following is redundant since PC has initial value now.
|
||||
if (reset) begin
|
||||
Exc_PC_Out <= EXC_Vector_Base_Reset;
|
||||
end
|
||||
else if (ERET & ~ID_Stall) begin
|
||||
Exc_PC_Out <= (Status_ERL) ? ErrorEPC : EPC;
|
||||
end
|
||||
else if (EXC_General) begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_General) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_General);
|
||||
end
|
||||
else if (EXC_NMI) begin
|
||||
Exc_PC_Out <= EXC_Vector_Base_Reset;
|
||||
end
|
||||
else if (EXC_Int & Cause_IV) begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_Special) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_Special);
|
||||
end
|
||||
else begin
|
||||
Exc_PC_Out <= (Status_BEV) ? (EXC_Vector_Base_Other_Boot + EXC_Vector_Offset_General) :
|
||||
(EXC_Vector_Base_Other_NoBoot + EXC_Vector_Offset_General);
|
||||
end
|
||||
end
|
||||
|
||||
//assign Exc_PC_Sel = (reset | (ERET & ~ID_Stall) | EXC_General | EXC_Int);
|
||||
assign Exc_PC_Sel = reset | (ERET & ~ID_Stall) | IF_Exception_Ready | ID_Exception_Ready | EX_Exception_Ready | M_Exception_Ready;
|
||||
|
||||
/*** Cause Register ExcCode Field ***/
|
||||
always @(*) begin
|
||||
// Ordered by Pipeline Stage with Interrupts last
|
||||
if (EXC_AdEL) Cause_ExcCode_bits <= 4'h4; // 00100
|
||||
else if (EXC_AdES) Cause_ExcCode_bits <= 4'h5; // 00101
|
||||
else if (EXC_Tr) Cause_ExcCode_bits <= 4'hd; // 01101
|
||||
else if (EXC_Ov) Cause_ExcCode_bits <= 4'hc; // 01100
|
||||
else if (EXC_Sys) Cause_ExcCode_bits <= 4'h8; // 01000
|
||||
else if (EXC_Bp) Cause_ExcCode_bits <= 4'h9; // 01001
|
||||
else if (EXC_RI) Cause_ExcCode_bits <= 4'ha; // 01010
|
||||
else if (EXC_CpU) Cause_ExcCode_bits <= 4'hb; // 01011
|
||||
else if (EXC_AdIF) Cause_ExcCode_bits <= 4'h4; // 00100
|
||||
else if (EXC_Int) Cause_ExcCode_bits <= 4'h0; // 00000 // OK that NMI writes this.
|
||||
else Cause_ExcCode_bits <= 4'bxxxx;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+41
@@ -0,0 +1,41 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Compare.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 15-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Compares two 32-bit values and outputs the following information about them:
|
||||
* EQ : A and B are equal
|
||||
* GZ : A is greater than zero
|
||||
* LZ : A is less than zero
|
||||
* GEZ : A is greater than or equal to zero
|
||||
* LEZ : A is less than or equal to zero
|
||||
*/
|
||||
module Compare(
|
||||
input [31:0] A,
|
||||
input [31:0] B,
|
||||
output EQ,
|
||||
output GZ,
|
||||
output LZ,
|
||||
output GEZ,
|
||||
output LEZ
|
||||
);
|
||||
|
||||
wire ZeroA = (A == 32'b0);
|
||||
|
||||
assign EQ = ( A == B);
|
||||
assign GZ = (~A[31] & ~ZeroA);
|
||||
assign LZ = A[31];
|
||||
assign GEZ = ~A[31];
|
||||
assign LEZ = ( A[31] | ZeroA);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+509
@@ -0,0 +1,509 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Control.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Datapath Controller. This module sets the datapath control
|
||||
* bits for an incoming instruction. These control bits follow the
|
||||
* instruction through each pipeline stage as needed, and constitute
|
||||
* the effective operation of the processor through each pipeline stage.
|
||||
*/
|
||||
module Control(
|
||||
input ID_Stall,
|
||||
input [5:0] OpCode,
|
||||
input [5:0] Funct,
|
||||
input [4:0] Rs, // used to differentiate mfc0 and mtc0
|
||||
input [4:0] Rt, // used to differentiate bgez,bgezal,bltz,bltzal,teqi,tgei,tgeiu,tlti,tltiu,tnei
|
||||
input Cmp_EQ,
|
||||
input Cmp_GZ,
|
||||
input Cmp_GEZ,
|
||||
input Cmp_LZ,
|
||||
input Cmp_LEZ,
|
||||
//------------
|
||||
output IF_Flush,
|
||||
output reg [7:0] DP_Hazards,
|
||||
output [1:0] PCSrc,
|
||||
output SignExtend,
|
||||
output Link,
|
||||
output Movn,
|
||||
output Movz,
|
||||
output Mfc0,
|
||||
output Mtc0,
|
||||
output CP1,
|
||||
output CP2,
|
||||
output CP3,
|
||||
output Eret,
|
||||
output Trap,
|
||||
output TrapCond,
|
||||
output EXC_Sys,
|
||||
output EXC_Bp,
|
||||
output EXC_RI,
|
||||
output ID_CanErr,
|
||||
output EX_CanErr,
|
||||
output M_CanErr,
|
||||
output NextIsDelay,
|
||||
output RegDst,
|
||||
output ALUSrcImm,
|
||||
output reg [4:0] ALUOp,
|
||||
output LLSC,
|
||||
output MemWrite,
|
||||
output MemRead,
|
||||
output MemByte,
|
||||
output MemHalf,
|
||||
output MemSignExtend,
|
||||
output Left,
|
||||
output Right,
|
||||
output RegWrite,
|
||||
output MemtoReg
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
wire Movc;
|
||||
wire Branch, Branch_EQ, Branch_GTZ, Branch_LEZ, Branch_NEQ, Branch_GEZ, Branch_LTZ;
|
||||
wire Unaligned_Mem;
|
||||
|
||||
reg [15:0] Datapath;
|
||||
assign PCSrc[0] = Datapath[14];
|
||||
assign Link = Datapath[13];
|
||||
assign ALUSrcImm = Datapath[12];
|
||||
assign Movc = Datapath[11];
|
||||
assign Trap = Datapath[10];
|
||||
assign TrapCond = Datapath[9];
|
||||
assign RegDst = Datapath[8];
|
||||
assign LLSC = Datapath[7];
|
||||
assign MemRead = Datapath[6];
|
||||
assign MemWrite = Datapath[5];
|
||||
assign MemHalf = Datapath[4];
|
||||
assign MemByte = Datapath[3];
|
||||
assign MemSignExtend = Datapath[2];
|
||||
assign RegWrite = Datapath[1];
|
||||
assign MemtoReg = Datapath[0];
|
||||
|
||||
reg [2:0] DP_Exceptions;
|
||||
assign ID_CanErr = DP_Exceptions[2];
|
||||
assign EX_CanErr = DP_Exceptions[1];
|
||||
assign M_CanErr = DP_Exceptions[0];
|
||||
|
||||
// Set the main datapath control signals based on the Op Code
|
||||
always @(*) begin
|
||||
if (ID_Stall)
|
||||
Datapath <= DP_None;
|
||||
else begin
|
||||
case (OpCode)
|
||||
// R-Type
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : Datapath <= DP_Add;
|
||||
Funct_Addu : Datapath <= DP_Addu;
|
||||
Funct_And : Datapath <= DP_And;
|
||||
Funct_Break : Datapath <= DP_Break;
|
||||
Funct_Div : Datapath <= DP_Div;
|
||||
Funct_Divu : Datapath <= DP_Divu;
|
||||
Funct_Jalr : Datapath <= DP_Jalr;
|
||||
Funct_Jr : Datapath <= DP_Jr;
|
||||
Funct_Mfhi : Datapath <= DP_Mfhi;
|
||||
Funct_Mflo : Datapath <= DP_Mflo;
|
||||
Funct_Movn : Datapath <= DP_Movn;
|
||||
Funct_Movz : Datapath <= DP_Movz;
|
||||
Funct_Mthi : Datapath <= DP_Mthi;
|
||||
Funct_Mtlo : Datapath <= DP_Mtlo;
|
||||
Funct_Mult : Datapath <= DP_Mult;
|
||||
Funct_Multu : Datapath <= DP_Multu;
|
||||
Funct_Nor : Datapath <= DP_Nor;
|
||||
Funct_Or : Datapath <= DP_Or;
|
||||
Funct_Sll : Datapath <= DP_Sll;
|
||||
Funct_Sllv : Datapath <= DP_Sllv;
|
||||
Funct_Slt : Datapath <= DP_Slt;
|
||||
Funct_Sltu : Datapath <= DP_Sltu;
|
||||
Funct_Sra : Datapath <= DP_Sra;
|
||||
Funct_Srav : Datapath <= DP_Srav;
|
||||
Funct_Srl : Datapath <= DP_Srl;
|
||||
Funct_Srlv : Datapath <= DP_Srlv;
|
||||
Funct_Sub : Datapath <= DP_Sub;
|
||||
Funct_Subu : Datapath <= DP_Subu;
|
||||
Funct_Syscall : Datapath <= DP_Syscall;
|
||||
Funct_Teq : Datapath <= DP_Teq;
|
||||
Funct_Tge : Datapath <= DP_Tge;
|
||||
Funct_Tgeu : Datapath <= DP_Tgeu;
|
||||
Funct_Tlt : Datapath <= DP_Tlt;
|
||||
Funct_Tltu : Datapath <= DP_Tltu;
|
||||
Funct_Tne : Datapath <= DP_Tne;
|
||||
Funct_Xor : Datapath <= DP_Xor;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// R2-Type
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : Datapath <= DP_Clo;
|
||||
Funct_Clz : Datapath <= DP_Clz;
|
||||
Funct_Madd : Datapath <= DP_Madd;
|
||||
Funct_Maddu : Datapath <= DP_Maddu;
|
||||
Funct_Msub : Datapath <= DP_Msub;
|
||||
Funct_Msubu : Datapath <= DP_Msubu;
|
||||
Funct_Mul : Datapath <= DP_Mul;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// I-Type
|
||||
Op_Addi : Datapath <= DP_Addi;
|
||||
Op_Addiu : Datapath <= DP_Addiu;
|
||||
Op_Andi : Datapath <= DP_Andi;
|
||||
Op_Ori : Datapath <= DP_Ori;
|
||||
Op_Pref : Datapath <= DP_Pref;
|
||||
Op_Slti : Datapath <= DP_Slti;
|
||||
Op_Sltiu : Datapath <= DP_Sltiu;
|
||||
Op_Xori : Datapath <= DP_Xori;
|
||||
// Jumps (using immediates)
|
||||
Op_J : Datapath <= DP_J;
|
||||
Op_Jal : Datapath <= DP_Jal;
|
||||
// Branches and Traps
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Bgez : Datapath <= DP_Bgez;
|
||||
OpRt_Bgezal : Datapath <= DP_Bgezal;
|
||||
OpRt_Bltz : Datapath <= DP_Bltz;
|
||||
OpRt_Bltzal : Datapath <= DP_Bltzal;
|
||||
OpRt_Teqi : Datapath <= DP_Teqi;
|
||||
OpRt_Tgei : Datapath <= DP_Tgei;
|
||||
OpRt_Tgeiu : Datapath <= DP_Tgeiu;
|
||||
OpRt_Tlti : Datapath <= DP_Tlti;
|
||||
OpRt_Tltiu : Datapath <= DP_Tltiu;
|
||||
OpRt_Tnei : Datapath <= DP_Tnei;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
Op_Beq : Datapath <= DP_Beq;
|
||||
Op_Bgtz : Datapath <= DP_Bgtz;
|
||||
Op_Blez : Datapath <= DP_Blez;
|
||||
Op_Bne : Datapath <= DP_Bne;
|
||||
// Coprocessor 0
|
||||
Op_Type_CP0 :
|
||||
begin
|
||||
case (Rs)
|
||||
OpRs_MF : Datapath <= DP_Mfc0;
|
||||
OpRs_MT : Datapath <= DP_Mtc0;
|
||||
OpRs_ERET : Datapath <= (Funct == Funct_ERET) ? DP_Eret : DP_None;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
// Memory
|
||||
Op_Lb : Datapath <= DP_Lb;
|
||||
Op_Lbu : Datapath <= DP_Lbu;
|
||||
Op_Lh : Datapath <= DP_Lh;
|
||||
Op_Lhu : Datapath <= DP_Lhu;
|
||||
Op_Ll : Datapath <= DP_Ll;
|
||||
Op_Lui : Datapath <= DP_Lui;
|
||||
Op_Lw : Datapath <= DP_Lw;
|
||||
Op_Lwl : Datapath <= DP_Lwl;
|
||||
Op_Lwr : Datapath <= DP_Lwr;
|
||||
Op_Sb : Datapath <= DP_Sb;
|
||||
Op_Sc : Datapath <= DP_Sc;
|
||||
Op_Sh : Datapath <= DP_Sh;
|
||||
Op_Sw : Datapath <= DP_Sw;
|
||||
Op_Swl : Datapath <= DP_Swl;
|
||||
Op_Swr : Datapath <= DP_Swr;
|
||||
default : Datapath <= DP_None;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// Set the Hazard Control Signals and Exception Indicators based on the Op Code
|
||||
always @(*) begin
|
||||
case (OpCode)
|
||||
// R-Type
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : begin DP_Hazards <= HAZ_Add; DP_Exceptions <= EXC_Add; end
|
||||
Funct_Addu : begin DP_Hazards <= HAZ_Addu; DP_Exceptions <= EXC_Addu; end
|
||||
Funct_And : begin DP_Hazards <= HAZ_And; DP_Exceptions <= EXC_And; end
|
||||
Funct_Break : begin DP_Hazards <= HAZ_Break; DP_Exceptions <= EXC_Break; end
|
||||
Funct_Div : begin DP_Hazards <= HAZ_Div; DP_Exceptions <= EXC_Div; end
|
||||
Funct_Divu : begin DP_Hazards <= HAZ_Divu; DP_Exceptions <= EXC_Divu; end
|
||||
Funct_Jalr : begin DP_Hazards <= HAZ_Jalr; DP_Exceptions <= EXC_Jalr; end
|
||||
Funct_Jr : begin DP_Hazards <= HAZ_Jr; DP_Exceptions <= EXC_Jr; end
|
||||
Funct_Mfhi : begin DP_Hazards <= HAZ_Mfhi; DP_Exceptions <= EXC_Mfhi; end
|
||||
Funct_Mflo : begin DP_Hazards <= HAZ_Mflo; DP_Exceptions <= EXC_Mflo; end
|
||||
Funct_Movn : begin DP_Hazards <= HAZ_Movn; DP_Exceptions <= EXC_Movn; end
|
||||
Funct_Movz : begin DP_Hazards <= HAZ_Movz; DP_Exceptions <= EXC_Movz; end
|
||||
Funct_Mthi : begin DP_Hazards <= HAZ_Mthi; DP_Exceptions <= EXC_Mthi; end
|
||||
Funct_Mtlo : begin DP_Hazards <= HAZ_Mtlo; DP_Exceptions <= EXC_Mtlo; end
|
||||
Funct_Mult : begin DP_Hazards <= HAZ_Mult; DP_Exceptions <= EXC_Mult; end
|
||||
Funct_Multu : begin DP_Hazards <= HAZ_Multu; DP_Exceptions <= EXC_Multu; end
|
||||
Funct_Nor : begin DP_Hazards <= HAZ_Nor; DP_Exceptions <= EXC_Nor; end
|
||||
Funct_Or : begin DP_Hazards <= HAZ_Or; DP_Exceptions <= EXC_Or; end
|
||||
Funct_Sll : begin DP_Hazards <= HAZ_Sll; DP_Exceptions <= EXC_Sll; end
|
||||
Funct_Sllv : begin DP_Hazards <= HAZ_Sllv; DP_Exceptions <= EXC_Sllv; end
|
||||
Funct_Slt : begin DP_Hazards <= HAZ_Slt; DP_Exceptions <= EXC_Slt; end
|
||||
Funct_Sltu : begin DP_Hazards <= HAZ_Sltu; DP_Exceptions <= EXC_Sltu; end
|
||||
Funct_Sra : begin DP_Hazards <= HAZ_Sra; DP_Exceptions <= EXC_Sra; end
|
||||
Funct_Srav : begin DP_Hazards <= HAZ_Srav; DP_Exceptions <= EXC_Srav; end
|
||||
Funct_Srl : begin DP_Hazards <= HAZ_Srl; DP_Exceptions <= EXC_Srl; end
|
||||
Funct_Srlv : begin DP_Hazards <= HAZ_Srlv; DP_Exceptions <= EXC_Srlv; end
|
||||
Funct_Sub : begin DP_Hazards <= HAZ_Sub; DP_Exceptions <= EXC_Sub; end
|
||||
Funct_Subu : begin DP_Hazards <= HAZ_Subu; DP_Exceptions <= EXC_Subu; end
|
||||
Funct_Syscall : begin DP_Hazards <= HAZ_Syscall; DP_Exceptions <= EXC_Syscall; end
|
||||
Funct_Teq : begin DP_Hazards <= HAZ_Teq; DP_Exceptions <= EXC_Teq; end
|
||||
Funct_Tge : begin DP_Hazards <= HAZ_Tge; DP_Exceptions <= EXC_Tge; end
|
||||
Funct_Tgeu : begin DP_Hazards <= HAZ_Tgeu; DP_Exceptions <= EXC_Tgeu; end
|
||||
Funct_Tlt : begin DP_Hazards <= HAZ_Tlt; DP_Exceptions <= EXC_Tlt; end
|
||||
Funct_Tltu : begin DP_Hazards <= HAZ_Tltu; DP_Exceptions <= EXC_Tltu; end
|
||||
Funct_Tne : begin DP_Hazards <= HAZ_Tne; DP_Exceptions <= EXC_Tne; end
|
||||
Funct_Xor : begin DP_Hazards <= HAZ_Xor; DP_Exceptions <= EXC_Xor; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// R2-Type
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : begin DP_Hazards <= HAZ_Clo; DP_Exceptions <= EXC_Clo; end
|
||||
Funct_Clz : begin DP_Hazards <= HAZ_Clz; DP_Exceptions <= EXC_Clz; end
|
||||
Funct_Madd : begin DP_Hazards <= HAZ_Madd; DP_Exceptions <= EXC_Madd; end
|
||||
Funct_Maddu : begin DP_Hazards <= HAZ_Maddu; DP_Exceptions <= EXC_Maddu; end
|
||||
Funct_Msub : begin DP_Hazards <= HAZ_Msub; DP_Exceptions <= EXC_Msub; end
|
||||
Funct_Msubu : begin DP_Hazards <= HAZ_Msubu; DP_Exceptions <= EXC_Msubu; end
|
||||
Funct_Mul : begin DP_Hazards <= HAZ_Mul; DP_Exceptions <= EXC_Mul; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// I-Type
|
||||
Op_Addi : begin DP_Hazards <= HAZ_Addi; DP_Exceptions <= EXC_Addi; end
|
||||
Op_Addiu : begin DP_Hazards <= HAZ_Addiu; DP_Exceptions <= EXC_Addiu; end
|
||||
Op_Andi : begin DP_Hazards <= HAZ_Andi; DP_Exceptions <= EXC_Andi; end
|
||||
Op_Ori : begin DP_Hazards <= HAZ_Ori; DP_Exceptions <= EXC_Ori; end
|
||||
Op_Pref : begin DP_Hazards <= HAZ_Pref; DP_Exceptions <= EXC_Pref; end
|
||||
Op_Slti : begin DP_Hazards <= HAZ_Slti; DP_Exceptions <= EXC_Slti; end
|
||||
Op_Sltiu : begin DP_Hazards <= HAZ_Sltiu; DP_Exceptions <= EXC_Sltiu; end
|
||||
Op_Xori : begin DP_Hazards <= HAZ_Xori; DP_Exceptions <= EXC_Xori; end
|
||||
// Jumps
|
||||
Op_J : begin DP_Hazards <= HAZ_J; DP_Exceptions <= EXC_J; end
|
||||
Op_Jal : begin DP_Hazards <= HAZ_Jal; DP_Exceptions <= EXC_Jal; end
|
||||
// Branches and Traps
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Bgez : begin DP_Hazards <= HAZ_Bgez; DP_Exceptions <= EXC_Bgez; end
|
||||
OpRt_Bgezal : begin DP_Hazards <= HAZ_Bgezal; DP_Exceptions <= EXC_Bgezal; end
|
||||
OpRt_Bltz : begin DP_Hazards <= HAZ_Bltz; DP_Exceptions <= EXC_Bltz; end
|
||||
OpRt_Bltzal : begin DP_Hazards <= HAZ_Bltzal; DP_Exceptions <= EXC_Bltzal; end
|
||||
OpRt_Teqi : begin DP_Hazards <= HAZ_Teqi; DP_Exceptions <= EXC_Teqi; end
|
||||
OpRt_Tgei : begin DP_Hazards <= HAZ_Tgei; DP_Exceptions <= EXC_Tgei; end
|
||||
OpRt_Tgeiu : begin DP_Hazards <= HAZ_Tgeiu; DP_Exceptions <= EXC_Tgeiu; end
|
||||
OpRt_Tlti : begin DP_Hazards <= HAZ_Tlti; DP_Exceptions <= EXC_Tlti; end
|
||||
OpRt_Tltiu : begin DP_Hazards <= HAZ_Tltiu; DP_Exceptions <= EXC_Tltiu; end
|
||||
OpRt_Tnei : begin DP_Hazards <= HAZ_Tnei; DP_Exceptions <= EXC_Tnei; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
Op_Beq : begin DP_Hazards <= HAZ_Beq; DP_Exceptions <= EXC_Beq; end
|
||||
Op_Bgtz : begin DP_Hazards <= HAZ_Bgtz; DP_Exceptions <= EXC_Bgtz; end
|
||||
Op_Blez : begin DP_Hazards <= HAZ_Blez; DP_Exceptions <= EXC_Blez; end
|
||||
Op_Bne : begin DP_Hazards <= HAZ_Bne; DP_Exceptions <= EXC_Bne; end
|
||||
// Coprocessor 0
|
||||
Op_Type_CP0 :
|
||||
begin
|
||||
case (Rs)
|
||||
OpRs_MF : begin DP_Hazards <= HAZ_Mfc0; DP_Exceptions <= EXC_Mfc0; end
|
||||
OpRs_MT : begin DP_Hazards <= HAZ_Mtc0; DP_Exceptions <= EXC_Mtc0; end
|
||||
OpRs_ERET : begin DP_Hazards <= (Funct == Funct_ERET) ? DP_Eret : 8'hxx; DP_Exceptions <= EXC_Eret; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
// Memory
|
||||
Op_Lb : begin DP_Hazards <= HAZ_Lb; DP_Exceptions <= EXC_Lb; end
|
||||
Op_Lbu : begin DP_Hazards <= HAZ_Lbu; DP_Exceptions <= EXC_Lbu; end
|
||||
Op_Lh : begin DP_Hazards <= HAZ_Lh; DP_Exceptions <= EXC_Lh; end
|
||||
Op_Lhu : begin DP_Hazards <= HAZ_Lhu; DP_Exceptions <= EXC_Lhu; end
|
||||
Op_Ll : begin DP_Hazards <= HAZ_Ll; DP_Exceptions <= EXC_Ll; end
|
||||
Op_Lui : begin DP_Hazards <= HAZ_Lui; DP_Exceptions <= EXC_Lui; end
|
||||
Op_Lw : begin DP_Hazards <= HAZ_Lw; DP_Exceptions <= EXC_Lw; end
|
||||
Op_Lwl : begin DP_Hazards <= HAZ_Lwl; DP_Exceptions <= EXC_Lwl; end
|
||||
Op_Lwr : begin DP_Hazards <= HAZ_Lwr; DP_Exceptions <= EXC_Lwr; end
|
||||
Op_Sb : begin DP_Hazards <= HAZ_Sb; DP_Exceptions <= EXC_Sb; end
|
||||
Op_Sc : begin DP_Hazards <= HAZ_Sc; DP_Exceptions <= EXC_Sc; end
|
||||
Op_Sh : begin DP_Hazards <= HAZ_Sh; DP_Exceptions <= EXC_Sh; end
|
||||
Op_Sw : begin DP_Hazards <= HAZ_Sw; DP_Exceptions <= EXC_Sw; end
|
||||
Op_Swl : begin DP_Hazards <= HAZ_Swl; DP_Exceptions <= EXC_Swl; end
|
||||
Op_Swr : begin DP_Hazards <= HAZ_Swr; DP_Exceptions <= EXC_Swr; end
|
||||
default : begin DP_Hazards <= 8'hxx; DP_Exceptions <= 3'bxxx; end
|
||||
endcase
|
||||
end
|
||||
|
||||
// ALU Assignment
|
||||
always @(*) begin
|
||||
if (ID_Stall)
|
||||
ALUOp <= AluOp_Addu; // Any Op that doesn't write HILO or cause exceptions
|
||||
else begin
|
||||
case (OpCode)
|
||||
Op_Type_R :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Add : ALUOp <= AluOp_Add;
|
||||
Funct_Addu : ALUOp <= AluOp_Addu;
|
||||
Funct_And : ALUOp <= AluOp_And;
|
||||
Funct_Div : ALUOp <= AluOp_Div;
|
||||
Funct_Divu : ALUOp <= AluOp_Divu;
|
||||
Funct_Jalr : ALUOp <= AluOp_Addu;
|
||||
Funct_Mfhi : ALUOp <= AluOp_Mfhi;
|
||||
Funct_Mflo : ALUOp <= AluOp_Mflo;
|
||||
Funct_Movn : ALUOp <= AluOp_Addu;
|
||||
Funct_Movz : ALUOp <= AluOp_Addu;
|
||||
Funct_Mthi : ALUOp <= AluOp_Mthi;
|
||||
Funct_Mtlo : ALUOp <= AluOp_Mtlo;
|
||||
Funct_Mult : ALUOp <= AluOp_Mult;
|
||||
Funct_Multu : ALUOp <= AluOp_Multu;
|
||||
Funct_Nor : ALUOp <= AluOp_Nor;
|
||||
Funct_Or : ALUOp <= AluOp_Or;
|
||||
Funct_Sll : ALUOp <= AluOp_Sll;
|
||||
Funct_Sllv : ALUOp <= AluOp_Sllv;
|
||||
Funct_Slt : ALUOp <= AluOp_Slt;
|
||||
Funct_Sltu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Sra : ALUOp <= AluOp_Sra;
|
||||
Funct_Srav : ALUOp <= AluOp_Srav;
|
||||
Funct_Srl : ALUOp <= AluOp_Srl;
|
||||
Funct_Srlv : ALUOp <= AluOp_Srlv;
|
||||
Funct_Sub : ALUOp <= AluOp_Sub;
|
||||
Funct_Subu : ALUOp <= AluOp_Subu;
|
||||
Funct_Syscall : ALUOp <= AluOp_Addu;
|
||||
Funct_Teq : ALUOp <= AluOp_Subu;
|
||||
Funct_Tge : ALUOp <= AluOp_Slt;
|
||||
Funct_Tgeu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Tlt : ALUOp <= AluOp_Slt;
|
||||
Funct_Tltu : ALUOp <= AluOp_Sltu;
|
||||
Funct_Tne : ALUOp <= AluOp_Subu;
|
||||
Funct_Xor : ALUOp <= AluOp_Xor;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
Op_Type_R2 :
|
||||
begin
|
||||
case (Funct)
|
||||
Funct_Clo : ALUOp <= AluOp_Clo;
|
||||
Funct_Clz : ALUOp <= AluOp_Clz;
|
||||
Funct_Madd : ALUOp <= AluOp_Madd;
|
||||
Funct_Maddu : ALUOp <= AluOp_Maddu;
|
||||
Funct_Msub : ALUOp <= AluOp_Msub;
|
||||
Funct_Msubu : ALUOp <= AluOp_Msubu;
|
||||
Funct_Mul : ALUOp <= AluOp_Mul;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
Op_Type_BI :
|
||||
begin
|
||||
case (Rt)
|
||||
OpRt_Teqi : ALUOp <= AluOp_Subu;
|
||||
OpRt_Tgei : ALUOp <= AluOp_Slt;
|
||||
OpRt_Tgeiu : ALUOp <= AluOp_Sltu;
|
||||
OpRt_Tlti : ALUOp <= AluOp_Slt;
|
||||
OpRt_Tltiu : ALUOp <= AluOp_Sltu;
|
||||
OpRt_Tnei : ALUOp <= AluOp_Subu;
|
||||
default : ALUOp <= AluOp_Addu; // Branches don't matter.
|
||||
endcase
|
||||
end
|
||||
Op_Type_CP0 : ALUOp <= AluOp_Addu;
|
||||
Op_Addi : ALUOp <= AluOp_Add;
|
||||
Op_Addiu : ALUOp <= AluOp_Addu;
|
||||
Op_Andi : ALUOp <= AluOp_And;
|
||||
Op_Jal : ALUOp <= AluOp_Addu;
|
||||
Op_Lb : ALUOp <= AluOp_Addu;
|
||||
Op_Lbu : ALUOp <= AluOp_Addu;
|
||||
Op_Lh : ALUOp <= AluOp_Addu;
|
||||
Op_Lhu : ALUOp <= AluOp_Addu;
|
||||
Op_Ll : ALUOp <= AluOp_Addu;
|
||||
Op_Lui : ALUOp <= AluOp_Sllc;
|
||||
Op_Lw : ALUOp <= AluOp_Addu;
|
||||
Op_Lwl : ALUOp <= AluOp_Addu;
|
||||
Op_Lwr : ALUOp <= AluOp_Addu;
|
||||
Op_Ori : ALUOp <= AluOp_Or;
|
||||
Op_Sb : ALUOp <= AluOp_Addu;
|
||||
Op_Sc : ALUOp <= AluOp_Addu; // XXX Needs HW implement
|
||||
Op_Sh : ALUOp <= AluOp_Addu;
|
||||
Op_Slti : ALUOp <= AluOp_Slt;
|
||||
Op_Sltiu : ALUOp <= AluOp_Sltu;
|
||||
Op_Sw : ALUOp <= AluOp_Addu;
|
||||
Op_Swl : ALUOp <= AluOp_Addu;
|
||||
Op_Swr : ALUOp <= AluOp_Addu;
|
||||
Op_Xori : ALUOp <= AluOp_Xor;
|
||||
default : ALUOp <= AluOp_Addu;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
/***
|
||||
These remaining options cover portions of the datapath that are not
|
||||
controlled directly by the datapath bits. Note that some refer to bits of
|
||||
the opcode or other fields, which breaks the otherwise fully-abstracted view
|
||||
of instruction encodings. Make sure when adding custom instructions that
|
||||
no false positives/negatives are generated here.
|
||||
***/
|
||||
|
||||
// Branch Detection: Options are mutually exclusive.
|
||||
assign Branch_EQ = OpCode[2] & ~OpCode[1] & ~OpCode[0] & Cmp_EQ;
|
||||
assign Branch_GTZ = OpCode[2] & OpCode[1] & OpCode[0] & Cmp_GZ;
|
||||
assign Branch_LEZ = OpCode[2] & OpCode[1] & ~OpCode[0] & Cmp_LEZ;
|
||||
assign Branch_NEQ = OpCode[2] & ~OpCode[1] & OpCode[0] & ~Cmp_EQ;
|
||||
assign Branch_GEZ = ~OpCode[2] & Rt[0] & Cmp_GEZ;
|
||||
assign Branch_LTZ = ~OpCode[2] & ~Rt[0] & Cmp_LZ;
|
||||
|
||||
assign Branch = Branch_EQ | Branch_GTZ | Branch_LEZ | Branch_NEQ | Branch_GEZ | Branch_LTZ;
|
||||
assign PCSrc[1] = (Datapath[15] & ~Datapath[14]) ? Branch : Datapath[15];
|
||||
|
||||
/* In MIPS32, all Branch and Jump operations execute the Branch Delay Slot,
|
||||
* or next instruction, regardless if the branch is taken or not. The exception
|
||||
* is the "Branch Likely" instruction group. These are deprecated, however, and not
|
||||
* implemented here. "IF_Flush" is defined to allow for the cancelation of a
|
||||
* Branch Delay Slot should these be implemented later.
|
||||
*/
|
||||
assign IF_Flush = 0;
|
||||
|
||||
// Indicator that next instruction is a Branch Delay Slot.
|
||||
assign NextIsDelay = Datapath[15] | Datapath[14];
|
||||
|
||||
// Sign- or Zero-Extension Control. The only ops that require zero-extension are
|
||||
// Andi, Ori, and Xori. The following also zero-extends 'lui', however it does not alter the effect of lui.
|
||||
assign SignExtend = (OpCode[5:2] != 4'b0011);
|
||||
|
||||
// Move Conditional
|
||||
assign Movn = Movc & Funct[0];
|
||||
assign Movz = Movc & ~Funct[0];
|
||||
|
||||
// Coprocessor 0 (Mfc0, Mtc0) control signals.
|
||||
assign Mfc0 = ((OpCode == Op_Type_CP0) && (Rs == OpRs_MF));
|
||||
assign Mtc0 = ((OpCode == Op_Type_CP0) && (Rs == OpRs_MT));
|
||||
assign Eret = ((OpCode == Op_Type_CP0) && (Rs == OpRs_ERET) && (Funct == Funct_ERET));
|
||||
|
||||
// Coprocessor 1,2,3 accesses (not implemented)
|
||||
assign CP1 = (OpCode == Op_Type_CP1);
|
||||
assign CP2 = (OpCode == Op_Type_CP2);
|
||||
assign CP3 = (OpCode == Op_Type_CP3);
|
||||
|
||||
// Exceptions found in ID
|
||||
assign EXC_Sys = ((OpCode == Op_Type_R) && (Funct == Funct_Syscall));
|
||||
assign EXC_Bp = ((OpCode == Op_Type_R) && (Funct == Funct_Break));
|
||||
|
||||
// Unaligned Memory Accesses (lwl, lwr, swl, swr)
|
||||
assign Unaligned_Mem = OpCode[5] & ~OpCode[4] & OpCode[1] & ~OpCode[0];
|
||||
assign Left = Unaligned_Mem & ~OpCode[2];
|
||||
assign Right = Unaligned_Mem & OpCode[2];
|
||||
|
||||
// TODO: Reserved Instruction Exception must still be implemented
|
||||
assign EXC_RI = 0;
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+100
@@ -0,0 +1,100 @@
|
||||
`timescale 1ns / 1ns
|
||||
/*
|
||||
* File : Divide.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Neil Russell
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 6-Nov-2012 NJR Initial design.
|
||||
*
|
||||
* Description:
|
||||
* A multi-cycle 32-bit divider.
|
||||
*
|
||||
* On any cycle that one of OP_div or OP_divu are true, the Dividend and
|
||||
* Divisor will be captured and a multi-cycle divide operation initiated.
|
||||
* Stall will go true on the next cycle and the first cycle of the divide
|
||||
* operation completed. After some time (about 32 cycles), Stall will go
|
||||
* false on the same cycle that the result becomes valid. OP_div or OP_divu
|
||||
* will abort any currently running divide operation and initiate a new one.
|
||||
*/
|
||||
module Divide(
|
||||
input clock,
|
||||
input reset,
|
||||
input OP_div, // True to initiate a signed divide
|
||||
input OP_divu, // True to initiate an unsigned divide
|
||||
input [31:0] Dividend,
|
||||
input [31:0] Divisor,
|
||||
output [31:0] Quotient,
|
||||
output [31:0] Remainder,
|
||||
output Stall // True while calculating
|
||||
);
|
||||
|
||||
|
||||
reg active; // True if the divider is running
|
||||
reg neg; // True if the result will be negative
|
||||
reg [4:0] cycle; // Number of cycles to go
|
||||
|
||||
reg [31:0] result; // Begin with dividend, end with quotient
|
||||
reg [31:0] denom; // Divisor
|
||||
reg [31:0] work; // Running remainder
|
||||
|
||||
// Calculate the current digit
|
||||
wire [32:0] sub = { work[30:0], result[31] } - denom;
|
||||
|
||||
// Send the results to our master
|
||||
assign Quotient = !neg ? result : -result;
|
||||
assign Remainder = work;
|
||||
assign Stall = active;
|
||||
|
||||
// The state machine
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
active <= 0;
|
||||
neg <= 0;
|
||||
cycle <= 0;
|
||||
result <= 0;
|
||||
denom <= 0;
|
||||
work <= 0;
|
||||
end
|
||||
else begin
|
||||
if (OP_div) begin
|
||||
// Set up for a signed divide. Remember the resulting sign,
|
||||
// and make the operands positive.
|
||||
cycle <= 5'd31;
|
||||
result <= (Dividend[31] == 0) ? Dividend : -Dividend;
|
||||
denom <= (Divisor[31] == 0) ? Divisor : -Divisor;
|
||||
work <= 32'b0;
|
||||
neg <= Dividend[31] ^ Divisor[31];
|
||||
active <= 1;
|
||||
end
|
||||
else if (OP_divu) begin
|
||||
// Set up for an unsigned divide.
|
||||
cycle <= 5'd31;
|
||||
result <= Dividend;
|
||||
denom <= Divisor;
|
||||
work <= 32'b0;
|
||||
neg <= 0;
|
||||
active <= 1;
|
||||
end
|
||||
else if (active) begin
|
||||
// Run an iteration of the divide.
|
||||
if (sub[32] == 0) begin
|
||||
work <= sub[31:0];
|
||||
result <= {result[30:0], 1'b1};
|
||||
end
|
||||
else begin
|
||||
work <= {work[30:0], result[31]};
|
||||
result <= {result[30:0], 1'b0};
|
||||
end
|
||||
|
||||
if (cycle == 0) begin
|
||||
active <= 0;
|
||||
end
|
||||
|
||||
cycle <= cycle - 5'd1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : EXMEM_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Execute and Memory stages.
|
||||
*/
|
||||
module EXMEM_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input EX_Flush,
|
||||
input EX_Stall,
|
||||
input M_Stall,
|
||||
// Control Signals
|
||||
input EX_Movn,
|
||||
input EX_Movz,
|
||||
input EX_BZero,
|
||||
input EX_RegWrite, // Future Control to WB
|
||||
input EX_MemtoReg, // Future Control to WB
|
||||
input EX_ReverseEndian,
|
||||
input EX_LLSC,
|
||||
input EX_MemRead,
|
||||
input EX_MemWrite,
|
||||
input EX_MemByte,
|
||||
input EX_MemHalf,
|
||||
input EX_MemSignExtend,
|
||||
input EX_Left,
|
||||
input EX_Right,
|
||||
// Exception Control/Info
|
||||
input EX_KernelMode,
|
||||
input [31:0] EX_RestartPC,
|
||||
input EX_IsBDS,
|
||||
input EX_Trap,
|
||||
input EX_TrapCond,
|
||||
input EX_M_CanErr,
|
||||
// Data Signals
|
||||
input [31:0] EX_ALU_Result,
|
||||
input [31:0] EX_ReadData2,
|
||||
input [4:0] EX_RtRd,
|
||||
// ------------------
|
||||
output reg M_RegWrite,
|
||||
output reg M_MemtoReg,
|
||||
output reg M_ReverseEndian,
|
||||
output reg M_LLSC,
|
||||
output reg M_MemRead,
|
||||
output reg M_MemWrite,
|
||||
output reg M_MemByte,
|
||||
output reg M_MemHalf,
|
||||
output reg M_MemSignExtend,
|
||||
output reg M_Left,
|
||||
output reg M_Right,
|
||||
output reg M_KernelMode,
|
||||
output reg [31:0] M_RestartPC,
|
||||
output reg M_IsBDS,
|
||||
output reg M_Trap,
|
||||
output reg M_TrapCond,
|
||||
output reg M_M_CanErr,
|
||||
output reg [31:0] M_ALU_Result,
|
||||
output reg [31:0] M_ReadData2,
|
||||
output reg [4:0] M_RtRd
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
// Mask of RegWrite if a Move Conditional failed.
|
||||
wire MovcRegWrite = (EX_Movn & ~EX_BZero) | (EX_Movz & EX_BZero);
|
||||
|
||||
always @(posedge clock) begin
|
||||
M_RegWrite <= (reset) ? 0 : ((M_Stall) ? M_RegWrite : ((EX_Stall | EX_Flush) ? 0 : EX_RegWrite));
|
||||
M_RegWrite <= (reset) ? 0 : ((M_Stall) ? M_RegWrite : ((EX_Stall | EX_Flush) ? 0 : ((EX_Movn | EX_Movz) ? MovcRegWrite : EX_RegWrite)));
|
||||
M_MemtoReg <= (reset) ? 0 : ((M_Stall) ? M_MemtoReg : EX_MemtoReg);
|
||||
M_ReverseEndian <= (reset) ? 0 : ((M_Stall) ? M_ReverseEndian : EX_ReverseEndian);
|
||||
M_LLSC <= (reset) ? 0 : ((M_Stall) ? M_LLSC : EX_LLSC);
|
||||
M_MemRead <= (reset) ? 0 : ((M_Stall) ? M_MemRead : ((EX_Stall | EX_Flush) ? 0 : EX_MemRead));
|
||||
M_MemWrite <= (reset) ? 0 : ((M_Stall) ? M_MemWrite : ((EX_Stall | EX_Flush) ? 0 : EX_MemWrite));
|
||||
M_MemByte <= (reset) ? 0 : ((M_Stall) ? M_MemByte : EX_MemByte);
|
||||
M_MemHalf <= (reset) ? 0 : ((M_Stall) ? M_MemHalf : EX_MemHalf);
|
||||
M_MemSignExtend <= (reset) ? 0 : ((M_Stall) ? M_MemSignExtend : EX_MemSignExtend);
|
||||
M_Left <= (reset) ? 0 : ((M_Stall) ? M_Left : EX_Left);
|
||||
M_Right <= (reset) ? 0 : ((M_Stall) ? M_Right : EX_Right);
|
||||
M_KernelMode <= (reset) ? 0 : ((M_Stall) ? M_KernelMode : EX_KernelMode);
|
||||
M_RestartPC <= (reset) ? 32'b0 : ((M_Stall) ? M_RestartPC : EX_RestartPC);
|
||||
M_IsBDS <= (reset) ? 0 : ((M_Stall) ? M_IsBDS : EX_IsBDS);
|
||||
M_Trap <= (reset) ? 0 : ((M_Stall) ? M_Trap : ((EX_Stall | EX_Flush) ? 0 : EX_Trap));
|
||||
M_TrapCond <= (reset) ? 0 : ((M_Stall) ? M_TrapCond : EX_TrapCond);
|
||||
M_M_CanErr <= (reset) ? 0 : ((M_Stall) ? M_M_CanErr : ((EX_Stall | EX_Flush) ? 0 : EX_M_CanErr));
|
||||
M_ALU_Result <= (reset) ? 32'b0 : ((M_Stall) ? M_ALU_Result : EX_ALU_Result);
|
||||
M_ReadData2 <= (reset) ? 32'b0 : ((M_Stall) ? M_ReadData2 : EX_ReadData2);
|
||||
M_RtRd <= (reset) ? 5'b0 : ((M_Stall) ? M_RtRd : EX_RtRd);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Hazard_Detection.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 23-Jul-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
* 2.01 1-Nov-2012 GEA Fixed issue with Jal.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Hazard Detection and Forward Control. This is the glue that allows a
|
||||
* pipelined processor to operate efficiently and correctly in the presence
|
||||
* of data, structural, and control hazards. For each pipeline stage, it
|
||||
* detects whether that stage requires data that is still in the pipeline,
|
||||
* and whether that data may be forwarded or if the pipeline must be stalled.
|
||||
*
|
||||
* This module is heavily commented. Read below for more information.
|
||||
*/
|
||||
module Hazard_Detection(
|
||||
input [7:0] DP_Hazards,
|
||||
input [4:0] ID_Rs,
|
||||
input [4:0] ID_Rt,
|
||||
input [4:0] EX_Rs,
|
||||
input [4:0] EX_Rt,
|
||||
input [4:0] EX_RtRd,
|
||||
input [4:0] MEM_RtRd,
|
||||
input [4:0] WB_RtRd,
|
||||
input EX_Link,
|
||||
input EX_RegWrite,
|
||||
input MEM_RegWrite,
|
||||
input WB_RegWrite,
|
||||
input MEM_MemRead,
|
||||
input MEM_MemWrite, // Needed for Store Conditional which writes to a register
|
||||
input InstMem_Read,
|
||||
input InstMem_Ready,
|
||||
input Mfc0, // Using fwd mux; not part of haz/fwd.
|
||||
input IF_Exception_Stall,
|
||||
input ID_Exception_Stall,
|
||||
input EX_Exception_Stall,
|
||||
input EX_ALU_Stall,
|
||||
input M_Stall_Controller, // Determined by data memory controller
|
||||
output IF_Stall,
|
||||
output ID_Stall,
|
||||
output EX_Stall,
|
||||
output M_Stall,
|
||||
output WB_Stall,
|
||||
output [1:0] ID_RsFwdSel,
|
||||
output [1:0] ID_RtFwdSel,
|
||||
output [1:0] EX_RsFwdSel,
|
||||
output [1:0] EX_RtFwdSel,
|
||||
output M_WriteDataFwdSel
|
||||
);
|
||||
|
||||
/* Hazard and Forward Detection
|
||||
*
|
||||
* Most instructions read from one or more registers. Normally this occurs in
|
||||
* the ID stage. However, frequently the register file in the ID stage is stale
|
||||
* when one or more forward stages in the pipeline (EX, MEM, or WB) contains
|
||||
* an instruction which will eventually update it but has not yet done so.
|
||||
*
|
||||
* A hazard condition is created when a forward pipeline stage is set to write
|
||||
* the same register that a current pipeline stage (e.g. in ID) needs to read.
|
||||
* The solution is to stall the current stage (and effectively all stages behind
|
||||
* it) or bypass (forward) the data from forward stages. Fortunately forwarding
|
||||
* works for most combinations of instructions.
|
||||
*
|
||||
* Hazard and Forward conditions are handled based on two simple rules:
|
||||
* "Wants" and "Needs." If an instruction "wants" data in a certain pipeline
|
||||
* stage, and that data is available further along in the pipeline, it will
|
||||
* be forwarded. If it "needs" data and the data is not yet available for forwarding,
|
||||
* the pipeline stage stalls. If it does not want or need data in a certain
|
||||
* stage, forwarding is disabled and a stall will not occur. This is important
|
||||
* for instructions which insert custom data, such as jal or movz.
|
||||
*
|
||||
* Currently, "Want" and "Need" conditions are defined for both Rs data and Rt
|
||||
* data (the two read registers in MIPS), and these conditions exist in the
|
||||
* ID and EX pipeline stages. This is a total of eight condition bits.
|
||||
*
|
||||
* A unique exception exists with Store instructions, which don't need the
|
||||
* "Rt" data until the MEM stage. Because data doesn't change in WB, and WB
|
||||
* is the only stage following MEM, forwarding is *always* possible from
|
||||
* WB to Mem. This unit handles this situation, and a condition bit is not
|
||||
* needed.
|
||||
*
|
||||
* When data is needed from the MEM stage by a previous stage (ID or EX), the
|
||||
* decision to forward or stall is based on whether MEM is accessing memory
|
||||
* (stall) or not (forward). Normally store instructions don't write to registers
|
||||
* and thus are never needed for a data dependence, so the signal 'MEM_MemRead'
|
||||
* is sufficient to determine. Because of the Store Conditional instruction,
|
||||
* however, 'MEM_MemWrite' must also be considered because it writes to a register.
|
||||
*
|
||||
*/
|
||||
|
||||
wire WantRsByID, NeedRsByID, WantRtByID, NeedRtByID, WantRsByEX, NeedRsByEX, WantRtByEX, NeedRtByEX;
|
||||
assign WantRsByID = DP_Hazards[7];
|
||||
assign NeedRsByID = DP_Hazards[6];
|
||||
assign WantRtByID = DP_Hazards[5];
|
||||
assign NeedRtByID = DP_Hazards[4];
|
||||
assign WantRsByEX = DP_Hazards[3];
|
||||
assign NeedRsByEX = DP_Hazards[2];
|
||||
assign WantRtByEX = DP_Hazards[1];
|
||||
assign NeedRtByEX = DP_Hazards[0];
|
||||
|
||||
// Trick allowed by RegDst = 0 which gives Rt. MEM_Rt is only used on
|
||||
// Data Memory write operations (stores), and RegWrite is always 0 in this case.
|
||||
wire [4:0] MEM_Rt = MEM_RtRd;
|
||||
|
||||
// Forwarding should not happen when the src/dst register is $zero
|
||||
wire EX_RtRd_NZ = (EX_RtRd != 5'b00000);
|
||||
wire MEM_RtRd_NZ = (MEM_RtRd != 5'b00000);
|
||||
wire WB_RtRd_NZ = (WB_RtRd != 5'b00000);
|
||||
|
||||
// ID Dependencies
|
||||
wire Rs_IDEX_Match = (ID_Rs == EX_RtRd) & EX_RtRd_NZ & (WantRsByID | NeedRsByID) & EX_RegWrite;
|
||||
wire Rt_IDEX_Match = (ID_Rt == EX_RtRd) & EX_RtRd_NZ & (WantRtByID | NeedRtByID) & EX_RegWrite;
|
||||
wire Rs_IDMEM_Match = (ID_Rs == MEM_RtRd) & MEM_RtRd_NZ & (WantRsByID | NeedRsByID) & MEM_RegWrite;
|
||||
wire Rt_IDMEM_Match = (ID_Rt == MEM_RtRd) & MEM_RtRd_NZ & (WantRtByID | NeedRtByID) & MEM_RegWrite;
|
||||
wire Rs_IDWB_Match = (ID_Rs == WB_RtRd) & WB_RtRd_NZ & (WantRsByID | NeedRsByID) & WB_RegWrite;
|
||||
wire Rt_IDWB_Match = (ID_Rt == WB_RtRd) & WB_RtRd_NZ & (WantRtByID | NeedRtByID) & WB_RegWrite;
|
||||
// EX Dependencies
|
||||
wire Rs_EXMEM_Match = (EX_Rs == MEM_RtRd) & MEM_RtRd_NZ & (WantRsByEX | NeedRsByEX) & MEM_RegWrite;
|
||||
wire Rt_EXMEM_Match = (EX_Rt == MEM_RtRd) & MEM_RtRd_NZ & (WantRtByEX | NeedRtByEX) & MEM_RegWrite;
|
||||
wire Rs_EXWB_Match = (EX_Rs == WB_RtRd) & WB_RtRd_NZ & (WantRsByEX | NeedRsByEX) & WB_RegWrite;
|
||||
wire Rt_EXWB_Match = (EX_Rt == WB_RtRd) & WB_RtRd_NZ & (WantRtByEX | NeedRtByEX) & WB_RegWrite;
|
||||
// MEM Dependencies
|
||||
wire Rt_MEMWB_Match = (MEM_Rt == WB_RtRd) & WB_RtRd_NZ & WB_RegWrite;
|
||||
|
||||
|
||||
// ID needs data from EX : Stall
|
||||
wire ID_Stall_1 = (Rs_IDEX_Match & NeedRsByID);
|
||||
wire ID_Stall_2 = (Rt_IDEX_Match & NeedRtByID);
|
||||
// ID needs data from MEM : Stall if mem access
|
||||
wire ID_Stall_3 = (Rs_IDMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRsByID);
|
||||
wire ID_Stall_4 = (Rt_IDMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRtByID);
|
||||
// ID wants data from MEM : Forward if not mem access
|
||||
wire ID_Fwd_1 = (Rs_IDMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
wire ID_Fwd_2 = (Rt_IDMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
// ID wants/needs data from WB : Forward
|
||||
wire ID_Fwd_3 = (Rs_IDWB_Match);
|
||||
wire ID_Fwd_4 = (Rt_IDWB_Match);
|
||||
// EX needs data from MEM : Stall if mem access
|
||||
wire EX_Stall_1 = (Rs_EXMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRsByEX);
|
||||
wire EX_Stall_2 = (Rt_EXMEM_Match & (MEM_MemRead | MEM_MemWrite) & NeedRtByEX);
|
||||
// EX wants data from MEM : Forward if not mem access
|
||||
wire EX_Fwd_1 = (Rs_EXMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
wire EX_Fwd_2 = (Rt_EXMEM_Match & ~(MEM_MemRead | MEM_MemWrite));
|
||||
// EX wants/needs data from WB : Forward
|
||||
wire EX_Fwd_3 = (Rs_EXWB_Match);
|
||||
wire EX_Fwd_4 = (Rt_EXWB_Match);
|
||||
// MEM needs data from WB : Forward
|
||||
wire MEM_Fwd_1 = (Rt_MEMWB_Match);
|
||||
|
||||
|
||||
// Stalls and Control Flow Final Assignments
|
||||
assign WB_Stall = M_Stall;
|
||||
assign M_Stall = IF_Stall | M_Stall_Controller;
|
||||
assign EX_Stall = (EX_Stall_1 | EX_Stall_2 | EX_Exception_Stall) | EX_ALU_Stall | M_Stall;
|
||||
assign ID_Stall = (ID_Stall_1 | ID_Stall_2 | ID_Stall_3 | ID_Stall_4 | ID_Exception_Stall) | EX_Stall;
|
||||
assign IF_Stall = InstMem_Read | InstMem_Ready | IF_Exception_Stall;
|
||||
|
||||
// Forwarding Control Final Assignments
|
||||
assign ID_RsFwdSel = (ID_Fwd_1) ? 2'b01 : ((ID_Fwd_3) ? 2'b10 : 2'b00);
|
||||
assign ID_RtFwdSel = (Mfc0) ? 2'b11 : ((ID_Fwd_2) ? 2'b01 : ((ID_Fwd_4) ? 2'b10 : 2'b00));
|
||||
assign EX_RsFwdSel = (EX_Link) ? 2'b11 : ((EX_Fwd_1) ? 2'b01 : ((EX_Fwd_3) ? 2'b10 : 2'b00));
|
||||
assign EX_RtFwdSel = (EX_Link) ? 2'b11 : ((EX_Fwd_2) ? 2'b01 : ((EX_Fwd_4) ? 2'b10 : 2'b00));
|
||||
assign M_WriteDataFwdSel = MEM_Fwd_1;
|
||||
|
||||
endmodule
|
||||
|
||||
+159
@@ -0,0 +1,159 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : IDEX_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Instruction Decode
|
||||
* and Execute stages.
|
||||
*/
|
||||
module IDEX_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input ID_Flush,
|
||||
input ID_Stall,
|
||||
input EX_Stall,
|
||||
// Control Signals
|
||||
input ID_Link,
|
||||
input ID_RegDst,
|
||||
input ID_ALUSrcImm,
|
||||
input [4:0] ID_ALUOp,
|
||||
input ID_Movn,
|
||||
input ID_Movz,
|
||||
input ID_LLSC,
|
||||
input ID_MemRead,
|
||||
input ID_MemWrite,
|
||||
input ID_MemByte,
|
||||
input ID_MemHalf,
|
||||
input ID_MemSignExtend,
|
||||
input ID_Left,
|
||||
input ID_Right,
|
||||
input ID_RegWrite,
|
||||
input ID_MemtoReg,
|
||||
input ID_ReverseEndian,
|
||||
// Hazard & Forwarding
|
||||
input [4:0] ID_Rs,
|
||||
input [4:0] ID_Rt,
|
||||
input ID_WantRsByEX,
|
||||
input ID_NeedRsByEX,
|
||||
input ID_WantRtByEX,
|
||||
input ID_NeedRtByEX,
|
||||
// Exception Control/Info
|
||||
input ID_KernelMode,
|
||||
input [31:0] ID_RestartPC,
|
||||
input ID_IsBDS,
|
||||
input ID_Trap,
|
||||
input ID_TrapCond,
|
||||
input ID_EX_CanErr,
|
||||
input ID_M_CanErr,
|
||||
// Data Signals
|
||||
input [31:0] ID_ReadData1,
|
||||
input [31:0] ID_ReadData2,
|
||||
input [16:0] ID_SignExtImm, // ID_Rd, ID_Shamt included here
|
||||
// ----------------
|
||||
output reg EX_Link,
|
||||
output [1:0] EX_LinkRegDst,
|
||||
output reg EX_ALUSrcImm,
|
||||
output reg [4:0] EX_ALUOp,
|
||||
output reg EX_Movn,
|
||||
output reg EX_Movz,
|
||||
output reg EX_LLSC,
|
||||
output reg EX_MemRead,
|
||||
output reg EX_MemWrite,
|
||||
output reg EX_MemByte,
|
||||
output reg EX_MemHalf,
|
||||
output reg EX_MemSignExtend,
|
||||
output reg EX_Left,
|
||||
output reg EX_Right,
|
||||
output reg EX_RegWrite,
|
||||
output reg EX_MemtoReg,
|
||||
output reg EX_ReverseEndian,
|
||||
output reg [4:0] EX_Rs,
|
||||
output reg [4:0] EX_Rt,
|
||||
output reg EX_WantRsByEX,
|
||||
output reg EX_NeedRsByEX,
|
||||
output reg EX_WantRtByEX,
|
||||
output reg EX_NeedRtByEX,
|
||||
output reg EX_KernelMode,
|
||||
output reg [31:0] EX_RestartPC,
|
||||
output reg EX_IsBDS,
|
||||
output reg EX_Trap,
|
||||
output reg EX_TrapCond,
|
||||
output reg EX_EX_CanErr,
|
||||
output reg EX_M_CanErr,
|
||||
output reg [31:0] EX_ReadData1,
|
||||
output reg [31:0] EX_ReadData2,
|
||||
output [31:0] EX_SignExtImm,
|
||||
output [4:0] EX_Rd,
|
||||
output [4:0] EX_Shamt
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
reg [16:0] EX_SignExtImm_pre;
|
||||
reg EX_RegDst;
|
||||
assign EX_LinkRegDst = (EX_Link) ? 2'b10 : ((EX_RegDst) ? 2'b01 : 2'b00);
|
||||
assign EX_Rd = EX_SignExtImm[15:11];
|
||||
assign EX_Shamt = EX_SignExtImm[10:6];
|
||||
assign EX_SignExtImm = (EX_SignExtImm_pre[16]) ? {15'h7fff, EX_SignExtImm_pre[16:0]} : {15'h0000, EX_SignExtImm_pre[16:0]};
|
||||
|
||||
always @(posedge clock) begin
|
||||
EX_Link <= (reset) ? 0 : ((EX_Stall) ? EX_Link : ID_Link);
|
||||
EX_RegDst <= (reset) ? 0 : ((EX_Stall) ? EX_RegDst : ID_RegDst);
|
||||
EX_ALUSrcImm <= (reset) ? 0 : ((EX_Stall) ? EX_ALUSrcImm : ID_ALUSrcImm);
|
||||
EX_ALUOp <= (reset) ? 5'b0 : ((EX_Stall) ? EX_ALUOp : ((ID_Stall | ID_Flush) ? 5'b0 : ID_ALUOp));
|
||||
EX_Movn <= (reset) ? 0 : ((EX_Stall) ? EX_Movn : ID_Movn);
|
||||
EX_Movz <= (reset) ? 0 : ((EX_Stall) ? EX_Movz : ID_Movz);
|
||||
EX_LLSC <= (reset) ? 0 : ((EX_Stall) ? EX_LLSC : ID_LLSC);
|
||||
EX_MemRead <= (reset) ? 0 : ((EX_Stall) ? EX_MemRead : ((ID_Stall | ID_Flush) ? 0 : ID_MemRead));
|
||||
EX_MemWrite <= (reset) ? 0 : ((EX_Stall) ? EX_MemWrite : ((ID_Stall | ID_Flush) ? 0 : ID_MemWrite));
|
||||
EX_MemByte <= (reset) ? 0 : ((EX_Stall) ? EX_MemByte : ID_MemByte);
|
||||
EX_MemHalf <= (reset) ? 0 : ((EX_Stall) ? EX_MemHalf : ID_MemHalf);
|
||||
EX_MemSignExtend <= (reset) ? 0 : ((EX_Stall) ? EX_MemSignExtend : ID_MemSignExtend);
|
||||
EX_Left <= (reset) ? 0 : ((EX_Stall) ? EX_Left : ID_Left);
|
||||
EX_Right <= (reset) ? 0 : ((EX_Stall) ? EX_Right : ID_Right);
|
||||
EX_RegWrite <= (reset) ? 0 : ((EX_Stall) ? EX_RegWrite : ((ID_Stall | ID_Flush) ? 0 : ID_RegWrite));
|
||||
EX_MemtoReg <= (reset) ? 0 : ((EX_Stall) ? EX_MemtoReg : ID_MemtoReg);
|
||||
EX_ReverseEndian <= (reset) ? 0 : ((EX_Stall) ? EX_ReverseEndian : ID_ReverseEndian);
|
||||
EX_RestartPC <= (reset) ? 32'b0 : ((EX_Stall) ? EX_RestartPC : ID_RestartPC);
|
||||
EX_IsBDS <= (reset) ? 0 : ((EX_Stall) ? EX_IsBDS : ID_IsBDS);
|
||||
EX_Trap <= (reset) ? 0 : ((EX_Stall) ? EX_Trap : ((ID_Stall | ID_Flush) ? 0 : ID_Trap));
|
||||
EX_TrapCond <= (reset) ? 0 : ((EX_Stall) ? EX_TrapCond : ID_TrapCond);
|
||||
EX_EX_CanErr <= (reset) ? 0 : ((EX_Stall) ? EX_EX_CanErr : ((ID_Stall | ID_Flush) ? 0 : ID_EX_CanErr));
|
||||
EX_M_CanErr <= (reset) ? 0 : ((EX_Stall) ? EX_M_CanErr : ((ID_Stall | ID_Flush) ? 0 : ID_M_CanErr));
|
||||
EX_ReadData1 <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData1 : ID_ReadData1);
|
||||
EX_ReadData2 <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData2 : ID_ReadData2);
|
||||
EX_SignExtImm_pre <= (reset) ? 17'b0 : ((EX_Stall) ? EX_SignExtImm_pre : ID_SignExtImm);
|
||||
EX_Rs <= (reset) ? 5'b0 : ((EX_Stall) ? EX_Rs : ID_Rs);
|
||||
EX_Rt <= (reset) ? 5'b0 : ((EX_Stall) ? EX_Rt : ID_Rt);
|
||||
EX_WantRsByEX <= (reset) ? 0 : ((EX_Stall) ? EX_WantRsByEX : ((ID_Stall | ID_Flush) ? 0 : ID_WantRsByEX));
|
||||
EX_NeedRsByEX <= (reset) ? 0 : ((EX_Stall) ? EX_NeedRsByEX : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRsByEX));
|
||||
EX_WantRtByEX <= (reset) ? 0 : ((EX_Stall) ? EX_WantRtByEX : ((ID_Stall | ID_Flush) ? 0 : ID_WantRtByEX));
|
||||
EX_NeedRtByEX <= (reset) ? 0 : ((EX_Stall) ? EX_NeedRtByEX : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRtByEX));
|
||||
EX_KernelMode <= (reset) ? 0 : ((EX_Stall) ? EX_KernelMode : ID_KernelMode);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : IFID_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Instruction Fetch
|
||||
* and Instruction Decode stages.
|
||||
*/
|
||||
module IFID_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input IF_Flush,
|
||||
input IF_Stall,
|
||||
input ID_Stall,
|
||||
// Control Signals
|
||||
input [31:0] IF_Instruction,
|
||||
// Data Signals
|
||||
input [31:0] IF_PCAdd4,
|
||||
input [31:0] IF_PC,
|
||||
input IF_IsBDS,
|
||||
// ------------------
|
||||
output reg [31:0] ID_Instruction,
|
||||
output reg [31:0] ID_PCAdd4,
|
||||
output reg [31:0] ID_RestartPC,
|
||||
output reg ID_IsBDS,
|
||||
output reg ID_IsFlushed
|
||||
);
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
***/
|
||||
|
||||
|
||||
/***
|
||||
The signal 'ID_IsFlushed' is needed because of interrupts. Normally, a flushed instruction
|
||||
is a NOP which will never cause an exception and thus its restart PC will never be needed
|
||||
or used. However, interrupts are detected in ID and may occur when any instruction, flushed
|
||||
or not, is in the ID stage. It is an error to save the restart PC of a flushed instruction
|
||||
since it was never supposed to execute (such as the "delay slot" after ERET or the branch
|
||||
delay slot after a canceled Branch Likely instruction). A simple way to prevent this is to
|
||||
pass a signal to ID indicating that its instruction was flushed. Interrupt detection is then
|
||||
masked when this signal is high, and the interrupt will trigger on the next instruction load to ID.
|
||||
***/
|
||||
|
||||
always @(posedge clock) begin
|
||||
ID_Instruction <= (reset) ? 32'b0 : ((ID_Stall) ? ID_Instruction : ((IF_Stall | IF_Flush) ? 32'b0 : IF_Instruction));
|
||||
ID_PCAdd4 <= (reset) ? 32'b0 : ((ID_Stall) ? ID_PCAdd4 : IF_PCAdd4);
|
||||
ID_IsBDS <= (reset) ? 0 : ((ID_Stall) ? ID_IsBDS : IF_IsBDS);
|
||||
ID_RestartPC <= (reset) ? 32'b0 : ((ID_Stall | IF_IsBDS) ? ID_RestartPC : IF_PC);
|
||||
ID_IsFlushed <= (reset) ? 0 : ((ID_Stall) ? ID_IsFlushed : IF_Flush);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : MEMWB_Stage.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 9-Jun-2011 GEA Initial design.
|
||||
* 2.0 26-Jul-2012 GEA Many updates have been made.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The Pipeline Register to bridge the Memory and Writeback stages.
|
||||
*/
|
||||
module MEMWB_Stage(
|
||||
input clock,
|
||||
input reset,
|
||||
input M_Flush,
|
||||
input M_Stall,
|
||||
input WB_Stall,
|
||||
// Control Signals
|
||||
input M_RegWrite,
|
||||
input M_MemtoReg,
|
||||
// Data Signals
|
||||
input [31:0] M_ReadData,
|
||||
input [31:0] M_ALU_Result,
|
||||
input [4:0] M_RtRd,
|
||||
// ----------------
|
||||
output reg WB_RegWrite,
|
||||
output reg WB_MemtoReg,
|
||||
output reg [31:0] WB_ReadData,
|
||||
output reg [31:0] WB_ALU_Result,
|
||||
output reg [4:0] WB_RtRd
|
||||
);
|
||||
|
||||
|
||||
/***
|
||||
The purpose of a pipeline register is to capture data from one pipeline stage
|
||||
and provide it to the next pipeline stage. This creates at least one clock cycle
|
||||
of delay, but reduces the combinatorial path length of signals which allows for
|
||||
higher clock speeds.
|
||||
|
||||
All pipeline registers update unless the forward stage is stalled. When this occurs
|
||||
or when the current stage is being flushed, the forward stage will receive data that
|
||||
is effectively a NOP and causes nothing to happen throughout the remaining pipeline
|
||||
traversal. In other words:
|
||||
|
||||
A stall masks all control signals to forward stages. A flush permanently clears
|
||||
control signals to forward stages (but not certain data for exception purposes).
|
||||
|
||||
Since WB is the final stage in the pipeline, it would normally never stall.
|
||||
However, because the MEM stage may be using data forwarded from WB, WB must stall
|
||||
when MEM is stalled. If it didn't, the forward data would not be preserved. If
|
||||
the processor didn't forward any data, a stall would not be needed.
|
||||
|
||||
In practice, the only time WB stalls is when forwarding for a Lw->Sw sequence, since
|
||||
MEM doesn't need the data until its stage, but it does not latch the forwarded data.
|
||||
This means WB_Stall is probably identical to M_Stall. There is no speed difference by
|
||||
allowing WB to stall.
|
||||
***/
|
||||
|
||||
always @(posedge clock) begin
|
||||
WB_RegWrite <= (reset) ? 0 : ((WB_Stall) ? WB_RegWrite : ((M_Stall | M_Flush) ? 0 : M_RegWrite));
|
||||
WB_MemtoReg <= (reset) ? 0 : ((WB_Stall) ? WB_MemtoReg : M_MemtoReg);
|
||||
WB_ReadData <= (reset) ? 32'b0 : ((WB_Stall) ? WB_ReadData : M_ReadData);
|
||||
WB_ALU_Result <= (reset) ? 32'b0 : ((WB_Stall) ? WB_ALU_Result : M_ALU_Result);
|
||||
WB_RtRd <= (reset) ? 5'b0 : ((WB_Stall) ? WB_RtRd : M_RtRd);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+631
@@ -0,0 +1,631 @@
|
||||
/*
|
||||
* File : MIPS_Parameters.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 26-May-2012 GEA Release version.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Provides a language abstraction for the MIPS32-specific op-codes and
|
||||
* the processor-specific datapath, hazard, and exception bits which
|
||||
* control the processor. These parameter names are used extensively
|
||||
* throughout the processor HDL modules.
|
||||
*/
|
||||
|
||||
|
||||
/*** Exception Vector Locations ***
|
||||
|
||||
When the CPU powers up or is reset, it will begin execution at 'EXC_Vector_Base_Reset'.
|
||||
All other exceptions are the sum of a base address and offset:
|
||||
- The base address is either a bootstrap or normal value. It is controlled by
|
||||
the 'BEV' bit in the CP0 'Status' register. Both base addresses can be mapped to
|
||||
the same location.
|
||||
- The offset address is either a standard offset (which is always used for
|
||||
non-interrupt general exceptions in this processor because it lacks TLB Refill
|
||||
and Cache errors), or a special interrupt-only offset for interrupts, which is
|
||||
enabled with the 'IV' bit in the CP0 'Cause' register.
|
||||
|
||||
Current Setup:
|
||||
General exceptions go to 0x0. Interrupts go to 0x8. Booting starts at 0x10.
|
||||
*/
|
||||
parameter [31:0] EXC_Vector_Base_Reset = 32'h0000_0010; // MIPS Standard is 0xBFC0_0000
|
||||
parameter [31:0] EXC_Vector_Base_Other_NoBoot = 32'h0000_0000; // MIPS Standard is 0x8000_0000
|
||||
parameter [31:0] EXC_Vector_Base_Other_Boot = 32'h0000_0000; // MIPS Standard is 0xBFC0_0200
|
||||
parameter [31:0] EXC_Vector_Offset_General = 32'h0000_0000; // MIPS Standard is 0x0000_0180
|
||||
parameter [31:0] EXC_Vector_Offset_Special = 32'h0000_0008; // MIPS Standard is 0x0000_0200
|
||||
|
||||
|
||||
|
||||
/*** Kernel/User Memory Areas ***
|
||||
|
||||
Kernel memory starts at address 0x0. User memory starts at 'UMem_Lower' and extends to
|
||||
the end of the address space.
|
||||
|
||||
A distinction is made to protect against accesses to kernel memory while the processor
|
||||
is in user mode. Lacking MMU hardware, these addresses are physical, not virtual.
|
||||
This simple two-part division of the address space can be extended almost arbitrarily
|
||||
in the Data Memory Controller. Note that there is currently no user/kernel space check
|
||||
for the Instruction Memory, because it is assumed that instructions are in the kernel space.
|
||||
*/
|
||||
parameter [31:0] UMem_Lower = 32'h08000000;
|
||||
|
||||
|
||||
|
||||
/*** Processor Endianness ***
|
||||
|
||||
The MIPS Configuration Register (CP0 Register 16 Select 0) specifies the processor's
|
||||
endianness. A processor in user mode may switch to reverse endianness, which will be
|
||||
the opposite of this parameter.
|
||||
*/
|
||||
parameter Big_Endian = 1;
|
||||
|
||||
|
||||
|
||||
/*** Encodings for MIPS32 Release 1 Architecture ***/
|
||||
|
||||
|
||||
/* Op Code Categories */
|
||||
parameter [5:0] Op_Type_R = 6'b00_0000; // Standard R-Type instructions
|
||||
parameter [5:0] Op_Type_R2 = 6'b01_1100; // Extended R-Like instructions
|
||||
parameter [5:0] Op_Type_BI = 6'b00_0001; // Branch/Trap extended instructions
|
||||
parameter [5:0] Op_Type_CP0 = 6'b01_0000; // Coprocessor 0 instructions
|
||||
parameter [5:0] Op_Type_CP1 = 6'b01_0001; // Coprocessor 1 instructions (not implemented)
|
||||
parameter [5:0] Op_Type_CP2 = 6'b01_0010; // Coprocessor 2 instructions (not implemented)
|
||||
parameter [5:0] Op_Type_CP3 = 6'b01_0011; // Coprocessor 3 instructions (not implemented)
|
||||
// --------------------------------------
|
||||
parameter [5:0] Op_Add = Op_Type_R;
|
||||
parameter [5:0] Op_Addi = 6'b00_1000;
|
||||
parameter [5:0] Op_Addiu = 6'b00_1001;
|
||||
parameter [5:0] Op_Addu = Op_Type_R;
|
||||
parameter [5:0] Op_And = Op_Type_R;
|
||||
parameter [5:0] Op_Andi = 6'b00_1100;
|
||||
parameter [5:0] Op_Beq = 6'b00_0100;
|
||||
parameter [5:0] Op_Bgez = Op_Type_BI;
|
||||
parameter [5:0] Op_Bgezal = Op_Type_BI;
|
||||
parameter [5:0] Op_Bgtz = 6'b00_0111;
|
||||
parameter [5:0] Op_Blez = 6'b00_0110;
|
||||
parameter [5:0] Op_Bltz = Op_Type_BI;
|
||||
parameter [5:0] Op_Bltzal = Op_Type_BI;
|
||||
parameter [5:0] Op_Bne = 6'b00_0101;
|
||||
parameter [5:0] Op_Break = Op_Type_R;
|
||||
parameter [5:0] Op_Clo = Op_Type_R2;
|
||||
parameter [5:0] Op_Clz = Op_Type_R2;
|
||||
parameter [5:0] Op_Div = Op_Type_R;
|
||||
parameter [5:0] Op_Divu = Op_Type_R;
|
||||
parameter [5:0] Op_Eret = Op_Type_CP0;
|
||||
parameter [5:0] Op_J = 6'b00_0010;
|
||||
parameter [5:0] Op_Jal = 6'b00_0011;
|
||||
parameter [5:0] Op_Jalr = Op_Type_R;
|
||||
parameter [5:0] Op_Jr = Op_Type_R;
|
||||
parameter [5:0] Op_Lb = 6'b10_0000;
|
||||
parameter [5:0] Op_Lbu = 6'b10_0100;
|
||||
parameter [5:0] Op_Lh = 6'b10_0001;
|
||||
parameter [5:0] Op_Lhu = 6'b10_0101;
|
||||
parameter [5:0] Op_Ll = 6'b11_0000;
|
||||
parameter [5:0] Op_Lui = 6'b00_1111;
|
||||
parameter [5:0] Op_Lw = 6'b10_0011;
|
||||
parameter [5:0] Op_Lwl = 6'b10_0010;
|
||||
parameter [5:0] Op_Lwr = 6'b10_0110;
|
||||
parameter [5:0] Op_Madd = Op_Type_R2;
|
||||
parameter [5:0] Op_Maddu = Op_Type_R2;
|
||||
parameter [5:0] Op_Mfc0 = Op_Type_CP0;
|
||||
parameter [5:0] Op_Mfhi = Op_Type_R;
|
||||
parameter [5:0] Op_Mflo = Op_Type_R;
|
||||
parameter [5:0] Op_Movn = Op_Type_R;
|
||||
parameter [5:0] Op_Movz = Op_Type_R;
|
||||
parameter [5:0] Op_Msub = Op_Type_R2;
|
||||
parameter [5:0] Op_Msubu = Op_Type_R2;
|
||||
parameter [5:0] Op_Mtc0 = Op_Type_CP0;
|
||||
parameter [5:0] Op_Mthi = Op_Type_R;
|
||||
parameter [5:0] Op_Mtlo = Op_Type_R;
|
||||
parameter [5:0] Op_Mul = Op_Type_R2;
|
||||
parameter [5:0] Op_Mult = Op_Type_R;
|
||||
parameter [5:0] Op_Multu = Op_Type_R;
|
||||
parameter [5:0] Op_Nor = Op_Type_R;
|
||||
parameter [5:0] Op_Or = Op_Type_R;
|
||||
parameter [5:0] Op_Ori = 6'b00_1101;
|
||||
parameter [5:0] Op_Pref = 6'b11_0011; // Prefetch does nothing in this implementation.
|
||||
parameter [5:0] Op_Sb = 6'b10_1000;
|
||||
parameter [5:0] Op_Sc = 6'b11_1000;
|
||||
parameter [5:0] Op_Sh = 6'b10_1001;
|
||||
parameter [5:0] Op_Sll = Op_Type_R;
|
||||
parameter [5:0] Op_Sllv = Op_Type_R;
|
||||
parameter [5:0] Op_Slt = Op_Type_R;
|
||||
parameter [5:0] Op_Slti = 6'b00_1010;
|
||||
parameter [5:0] Op_Sltiu = 6'b00_1011;
|
||||
parameter [5:0] Op_Sltu = Op_Type_R;
|
||||
parameter [5:0] Op_Sra = Op_Type_R;
|
||||
parameter [5:0] Op_Srav = Op_Type_R;
|
||||
parameter [5:0] Op_Srl = Op_Type_R;
|
||||
parameter [5:0] Op_Srlv = Op_Type_R;
|
||||
parameter [5:0] Op_Sub = Op_Type_R;
|
||||
parameter [5:0] Op_Subu = Op_Type_R;
|
||||
parameter [5:0] Op_Sw = 6'b10_1011;
|
||||
parameter [5:0] Op_Swl = 6'b10_1010;
|
||||
parameter [5:0] Op_Swr = 6'b10_1110;
|
||||
parameter [5:0] Op_Syscall = Op_Type_R;
|
||||
parameter [5:0] Op_Teq = Op_Type_R;
|
||||
parameter [5:0] Op_Teqi = Op_Type_BI;
|
||||
parameter [5:0] Op_Tge = Op_Type_R;
|
||||
parameter [5:0] Op_Tgei = Op_Type_BI;
|
||||
parameter [5:0] Op_Tgeiu = Op_Type_BI;
|
||||
parameter [5:0] Op_Tgeu = Op_Type_R;
|
||||
parameter [5:0] Op_Tlt = Op_Type_R;
|
||||
parameter [5:0] Op_Tlti = Op_Type_BI;
|
||||
parameter [5:0] Op_Tltiu = Op_Type_BI;
|
||||
parameter [5:0] Op_Tltu = Op_Type_R;
|
||||
parameter [5:0] Op_Tne = Op_Type_R;
|
||||
parameter [5:0] Op_Tnei = Op_Type_BI;
|
||||
parameter [5:0] Op_Xor = Op_Type_R;
|
||||
parameter [5:0] Op_Xori = 6'b00_1110;
|
||||
|
||||
/* Op Code Rt fields for Branches & Traps */
|
||||
parameter [4:0] OpRt_Bgez = 5'b00001;
|
||||
parameter [4:0] OpRt_Bgezal = 5'b10001;
|
||||
parameter [4:0] OpRt_Bltz = 5'b00000;
|
||||
parameter [4:0] OpRt_Bltzal = 5'b10000;
|
||||
parameter [4:0] OpRt_Teqi = 5'b01100;
|
||||
parameter [4:0] OpRt_Tgei = 5'b01000;
|
||||
parameter [4:0] OpRt_Tgeiu = 5'b01001;
|
||||
parameter [4:0] OpRt_Tlti = 5'b01010;
|
||||
parameter [4:0] OpRt_Tltiu = 5'b01011;
|
||||
parameter [4:0] OpRt_Tnei = 5'b01110;
|
||||
|
||||
/* Op Code Rs fields for Coprocessors */
|
||||
parameter [4:0] OpRs_MF = 5'b00000;
|
||||
parameter [4:0] OpRs_MT = 5'b00100;
|
||||
|
||||
/* Special handling for ERET */
|
||||
parameter [4:0] OpRs_ERET = 5'b10000;
|
||||
parameter [5:0] Funct_ERET = 6'b011000;
|
||||
|
||||
/* Function Codes for R-Type Op Codes */
|
||||
parameter [5:0] Funct_Add = 6'b10_0000;
|
||||
parameter [5:0] Funct_Addu = 6'b10_0001;
|
||||
parameter [5:0] Funct_And = 6'b10_0100;
|
||||
parameter [5:0] Funct_Break = 6'b00_1101;
|
||||
parameter [5:0] Funct_Clo = 6'b10_0001; // same as Addu
|
||||
parameter [5:0] Funct_Clz = 6'b10_0000; // same as Add
|
||||
parameter [5:0] Funct_Div = 6'b01_1010;
|
||||
parameter [5:0] Funct_Divu = 6'b01_1011;
|
||||
parameter [5:0] Funct_Jr = 6'b00_1000;
|
||||
parameter [5:0] Funct_Jalr = 6'b00_1001;
|
||||
parameter [5:0] Funct_Madd = 6'b00_0000;
|
||||
parameter [5:0] Funct_Maddu = 6'b00_0001;
|
||||
parameter [5:0] Funct_Mfhi = 6'b01_0000;
|
||||
parameter [5:0] Funct_Mflo = 6'b01_0010;
|
||||
parameter [5:0] Funct_Movn = 6'b00_1011;
|
||||
parameter [5:0] Funct_Movz = 6'b00_1010;
|
||||
parameter [5:0] Funct_Msub = 6'b00_0100; // same as Sllv
|
||||
parameter [5:0] Funct_Msubu = 6'b00_0101;
|
||||
parameter [5:0] Funct_Mthi = 6'b01_0001;
|
||||
parameter [5:0] Funct_Mtlo = 6'b01_0011;
|
||||
parameter [5:0] Funct_Mul = 6'b00_0010; // same as Srl
|
||||
parameter [5:0] Funct_Mult = 6'b01_1000;
|
||||
parameter [5:0] Funct_Multu = 6'b01_1001;
|
||||
parameter [5:0] Funct_Nor = 6'b10_0111;
|
||||
parameter [5:0] Funct_Or = 6'b10_0101;
|
||||
parameter [5:0] Funct_Sll = 6'b00_0000;
|
||||
parameter [5:0] Funct_Sllv = 6'b00_0100;
|
||||
parameter [5:0] Funct_Slt = 6'b10_1010;
|
||||
parameter [5:0] Funct_Sltu = 6'b10_1011;
|
||||
parameter [5:0] Funct_Sra = 6'b00_0011;
|
||||
parameter [5:0] Funct_Srav = 6'b00_0111;
|
||||
parameter [5:0] Funct_Srl = 6'b00_0010;
|
||||
parameter [5:0] Funct_Srlv = 6'b00_0110;
|
||||
parameter [5:0] Funct_Sub = 6'b10_0010;
|
||||
parameter [5:0] Funct_Subu = 6'b10_0011;
|
||||
parameter [5:0] Funct_Syscall = 6'b00_1100;
|
||||
parameter [5:0] Funct_Teq = 6'b11_0100;
|
||||
parameter [5:0] Funct_Tge = 6'b11_0000;
|
||||
parameter [5:0] Funct_Tgeu = 6'b11_0001;
|
||||
parameter [5:0] Funct_Tlt = 6'b11_0010;
|
||||
parameter [5:0] Funct_Tltu = 6'b11_0011;
|
||||
parameter [5:0] Funct_Tne = 6'b11_0110;
|
||||
parameter [5:0] Funct_Xor = 6'b10_0110;
|
||||
|
||||
/* ALU Operations (Implementation) */
|
||||
parameter [4:0] AluOp_Add = 5'd1;
|
||||
parameter [4:0] AluOp_Addu = 5'd0;
|
||||
parameter [4:0] AluOp_And = 5'd2;
|
||||
parameter [4:0] AluOp_Clo = 5'd3;
|
||||
parameter [4:0] AluOp_Clz = 5'd4;
|
||||
parameter [4:0] AluOp_Div = 5'd5;
|
||||
parameter [4:0] AluOp_Divu = 5'd6;
|
||||
parameter [4:0] AluOp_Madd = 5'd7;
|
||||
parameter [4:0] AluOp_Maddu = 5'd8;
|
||||
parameter [4:0] AluOp_Mfhi = 5'd9;
|
||||
parameter [4:0] AluOp_Mflo = 5'd10;
|
||||
parameter [4:0] AluOp_Msub = 5'd13;
|
||||
parameter [4:0] AluOp_Msubu = 5'd14;
|
||||
parameter [4:0] AluOp_Mthi = 5'd11;
|
||||
parameter [4:0] AluOp_Mtlo = 5'd12;
|
||||
parameter [4:0] AluOp_Mul = 5'd15;
|
||||
parameter [4:0] AluOp_Mult = 5'd16;
|
||||
parameter [4:0] AluOp_Multu = 5'd17;
|
||||
parameter [4:0] AluOp_Nor = 5'd18;
|
||||
parameter [4:0] AluOp_Or = 5'd19;
|
||||
parameter [4:0] AluOp_Sll = 5'd20;
|
||||
parameter [4:0] AluOp_Sllc = 5'd21; // Move this if another AluOp is needed
|
||||
parameter [4:0] AluOp_Sllv = 5'd22;
|
||||
parameter [4:0] AluOp_Slt = 5'd23;
|
||||
parameter [4:0] AluOp_Sltu = 5'd24;
|
||||
parameter [4:0] AluOp_Sra = 5'd25;
|
||||
parameter [4:0] AluOp_Srav = 5'd26;
|
||||
parameter [4:0] AluOp_Srl = 5'd27;
|
||||
parameter [4:0] AluOp_Srlv = 5'd28;
|
||||
parameter [4:0] AluOp_Sub = 5'd29;
|
||||
parameter [4:0] AluOp_Subu = 5'd30;
|
||||
parameter [4:0] AluOp_Xor = 5'd31;
|
||||
|
||||
|
||||
// Movc:10->11, Trap:9->10, TrapCond:8->9, RegDst:7->8
|
||||
|
||||
/*** Datapath ***
|
||||
|
||||
All Signals are Active High. Branching and Jump signals (determined by "PCSrc"),
|
||||
as well as ALU operation signals ("ALUOp") are handled by the controller and are not found here.
|
||||
|
||||
Bit Name Description
|
||||
------------------------------
|
||||
15: PCSrc (Instruction Type)
|
||||
14: 11: Instruction is Jump to Register
|
||||
10: Instruction is Branch
|
||||
01: Instruction is Jump to Immediate
|
||||
00: Instruction does not branch nor jump
|
||||
13: Link (Link on Branch/Jump)
|
||||
------------------------------
|
||||
12: ALUSrc (ALU Source) [0=ALU input B is 2nd register file output; 1=Immediate value]
|
||||
11: Movc (Conditional Move)
|
||||
10: Trap (Trap Instruction)
|
||||
9 : TrapCond (Trap Condition) [0=ALU result is 0; 1=ALU result is not 0]
|
||||
8 : RegDst (Register File Target) [0=Rt field; 1=Rd field]
|
||||
------------------------------
|
||||
7 : LLSC (Load Linked or Store Conditional)
|
||||
6 : MemRead (Data Memory Read)
|
||||
5 : MemWrite (Data Memory Write)
|
||||
4 : MemHalf (Half Word Memory Access)
|
||||
3 : MemByte (Byte size Memory Access)
|
||||
2 : MemSignExtend (Sign Extend Read Memory) [0=Zero Extend; 1=Sign Extend]
|
||||
------------------------------
|
||||
1 : RegWrite (Register File Write)
|
||||
0 : MemtoReg (Memory to Register) [0=Register File write data is ALU output; 1=Is Data Memory]
|
||||
------------------------------
|
||||
*/
|
||||
parameter [15:0] DP_None = 16'b000_00000_000000_00; // Instructions which require nothing of the main datapath.
|
||||
parameter [15:0] DP_RType = 16'b000_00001_000000_10; // Standard R-Type
|
||||
parameter [15:0] DP_IType = 16'b000_10000_000000_10; // Standard I-Type
|
||||
parameter [15:0] DP_Branch = 16'b100_00000_000000_00; // Standard Branch
|
||||
parameter [15:0] DP_BranchLink = 16'b101_00000_000000_10; // Branch and Link
|
||||
parameter [15:0] DP_HiLoWr = 16'b000_00000_000000_00; // Write to Hi/Lo ALU register (Div,Divu,Mult,Multu,Mthi,Mtlo). Currently 'DP_None'.
|
||||
parameter [15:0] DP_Jump = 16'b010_00000_000000_00; // Standard Jump
|
||||
parameter [15:0] DP_JumpLink = 16'b011_00000_000000_10; // Jump and Link
|
||||
parameter [15:0] DP_JumpLinkReg = 16'b111_00000_000000_10; // Jump and Link Register
|
||||
parameter [15:0] DP_JumpReg = 16'b110_00000_000000_00; // Jump Register
|
||||
parameter [15:0] DP_LoadByteS = 16'b000_10000_010011_11; // Load Byte Signed
|
||||
parameter [15:0] DP_LoadByteU = 16'b000_10000_010010_11; // Load Byte Unsigned
|
||||
parameter [15:0] DP_LoadHalfS = 16'b000_10000_010101_11; // Load Half Signed
|
||||
parameter [15:0] DP_LoadHalfU = 16'b000_10000_010100_11; // Load Half Unsigned
|
||||
parameter [15:0] DP_LoadWord = 16'b000_10000_010000_11; // Load Word
|
||||
parameter [15:0] DP_ExtWrRt = 16'b000_00000_000000_10; // A DP-external write to Rt
|
||||
parameter [15:0] DP_ExtWrRd = 16'b000_00001_000000_10; // A DP-external write to Rd
|
||||
parameter [15:0] DP_Movc = 16'b000_01001_000000_10; // Conditional Move
|
||||
parameter [15:0] DP_LoadLinked = 16'b000_10000_110000_11; // Load Linked
|
||||
parameter [15:0] DP_StoreCond = 16'b000_10000_101000_11; // Store Conditional
|
||||
parameter [15:0] DP_StoreByte = 16'b000_10000_001010_00; // Store Byte
|
||||
parameter [15:0] DP_StoreHalf = 16'b000_10000_001100_00; // Store Half
|
||||
parameter [15:0] DP_StoreWord = 16'b000_10000_001000_00; // Store Word
|
||||
parameter [15:0] DP_TrapRegCNZ = 16'b000_00110_000000_00; // Trap using Rs and Rt, non-zero ALU (Tlt, Tltu, Tne)
|
||||
parameter [15:0] DP_TrapRegCZ = 16'b000_00100_000000_00; // Trap using RS and Rt, zero ALU (Teq, Tge, Tgeu)
|
||||
parameter [15:0] DP_TrapImmCNZ = 16'b000_10110_000000_00; // Trap using Rs and Imm, non-zero ALU (Tlti, Tltiu, Tnei)
|
||||
parameter [15:0] DP_TrapImmCZ = 16'b000_10100_000000_00; // Trap using Rs and Imm, zero ALU (Teqi, Tgei, Tgeiu)
|
||||
//--------------------------------------------------------
|
||||
parameter [15:0] DP_Add = DP_RType;
|
||||
parameter [15:0] DP_Addi = DP_IType;
|
||||
parameter [15:0] DP_Addiu = DP_IType;
|
||||
parameter [15:0] DP_Addu = DP_RType;
|
||||
parameter [15:0] DP_And = DP_RType;
|
||||
parameter [15:0] DP_Andi = DP_IType;
|
||||
parameter [15:0] DP_Beq = DP_Branch;
|
||||
parameter [15:0] DP_Bgez = DP_Branch;
|
||||
parameter [15:0] DP_Bgezal = DP_BranchLink;
|
||||
parameter [15:0] DP_Bgtz = DP_Branch;
|
||||
parameter [15:0] DP_Blez = DP_Branch;
|
||||
parameter [15:0] DP_Bltz = DP_Branch;
|
||||
parameter [15:0] DP_Bltzal = DP_BranchLink;
|
||||
parameter [15:0] DP_Bne = DP_Branch;
|
||||
parameter [15:0] DP_Break = DP_None;
|
||||
parameter [15:0] DP_Clo = DP_RType;
|
||||
parameter [15:0] DP_Clz = DP_RType;
|
||||
parameter [15:0] DP_Div = DP_HiLoWr;
|
||||
parameter [15:0] DP_Divu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Eret = DP_None;
|
||||
parameter [15:0] DP_J = DP_Jump;
|
||||
parameter [15:0] DP_Jal = DP_JumpLink;
|
||||
parameter [15:0] DP_Jalr = DP_JumpLinkReg;
|
||||
parameter [15:0] DP_Jr = DP_JumpReg;
|
||||
parameter [15:0] DP_Lb = DP_LoadByteS;
|
||||
parameter [15:0] DP_Lbu = DP_LoadByteU;
|
||||
parameter [15:0] DP_Lh = DP_LoadHalfS;
|
||||
parameter [15:0] DP_Lhu = DP_LoadHalfU;
|
||||
parameter [15:0] DP_Ll = DP_LoadLinked;
|
||||
parameter [15:0] DP_Lui = DP_IType;
|
||||
parameter [15:0] DP_Lw = DP_LoadWord;
|
||||
parameter [15:0] DP_Lwl = DP_LoadWord;
|
||||
parameter [15:0] DP_Lwr = DP_LoadWord;
|
||||
parameter [15:0] DP_Madd = DP_HiLoWr;
|
||||
parameter [15:0] DP_Maddu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mfc0 = DP_ExtWrRt;
|
||||
parameter [15:0] DP_Mfhi = DP_ExtWrRd;
|
||||
parameter [15:0] DP_Mflo = DP_ExtWrRd;
|
||||
parameter [15:0] DP_Movn = DP_Movc;
|
||||
parameter [15:0] DP_Movz = DP_Movc;
|
||||
parameter [15:0] DP_Msub = DP_HiLoWr;
|
||||
parameter [15:0] DP_Msubu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mtc0 = DP_None;
|
||||
parameter [15:0] DP_Mthi = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mtlo = DP_HiLoWr;
|
||||
parameter [15:0] DP_Mul = DP_RType;
|
||||
parameter [15:0] DP_Mult = DP_HiLoWr;
|
||||
parameter [15:0] DP_Multu = DP_HiLoWr;
|
||||
parameter [15:0] DP_Nor = DP_RType;
|
||||
parameter [15:0] DP_Or = DP_RType;
|
||||
parameter [15:0] DP_Ori = DP_IType;
|
||||
parameter [15:0] DP_Pref = DP_None; // Not Implemented
|
||||
parameter [15:0] DP_Sb = DP_StoreByte;
|
||||
parameter [15:0] DP_Sc = DP_StoreCond;
|
||||
parameter [15:0] DP_Sh = DP_StoreHalf;
|
||||
parameter [15:0] DP_Sll = DP_RType;
|
||||
parameter [15:0] DP_Sllv = DP_RType;
|
||||
parameter [15:0] DP_Slt = DP_RType;
|
||||
parameter [15:0] DP_Slti = DP_IType;
|
||||
parameter [15:0] DP_Sltiu = DP_IType;
|
||||
parameter [15:0] DP_Sltu = DP_RType;
|
||||
parameter [15:0] DP_Sra = DP_RType;
|
||||
parameter [15:0] DP_Srav = DP_RType;
|
||||
parameter [15:0] DP_Srl = DP_RType;
|
||||
parameter [15:0] DP_Srlv = DP_RType;
|
||||
parameter [15:0] DP_Sub = DP_RType;
|
||||
parameter [15:0] DP_Subu = DP_RType;
|
||||
parameter [15:0] DP_Sw = DP_StoreWord;
|
||||
parameter [15:0] DP_Swl = DP_StoreWord;
|
||||
parameter [15:0] DP_Swr = DP_StoreWord;
|
||||
parameter [15:0] DP_Syscall = DP_None;
|
||||
parameter [15:0] DP_Teq = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Teqi = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tge = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Tgei = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tgeiu = DP_TrapImmCZ;
|
||||
parameter [15:0] DP_Tgeu = DP_TrapRegCZ;
|
||||
parameter [15:0] DP_Tlt = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tlti = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Tltiu = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Tltu = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tne = DP_TrapRegCNZ;
|
||||
parameter [15:0] DP_Tnei = DP_TrapImmCNZ;
|
||||
parameter [15:0] DP_Xor = DP_RType;
|
||||
parameter [15:0] DP_Xori = DP_IType;
|
||||
|
||||
|
||||
|
||||
|
||||
/*** Exception Information ***
|
||||
|
||||
All signals are Active High.
|
||||
|
||||
Bit Meaning
|
||||
------------
|
||||
2: Instruction can cause exceptions in ID
|
||||
1: Instruction can cause exceptions in EX
|
||||
0: Instruction can cause exceptions in MEM
|
||||
*/
|
||||
parameter [2:0] EXC_None = 3'b000;
|
||||
parameter [2:0] EXC_ID = 3'b100;
|
||||
parameter [2:0] EXC_EX = 3'b010;
|
||||
parameter [2:0] EXC_MEM = 3'b001;
|
||||
//--------------------------------
|
||||
parameter [2:0] EXC_Add = EXC_EX;
|
||||
parameter [2:0] EXC_Addi = EXC_EX;
|
||||
parameter [2:0] EXC_Addiu = EXC_None;
|
||||
parameter [2:0] EXC_Addu = EXC_None;
|
||||
parameter [2:0] EXC_And = EXC_None;
|
||||
parameter [2:0] EXC_Andi = EXC_None;
|
||||
parameter [2:0] EXC_Beq = EXC_None;
|
||||
parameter [2:0] EXC_Bgez = EXC_None;
|
||||
parameter [2:0] EXC_Bgezal = EXC_None;
|
||||
parameter [2:0] EXC_Bgtz = EXC_None;
|
||||
parameter [2:0] EXC_Blez = EXC_None;
|
||||
parameter [2:0] EXC_Bltz = EXC_None;
|
||||
parameter [2:0] EXC_Bltzal = EXC_None;
|
||||
parameter [2:0] EXC_Bne = EXC_None;
|
||||
parameter [2:0] EXC_Break = EXC_ID;
|
||||
parameter [2:0] EXC_Clo = EXC_None;
|
||||
parameter [2:0] EXC_Clz = EXC_None;
|
||||
parameter [2:0] EXC_Div = EXC_None;
|
||||
parameter [2:0] EXC_Divu = EXC_None;
|
||||
parameter [2:0] EXC_Eret = EXC_ID;
|
||||
parameter [2:0] EXC_J = EXC_None;
|
||||
parameter [2:0] EXC_Jal = EXC_None;
|
||||
parameter [2:0] EXC_Jalr = EXC_None;
|
||||
parameter [2:0] EXC_Jr = EXC_None;
|
||||
parameter [2:0] EXC_Lb = EXC_MEM;
|
||||
parameter [2:0] EXC_Lbu = EXC_MEM;
|
||||
parameter [2:0] EXC_Lh = EXC_MEM;
|
||||
parameter [2:0] EXC_Lhu = EXC_MEM;
|
||||
parameter [2:0] EXC_Ll = EXC_MEM;
|
||||
parameter [2:0] EXC_Lui = EXC_None;
|
||||
parameter [2:0] EXC_Lw = EXC_MEM;
|
||||
parameter [2:0] EXC_Lwl = EXC_MEM;
|
||||
parameter [2:0] EXC_Lwr = EXC_MEM;
|
||||
parameter [2:0] EXC_Madd = EXC_None;
|
||||
parameter [2:0] EXC_Maddu = EXC_None;
|
||||
parameter [2:0] EXC_Mfc0 = EXC_ID;
|
||||
parameter [2:0] EXC_Mfhi = EXC_None;
|
||||
parameter [2:0] EXC_Mflo = EXC_None;
|
||||
parameter [2:0] EXC_Movn = EXC_None;
|
||||
parameter [2:0] EXC_Movz = EXC_None;
|
||||
parameter [2:0] EXC_Msub = EXC_None;
|
||||
parameter [2:0] EXC_Msubu = EXC_None;
|
||||
parameter [2:0] EXC_Mtc0 = EXC_ID;
|
||||
parameter [2:0] EXC_Mthi = EXC_None;
|
||||
parameter [2:0] EXC_Mtlo = EXC_None;
|
||||
parameter [2:0] EXC_Mul = EXC_None;
|
||||
parameter [2:0] EXC_Mult = EXC_None;
|
||||
parameter [2:0] EXC_Multu = EXC_None;
|
||||
parameter [2:0] EXC_Nor = EXC_None;
|
||||
parameter [2:0] EXC_Or = EXC_None;
|
||||
parameter [2:0] EXC_Ori = EXC_None;
|
||||
parameter [2:0] EXC_Pref = EXC_None; // XXX
|
||||
parameter [2:0] EXC_Sb = EXC_MEM;
|
||||
parameter [2:0] EXC_Sc = EXC_MEM;
|
||||
parameter [2:0] EXC_Sh = EXC_MEM;
|
||||
parameter [2:0] EXC_Sll = EXC_None;
|
||||
parameter [2:0] EXC_Sllv = EXC_None;
|
||||
parameter [2:0] EXC_Slt = EXC_None;
|
||||
parameter [2:0] EXC_Slti = EXC_None;
|
||||
parameter [2:0] EXC_Sltiu = EXC_None;
|
||||
parameter [2:0] EXC_Sltu = EXC_None;
|
||||
parameter [2:0] EXC_Sra = EXC_None;
|
||||
parameter [2:0] EXC_Srav = EXC_None;
|
||||
parameter [2:0] EXC_Srl = EXC_None;
|
||||
parameter [2:0] EXC_Srlv = EXC_None;
|
||||
parameter [2:0] EXC_Sub = EXC_EX;
|
||||
parameter [2:0] EXC_Subu = EXC_None;
|
||||
parameter [2:0] EXC_Sw = EXC_MEM;
|
||||
parameter [2:0] EXC_Swl = EXC_MEM;
|
||||
parameter [2:0] EXC_Swr = EXC_MEM;
|
||||
parameter [2:0] EXC_Syscall = EXC_ID;
|
||||
parameter [2:0] EXC_Teq = EXC_MEM;
|
||||
parameter [2:0] EXC_Teqi = EXC_MEM;
|
||||
parameter [2:0] EXC_Tge = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgei = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgeiu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tgeu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tlt = EXC_MEM;
|
||||
parameter [2:0] EXC_Tlti = EXC_MEM;
|
||||
parameter [2:0] EXC_Tltiu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tltu = EXC_MEM;
|
||||
parameter [2:0] EXC_Tne = EXC_MEM;
|
||||
parameter [2:0] EXC_Tnei = EXC_MEM;
|
||||
parameter [2:0] EXC_Xor = EXC_None;
|
||||
parameter [2:0] EXC_Xori = EXC_None;
|
||||
|
||||
|
||||
|
||||
|
||||
/*** Hazard & Forwarding Datapath ***
|
||||
|
||||
All signals are Active High.
|
||||
|
||||
Bit Meaning
|
||||
------------
|
||||
7: Wants Rs by ID
|
||||
6: Needs Rs by ID
|
||||
5: Wants Rt by ID
|
||||
4: Needs Rt by ID
|
||||
3: Wants Rs by EX
|
||||
2: Needs Rs by EX
|
||||
1: Wants Rt by EX
|
||||
0: Needs Rt by EX
|
||||
*/
|
||||
parameter [7:0] HAZ_Nothing = 8'b00000000; // Jumps, Lui, Mfhi/lo, special, etc.
|
||||
parameter [7:0] HAZ_IDRsIDRt = 8'b11110000; // Beq, Bne, Traps
|
||||
parameter [7:0] HAZ_IDRs = 8'b11000000; // Most branches, Jumps to registers
|
||||
parameter [7:0] HAZ_IDRt = 8'b00110000; // Mtc0
|
||||
parameter [7:0] HAZ_IDRtEXRs = 8'b10111100; // Movn, Movz
|
||||
parameter [7:0] HAZ_EXRsEXRt = 8'b10101111; // Many R-Type ops
|
||||
parameter [7:0] HAZ_EXRs = 8'b10001100; // Immediates: Loads, Clo/z, Mthi/lo, etc.
|
||||
parameter [7:0] HAZ_EXRsWRt = 8'b10101110; // Stores
|
||||
parameter [7:0] HAZ_EXRt = 8'b00100011; // Shifts using Shamt field
|
||||
//-----------------------------------------
|
||||
parameter [7:0] HAZ_Add = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Addi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Addiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Addu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_And = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Andi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Beq = HAZ_IDRsIDRt;
|
||||
parameter [7:0] HAZ_Bgez = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bgezal = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bgtz = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Blez = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bltz = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bltzal = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Bne = HAZ_IDRsIDRt;
|
||||
parameter [7:0] HAZ_Break = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Clo = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Clz = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Div = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Divu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Eret = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_J = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Jal = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Jalr = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Jr = HAZ_IDRs;
|
||||
parameter [7:0] HAZ_Lb = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lbu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lh = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lhu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Ll = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lui = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Lw = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Lwl = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Lwr = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Madd = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Maddu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mfc0 = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Mfhi = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Mflo = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Movn = HAZ_IDRtEXRs;
|
||||
parameter [7:0] HAZ_Movz = HAZ_IDRtEXRs;
|
||||
parameter [7:0] HAZ_Msub = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Msubu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mtc0 = HAZ_IDRt;
|
||||
parameter [7:0] HAZ_Mthi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Mtlo = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Mul = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Mult = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Multu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Nor = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Or = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Ori = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Pref = HAZ_Nothing; // XXX
|
||||
parameter [7:0] HAZ_Sb = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sc = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sh = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Sll = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Sllv = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Slt = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Slti = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Sltiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Sltu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sra = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Srav = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Srl = HAZ_EXRt;
|
||||
parameter [7:0] HAZ_Srlv = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sub = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Subu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Sw = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Swl = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Swr = HAZ_EXRsWRt;
|
||||
parameter [7:0] HAZ_Syscall = HAZ_Nothing;
|
||||
parameter [7:0] HAZ_Teq = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Teqi = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tge = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tgei = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tgeiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tgeu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tlt = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tlti = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tltiu = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Tltu = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tne = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Tnei = HAZ_EXRs;
|
||||
parameter [7:0] HAZ_Xor = HAZ_EXRsEXRt;
|
||||
parameter [7:0] HAZ_Xori = HAZ_EXRs;
|
||||
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : MemControl.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-Jun-2011 GEA Initial design.
|
||||
* 2.0 28-Jun-2012 GEA Expanded from a simple byte/half/word unit to
|
||||
* An advanced data memory controller capable of
|
||||
* handling big/little endian, atomic and unaligned
|
||||
* memory accesses.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A Data Memory Controller which handles all read and write requests from the
|
||||
* processor to data memory. All data accesses--whether big endian, little endian,
|
||||
* byte, half, word, or unaligned transfers--are transformed into a simple read
|
||||
* and write command to data memory over a 32-bit data bus, where the read command
|
||||
* is one bit and the write command is 4 bits, one for each byte in the 32-bit word.
|
||||
*/
|
||||
module MemControl(
|
||||
input clock,
|
||||
input reset,
|
||||
input [31:0] DataIn, // Data from CPU
|
||||
input [31:0] Address, // From CPU
|
||||
input [31:0] MReadData, // Data from Memory
|
||||
input MemRead, // Memory Read command from CPU
|
||||
input MemWrite, // Memory Write command from CPU
|
||||
input DataMem_Ready, // Ready signal from Memory
|
||||
input Byte, // Load/Store is Byte (8-bit)
|
||||
input Half, // Load/Store is Half (16-bit)
|
||||
input SignExtend, // Sub-word load should be sign extended
|
||||
input KernelMode, // (Exception logic)
|
||||
input ReverseEndian, // Reverse Endian Memory for User Mode
|
||||
input LLSC, // (LLSC logic)
|
||||
input ERET, // (LLSC logic)
|
||||
input Left, // Unaligned Load/Store Word Left
|
||||
input Right, // Unaligned Load/Store Word Right
|
||||
input M_Exception_Stall,
|
||||
input IF_Stall, // XXX Clean this up between this module and HAZ/FWD
|
||||
output reg [31:0] DataOut, // Data to CPU
|
||||
output [31:0] MWriteData, // Data to Memory
|
||||
output reg [3:0] WriteEnable, // Write Enable to Memory for each of 4 bytes of Memory
|
||||
output ReadEnable, // Read Enable to Memory
|
||||
output M_Stall,
|
||||
output EXC_AdEL, // Load Exception
|
||||
output EXC_AdES // Store Exception
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
/*** Reverse Endian Mode
|
||||
Normal memory accesses in the processor are Big Endian. The endianness can be reversed
|
||||
to Little Endian in User Mode only.
|
||||
*/
|
||||
wire BE = KernelMode | ~ReverseEndian;
|
||||
|
||||
/*** Indicator that the current memory reference must be word-aligned ***/
|
||||
wire Word = ~(Half | Byte | Left | Right);
|
||||
|
||||
// Exception Detection
|
||||
wire EXC_KernelMem = ~KernelMode & (Address < UMem_Lower);
|
||||
wire EXC_Word = Word & (Address[1] | Address[0]);
|
||||
wire EXC_Half = Half & Address[0];
|
||||
assign EXC_AdEL = MemRead & (EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
assign EXC_AdES = MemWrite & (EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
|
||||
/*** Load Linked and Store Conditional logic ***
|
||||
|
||||
A 32-bit register keeps track of the address for atomic Load Linked / Store Conditional
|
||||
operations. This register can be updated during stalls since it is not visible to
|
||||
forward stages. It does not need to be flushed during exceptions, since ERET destroys
|
||||
the atomicity condition and there are no detrimental effects in an exception handler.
|
||||
|
||||
The atomic condition is set with a Load Linked instruction, and cleared on an ERET
|
||||
instruction or when any store instruction writes to one or more bytes covered by
|
||||
the word address register. It does not update on a stall condition.
|
||||
|
||||
The MIPS32 spec states that an ERET instruction between LL and SC will cause the
|
||||
atomicity condition to fail. This implementation uses the ERET signal from the ID
|
||||
stage, which means instruction sequences such as "LL SC" could appear to have an
|
||||
ERET instruction between them even though they don't. One way to fix this is to pass
|
||||
the ERET signal through the pipeline to the MEM stage. However, because of the nature
|
||||
of LL/SC operations (they occur in a loop which checks the result at each iteration),
|
||||
an ERET will normally never be inserted into the pipeline programmatically until the
|
||||
LL/SC sequence has completed (exceptions such as interrupts can still cause ERET, but
|
||||
they can still cause them in the LL SC sequence as well). In other words, by not passing
|
||||
ERET through the pipeline, the only possible effect is a performance penalty. Also this
|
||||
may be irrelevant since currently ERET stalls for forward stages which can cause exceptions,
|
||||
which includes LL and SC.
|
||||
*/
|
||||
reg [29:0] LLSC_Address;
|
||||
reg LLSC_Atomic;
|
||||
wire LLSC_MemWrite_Mask;
|
||||
|
||||
always @(posedge clock) begin
|
||||
LLSC_Address <= (reset) ? 30'b0 : (MemRead & LLSC) ? Address[31:2] : LLSC_Address;
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
LLSC_Atomic <= 0;
|
||||
end
|
||||
else if (MemRead) begin
|
||||
LLSC_Atomic <= (LLSC) ? 1 : LLSC_Atomic;
|
||||
end
|
||||
// XXX GEA Bug for Ganesh: remove "& ~IF_Stall" from below, then SC will always fail:
|
||||
else if (ERET | (~M_Stall & ~IF_Stall & MemWrite & (Address[31:2] == LLSC_Address))) begin
|
||||
LLSC_Atomic <= 0;
|
||||
end
|
||||
else begin
|
||||
LLSC_Atomic <= LLSC_Atomic;
|
||||
end
|
||||
end
|
||||
assign LLSC_MemWrite_Mask = (LLSC & MemWrite & (~LLSC_Atomic | (Address[31:2] != LLSC_Address)));
|
||||
|
||||
wire WriteCondition = MemWrite & ~(EXC_KernelMem | EXC_Word | EXC_Half) & ~LLSC_MemWrite_Mask;
|
||||
wire ReadCondition = MemRead & ~(EXC_KernelMem | EXC_Word | EXC_Half);
|
||||
|
||||
reg RW_Mask;
|
||||
always @(posedge clock) begin
|
||||
RW_Mask <= (reset) ? 0 : (((MemWrite | MemRead) & DataMem_Ready) ? 1 : ((~M_Stall & ~IF_Stall) ? 0 : RW_Mask));
|
||||
end
|
||||
assign M_Stall = ReadEnable | (WriteEnable != 4'b0000) | DataMem_Ready | M_Exception_Stall;
|
||||
assign ReadEnable = ReadCondition & ~RW_Mask;
|
||||
|
||||
wire Half_Access_L = (Address[1] ^ BE);
|
||||
wire Half_Access_R = (Address[1] ~^ BE);
|
||||
wire Byte_Access_LL = Half_Access_L & (Address[1] ~^ Address[0]);
|
||||
wire Byte_Access_LM = Half_Access_L & (Address[0] ~^ BE);
|
||||
wire Byte_Access_RM = Half_Access_R & (Address[0] ^ BE);
|
||||
wire Byte_Access_RR = Half_Access_R & (Address[1] ~^ Address[0]);
|
||||
|
||||
// Write-Enable Signals to Memory
|
||||
always @(*) begin
|
||||
if (WriteCondition & ~RW_Mask) begin
|
||||
if (Byte) begin
|
||||
WriteEnable[3] <= Byte_Access_LL;
|
||||
WriteEnable[2] <= Byte_Access_LM;
|
||||
WriteEnable[1] <= Byte_Access_RM;
|
||||
WriteEnable[0] <= Byte_Access_RR;
|
||||
end
|
||||
else if (Half) begin
|
||||
WriteEnable[3] <= Half_Access_L;
|
||||
WriteEnable[2] <= Half_Access_L;
|
||||
WriteEnable[1] <= Half_Access_R;
|
||||
WriteEnable[0] <= Half_Access_R;
|
||||
end
|
||||
else if (Left) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : WriteEnable <= (BE) ? 4'b1111 : 4'b0001;
|
||||
2'b01 : WriteEnable <= (BE) ? 4'b0111 : 4'b0011;
|
||||
2'b10 : WriteEnable <= (BE) ? 4'b0011 : 4'b0111;
|
||||
2'b11 : WriteEnable <= (BE) ? 4'b0001 : 4'b1111;
|
||||
endcase
|
||||
end
|
||||
else if (Right) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : WriteEnable <= (BE) ? 4'b1000 : 4'b1111;
|
||||
2'b01 : WriteEnable <= (BE) ? 4'b1100 : 4'b1110;
|
||||
2'b10 : WriteEnable <= (BE) ? 4'b1110 : 4'b1100;
|
||||
2'b11 : WriteEnable <= (BE) ? 4'b1111 : 4'b1000;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
WriteEnable <= 4'b1111;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
WriteEnable <= 4'b0000;
|
||||
end
|
||||
end
|
||||
|
||||
// Data Going to Memory
|
||||
assign MWriteData[31:24] = (Byte) ? DataIn[7:0] : ((Half) ? DataIn[15:8] : DataIn[31:24]);
|
||||
assign MWriteData[23:16] = (Byte | Half) ? DataIn[7:0] : DataIn[23:16];
|
||||
assign MWriteData[15:8] = (Byte) ? DataIn[7:0] : DataIn[15:8];
|
||||
assign MWriteData[7:0] = DataIn[7:0];
|
||||
|
||||
// Data Read from Memory
|
||||
always @(*) begin
|
||||
if (Byte) begin
|
||||
if (Byte_Access_LL) begin
|
||||
DataOut <= (SignExtend & MReadData[31]) ? {24'hFFFFFF, MReadData[31:24]} : {24'h000000, MReadData[31:24]};
|
||||
end
|
||||
else if (Byte_Access_LM) begin
|
||||
DataOut <= (SignExtend & MReadData[23]) ? {24'hFFFFFF, MReadData[23:16]} : {24'h000000, MReadData[23:16]};
|
||||
end
|
||||
else if (Byte_Access_RM) begin
|
||||
DataOut <= (SignExtend & MReadData[15]) ? {24'hFFFFFF, MReadData[15:8]} : {24'h000000, MReadData[15:8]};
|
||||
end
|
||||
else begin
|
||||
DataOut <= (SignExtend & MReadData[7]) ? {24'hFFFFFF, MReadData[7:0]} : {24'h000000, MReadData[7:0]};
|
||||
end
|
||||
end
|
||||
else if (Half) begin
|
||||
if (Half_Access_L) begin
|
||||
DataOut <= (SignExtend & MReadData[31]) ? {16'hFFFF, MReadData[31:16]} : {16'h0000, MReadData[31:16]};
|
||||
end
|
||||
else begin
|
||||
DataOut <= (SignExtend & MReadData[15]) ? {16'hFFFF, MReadData[15:0]} : {16'h0000, MReadData[15:0]};
|
||||
end
|
||||
end
|
||||
else if (LLSC & MemWrite) begin
|
||||
DataOut <= (LLSC_Atomic & (Address[31:2] == LLSC_Address)) ? 32'h0000_0001 : 32'h0000_0000;
|
||||
end
|
||||
else if (Left) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : DataOut <= (BE) ? MReadData : {MReadData[7:0], DataIn[23:0]};
|
||||
2'b01 : DataOut <= (BE) ? {MReadData[23:0], DataIn[7:0]} : {MReadData[15:0], DataIn[15:0]};
|
||||
2'b10 : DataOut <= (BE) ? {MReadData[15:0], DataIn[15:0]} : {MReadData[23:0], DataIn[7:0]};
|
||||
2'b11 : DataOut <= (BE) ? {MReadData[7:0], DataIn[23:0]} : MReadData;
|
||||
endcase
|
||||
end
|
||||
else if (Right) begin
|
||||
case (Address[1:0])
|
||||
2'b00 : DataOut <= (BE) ? {DataIn[31:8], MReadData[31:24]} : MReadData;
|
||||
2'b01 : DataOut <= (BE) ? {DataIn[31:16], MReadData[31:16]} : {DataIn[31:24], MReadData[31:8]};
|
||||
2'b10 : DataOut <= (BE) ? {DataIn[31:24], MReadData[31:8]} : {DataIn[31:16], MReadData[31:16]};
|
||||
2'b11 : DataOut <= (BE) ? MReadData : {DataIn[31:8], MReadData[31:24]};
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
DataOut <= MReadData;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+679
@@ -0,0 +1,679 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Processor.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 23-Jul-2011 GEA Initial design.
|
||||
* 2.0 26-May-2012 GEA Release version with CP0.
|
||||
* 2.01 1-Nov-2012 GEA Fixed issue with Jal.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The top-level MIPS32 Processor. This file is mostly the instantiation
|
||||
* and wiring of the building blocks of the processor according to the
|
||||
* hardware design diagram. It contains very little logic itself.
|
||||
*/
|
||||
module Processor(
|
||||
input clock,
|
||||
input reset,
|
||||
input [4:0] Interrupts, // 5 general-purpose hardware interrupts
|
||||
input NMI, // Non-maskable interrupt
|
||||
// Data Memory Interface
|
||||
input [31:0] DataMem_In,
|
||||
input DataMem_Ready,
|
||||
output DataMem_Read,
|
||||
output [3:0] DataMem_Write, // 4-bit Write, one for each byte in word.
|
||||
output [29:0] DataMem_Address, // Addresses are words, not bytes.
|
||||
output [31:0] DataMem_Out,
|
||||
// Instruction Memory Interface
|
||||
input [31:0] InstMem_In,
|
||||
output [29:0] InstMem_Address, // Addresses are words, not bytes.
|
||||
input InstMem_Ready,
|
||||
output InstMem_Read,
|
||||
output [7:0] IP // Pending interrupts (diagnostic)
|
||||
);
|
||||
|
||||
`include "MIPS_Parameters.v"
|
||||
|
||||
|
||||
/*** MIPS Instruction and Components (ID Stage) ***/
|
||||
wire [31:0] Instruction;
|
||||
wire [5:0] OpCode = Instruction[31:26];
|
||||
wire [4:0] Rs = Instruction[25:21];
|
||||
wire [4:0] Rt = Instruction[20:16];
|
||||
wire [4:0] Rd = Instruction[15:11];
|
||||
wire [5:0] Funct = Instruction[5:0];
|
||||
wire [15:0] Immediate = Instruction[15:0];
|
||||
wire [25:0] JumpAddress = Instruction[25:0];
|
||||
wire [2:0] Cp0_Sel = Instruction[2:0];
|
||||
|
||||
/*** IF (Instruction Fetch) Signals ***/
|
||||
wire IF_Stall, IF_Flush;
|
||||
wire IF_EXC_AdIF;
|
||||
wire IF_Exception_Stall;
|
||||
wire IF_Exception_Flush;
|
||||
wire IF_IsBDS;
|
||||
wire [31:0] IF_PCAdd4, IF_PC_PreExc, IF_PCIn, IF_PCOut, IF_Instruction;
|
||||
|
||||
/*** ID (Instruction Decode) Signals ***/
|
||||
wire ID_Stall;
|
||||
wire [1:0] ID_PCSrc;
|
||||
wire [1:0] ID_RsFwdSel, ID_RtFwdSel;
|
||||
wire ID_Link, ID_Movn, ID_Movz;
|
||||
wire ID_SignExtend;
|
||||
wire ID_LLSC;
|
||||
wire ID_RegDst, ID_ALUSrcImm, ID_MemWrite, ID_MemRead, ID_MemByte, ID_MemHalf, ID_MemSignExtend, ID_RegWrite, ID_MemtoReg;
|
||||
wire [4:0] ID_ALUOp;
|
||||
wire ID_Mfc0, ID_Mtc0, ID_Eret;
|
||||
wire ID_NextIsDelay;
|
||||
wire ID_CanErr, ID_ID_CanErr, ID_EX_CanErr, ID_M_CanErr;
|
||||
wire ID_KernelMode;
|
||||
wire ID_ReverseEndian;
|
||||
wire ID_Trap, ID_TrapCond;
|
||||
wire ID_EXC_Sys, ID_EXC_Bp, ID_EXC_RI;
|
||||
wire ID_Exception_Stall;
|
||||
wire ID_Exception_Flush;
|
||||
wire ID_PCSrc_Exc;
|
||||
wire [31:0] ID_ExceptionPC;
|
||||
wire ID_CP1, ID_CP2, ID_CP3;
|
||||
wire [31:0] ID_PCAdd4;
|
||||
wire [31:0] ID_ReadData1_RF, ID_ReadData1_End;
|
||||
wire [31:0] ID_ReadData2_RF, ID_ReadData2_End;
|
||||
wire [31:0] CP0_RegOut;
|
||||
wire ID_CmpEQ, ID_CmpGZ, ID_CmpLZ, ID_CmpGEZ, ID_CmpLEZ;
|
||||
wire [29:0] ID_SignExtImm = (ID_SignExtend & Immediate[15]) ? {14'h3FFF, Immediate} : {14'h0000, Immediate};
|
||||
wire [31:0] ID_ImmLeftShift2 = {ID_SignExtImm[29:0], 2'b00};
|
||||
wire [31:0] ID_JumpAddress = {ID_PCAdd4[31:28], JumpAddress[25:0], 2'b00};
|
||||
wire [31:0] ID_BranchAddress;
|
||||
wire [31:0] ID_RestartPC;
|
||||
wire ID_IsBDS;
|
||||
wire ID_Left, ID_Right;
|
||||
wire ID_IsFlushed;
|
||||
|
||||
/*** EX (Execute) Signals ***/
|
||||
wire EX_ALU_Stall, EX_Stall;
|
||||
wire [1:0] EX_RsFwdSel, EX_RtFwdSel;
|
||||
wire EX_Link;
|
||||
wire [1:0] EX_LinkRegDst;
|
||||
wire EX_ALUSrcImm;
|
||||
wire [4:0] EX_ALUOp;
|
||||
wire EX_Movn, EX_Movz;
|
||||
wire EX_LLSC;
|
||||
wire EX_MemRead, EX_MemWrite, EX_MemByte, EX_MemHalf, EX_MemSignExtend, EX_RegWrite, EX_MemtoReg;
|
||||
wire [4:0] EX_Rs, EX_Rt;
|
||||
wire EX_WantRsByEX, EX_NeedRsByEX, EX_WantRtByEX, EX_NeedRtByEX;
|
||||
wire EX_Trap, EX_TrapCond;
|
||||
wire EX_CanErr, EX_EX_CanErr, EX_M_CanErr;
|
||||
wire EX_KernelMode;
|
||||
wire EX_ReverseEndian;
|
||||
wire EX_Exception_Stall;
|
||||
wire EX_Exception_Flush;
|
||||
wire [31:0] EX_ReadData1_PR, EX_ReadData1_Fwd, EX_ReadData2_PR, EX_ReadData2_Fwd, EX_ReadData2_Imm;
|
||||
wire [31:0] EX_SignExtImm;
|
||||
wire [4:0] EX_Rd, EX_RtRd, EX_Shamt;
|
||||
wire [31:0] EX_ALUResult;
|
||||
wire EX_BZero;
|
||||
wire EX_EXC_Ov;
|
||||
wire [31:0] EX_RestartPC;
|
||||
wire EX_IsBDS;
|
||||
wire EX_Left, EX_Right;
|
||||
|
||||
/*** MEM (Memory) Signals ***/
|
||||
wire M_Stall, M_Stall_Controller;
|
||||
wire M_LLSC;
|
||||
wire M_MemRead, M_MemWrite, M_MemByte, M_MemHalf, M_MemSignExtend;
|
||||
wire M_RegWrite, M_MemtoReg;
|
||||
wire M_WriteDataFwdSel;
|
||||
wire M_EXC_AdEL, M_EXC_AdES;
|
||||
wire M_M_CanErr;
|
||||
wire M_KernelMode;
|
||||
wire M_ReverseEndian;
|
||||
wire M_Trap, M_TrapCond;
|
||||
wire M_EXC_Tr;
|
||||
wire M_Exception_Flush;
|
||||
wire [31:0] M_ALUResult, M_ReadData2_PR;
|
||||
wire [4:0] M_RtRd;
|
||||
wire [31:0] M_MemReadData;
|
||||
wire [31:0] M_RestartPC;
|
||||
wire M_IsBDS;
|
||||
wire [31:0] M_WriteData_Pre;
|
||||
wire M_Left, M_Right;
|
||||
wire M_Exception_Stall;
|
||||
|
||||
/*** WB (Writeback) Signals ***/
|
||||
wire WB_Stall, WB_RegWrite;
|
||||
wire [31:0] WB_ReadData, WB_ALUResult;
|
||||
wire [4:0] WB_RtRd;
|
||||
wire [31:0] WB_WriteData;
|
||||
|
||||
/*** Other Signals ***/
|
||||
wire [7:0] ID_DP_Hazards, HAZ_DP_Hazards;
|
||||
|
||||
/*** Assignments ***/
|
||||
assign IF_Instruction = (IF_Stall) ? 32'h00000000 : InstMem_In;
|
||||
assign IF_IsBDS = ID_NextIsDelay;
|
||||
assign HAZ_DP_Hazards = {ID_DP_Hazards[7:4], EX_WantRsByEX, EX_NeedRsByEX, EX_WantRtByEX, EX_NeedRtByEX};
|
||||
assign IF_EXC_AdIF = IF_PCOut[1] | IF_PCOut[0];
|
||||
assign ID_CanErr = ID_ID_CanErr | ID_EX_CanErr | ID_M_CanErr;
|
||||
assign EX_CanErr = EX_EX_CanErr | EX_M_CanErr;
|
||||
assign M_CanErr = M_M_CanErr;
|
||||
|
||||
// External Memory Interface
|
||||
reg IRead, IReadMask;
|
||||
assign InstMem_Address = IF_PCOut[31:2];
|
||||
assign DataMem_Address = M_ALUResult[31:2];
|
||||
always @(posedge clock) begin
|
||||
IRead <= (reset) ? 1 : ~InstMem_Ready;
|
||||
IReadMask <= (reset) ? 0 : ((IRead & InstMem_Ready) ? 1 : ((~IF_Stall) ? 0 : IReadMask));
|
||||
end
|
||||
assign InstMem_Read = IRead & ~IReadMask;
|
||||
|
||||
|
||||
/*** Datapath Controller ***/
|
||||
Control Controller (
|
||||
.ID_Stall (ID_Stall),
|
||||
.OpCode (OpCode),
|
||||
.Funct (Funct),
|
||||
.Rs (Rs),
|
||||
.Rt (Rt),
|
||||
.Cmp_EQ (ID_CmpEQ),
|
||||
.Cmp_GZ (ID_CmpGZ),
|
||||
.Cmp_GEZ (ID_CmpGEZ),
|
||||
.Cmp_LZ (ID_CmpLZ),
|
||||
.Cmp_LEZ (ID_CmpLEZ),
|
||||
.IF_Flush (IF_Flush),
|
||||
.DP_Hazards (ID_DP_Hazards),
|
||||
.PCSrc (ID_PCSrc),
|
||||
.SignExtend (ID_SignExtend),
|
||||
.Link (ID_Link),
|
||||
.Movn (ID_Movn),
|
||||
.Movz (ID_Movz),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.Mtc0 (ID_Mtc0),
|
||||
.CP1 (ID_CP1),
|
||||
.CP2 (ID_CP2),
|
||||
.CP3 (ID_CP3),
|
||||
.Eret (ID_Eret),
|
||||
.Trap (ID_Trap),
|
||||
.TrapCond (ID_TrapCond),
|
||||
.EXC_Sys (ID_EXC_Sys),
|
||||
.EXC_Bp (ID_EXC_Bp),
|
||||
.EXC_RI (ID_EXC_RI),
|
||||
.ID_CanErr (ID_ID_CanErr),
|
||||
.EX_CanErr (ID_EX_CanErr),
|
||||
.M_CanErr (ID_M_CanErr),
|
||||
.NextIsDelay (ID_NextIsDelay),
|
||||
.RegDst (ID_RegDst),
|
||||
.ALUSrcImm (ID_ALUSrcImm),
|
||||
.ALUOp (ID_ALUOp),
|
||||
.LLSC (ID_LLSC),
|
||||
.MemWrite (ID_MemWrite),
|
||||
.MemRead (ID_MemRead),
|
||||
.MemByte (ID_MemByte),
|
||||
.MemHalf (ID_MemHalf),
|
||||
.MemSignExtend (ID_MemSignExtend),
|
||||
.Left (ID_Left),
|
||||
.Right (ID_Right),
|
||||
.RegWrite (ID_RegWrite),
|
||||
.MemtoReg (ID_MemtoReg)
|
||||
);
|
||||
|
||||
/*** Hazard and Forward Control Unit ***/
|
||||
Hazard_Detection HazardControl (
|
||||
.DP_Hazards (HAZ_DP_Hazards),
|
||||
.ID_Rs (Rs),
|
||||
.ID_Rt (Rt),
|
||||
.EX_Rs (EX_Rs),
|
||||
.EX_Rt (EX_Rt),
|
||||
.EX_RtRd (EX_RtRd),
|
||||
.MEM_RtRd (M_RtRd),
|
||||
.WB_RtRd (WB_RtRd),
|
||||
.EX_Link (EX_Link),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.MEM_RegWrite (M_RegWrite),
|
||||
.WB_RegWrite (WB_RegWrite),
|
||||
.MEM_MemRead (M_MemRead),
|
||||
.MEM_MemWrite (M_MemWrite),
|
||||
.InstMem_Read (InstMem_Read),
|
||||
.InstMem_Ready (InstMem_Ready),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.IF_Exception_Stall (IF_Exception_Stall),
|
||||
.ID_Exception_Stall (ID_Exception_Stall),
|
||||
.EX_Exception_Stall (EX_Exception_Stall),
|
||||
.EX_ALU_Stall (EX_ALU_Stall),
|
||||
.M_Stall_Controller (M_Stall_Controller),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.EX_Stall (EX_Stall),
|
||||
.M_Stall (M_Stall),
|
||||
.WB_Stall (WB_Stall),
|
||||
.ID_RsFwdSel (ID_RsFwdSel),
|
||||
.ID_RtFwdSel (ID_RtFwdSel),
|
||||
.EX_RsFwdSel (EX_RsFwdSel),
|
||||
.EX_RtFwdSel (EX_RtFwdSel),
|
||||
.M_WriteDataFwdSel (M_WriteDataFwdSel)
|
||||
);
|
||||
|
||||
/*** Coprocessor 0: Exceptions and Interrupts ***/
|
||||
CPZero CP0 (
|
||||
.clock (clock),
|
||||
.Mfc0 (ID_Mfc0),
|
||||
.Mtc0 (ID_Mtc0),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.COP1 (ID_CP1),
|
||||
.COP2 (ID_CP2),
|
||||
.COP3 (ID_CP3),
|
||||
.ERET (ID_Eret),
|
||||
.Rd (Rd),
|
||||
.Sel (Cp0_Sel),
|
||||
.Reg_In (ID_ReadData2_End),
|
||||
.Reg_Out (CP0_RegOut),
|
||||
.KernelMode (ID_KernelMode),
|
||||
.ReverseEndian (ID_ReverseEndian),
|
||||
.Int (Interrupts),
|
||||
.reset (reset),
|
||||
.EXC_NMI (NMI),
|
||||
.EXC_AdIF (IF_EXC_AdIF),
|
||||
.EXC_AdEL (M_EXC_AdEL),
|
||||
.EXC_AdES (M_EXC_AdES),
|
||||
.EXC_Ov (EX_EXC_Ov),
|
||||
.EXC_Tr (M_EXC_Tr),
|
||||
.EXC_Sys (ID_EXC_Sys),
|
||||
.EXC_Bp (ID_EXC_Bp),
|
||||
.EXC_RI (ID_EXC_RI),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.M_RestartPC (M_RestartPC),
|
||||
.ID_IsFlushed (ID_IsFlushed),
|
||||
.IF_IsBD (IF_IsBDS),
|
||||
.ID_IsBD (ID_IsBDS),
|
||||
.EX_IsBD (EX_IsBDS),
|
||||
.M_IsBD (M_IsBDS),
|
||||
.BadAddr_M (M_ALUResult),
|
||||
.BadAddr_IF (IF_PCOut),
|
||||
.ID_CanErr (ID_CanErr),
|
||||
.EX_CanErr (EX_CanErr),
|
||||
.M_CanErr (M_CanErr),
|
||||
.IF_Exception_Stall (IF_Exception_Stall),
|
||||
.ID_Exception_Stall (ID_Exception_Stall),
|
||||
.EX_Exception_Stall (EX_Exception_Stall),
|
||||
.M_Exception_Stall (M_Exception_Stall),
|
||||
.IF_Exception_Flush (IF_Exception_Flush),
|
||||
.ID_Exception_Flush (ID_Exception_Flush),
|
||||
.EX_Exception_Flush (EX_Exception_Flush),
|
||||
.M_Exception_Flush (M_Exception_Flush),
|
||||
.Exc_PC_Sel (ID_PCSrc_Exc),
|
||||
.Exc_PC_Out (ID_ExceptionPC),
|
||||
.IP (IP)
|
||||
);
|
||||
|
||||
/*** PC Source Non-Exception Mux ***/
|
||||
Mux4 #(.WIDTH(32)) PCSrcStd_Mux (
|
||||
.sel (ID_PCSrc),
|
||||
.in0 (IF_PCAdd4),
|
||||
.in1 (ID_JumpAddress),
|
||||
.in2 (ID_BranchAddress),
|
||||
.in3 (ID_ReadData1_End),
|
||||
.out (IF_PC_PreExc)
|
||||
);
|
||||
|
||||
/*** PC Source Exception Mux ***/
|
||||
Mux2 #(.WIDTH(32)) PCSrcExc_Mux (
|
||||
.sel (ID_PCSrc_Exc),
|
||||
.in0 (IF_PC_PreExc),
|
||||
.in1 (ID_ExceptionPC),
|
||||
.out (IF_PCIn)
|
||||
);
|
||||
|
||||
/*** Program Counter (MIPS spec is 0xBFC00000 starting address) ***/
|
||||
Register #(.WIDTH(32), .INIT(EXC_Vector_Base_Reset)) PC (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
//.enable (~IF_Stall), // XXX verify. HERE. Was 1 but on stall latches PC+4, ad nauseum.
|
||||
.enable (~(IF_Stall | ID_Stall)),
|
||||
.D (IF_PCIn),
|
||||
.Q (IF_PCOut)
|
||||
);
|
||||
|
||||
/*** PC +4 Adder ***/
|
||||
Add PC_Add4 (
|
||||
.A (IF_PCOut),
|
||||
.B (32'h00000004),
|
||||
.C (IF_PCAdd4)
|
||||
);
|
||||
|
||||
/*** Instruction Fetch -> Instruction Decode Stage Register ***/
|
||||
IFID_Stage IFID (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.IF_Flush (IF_Exception_Flush | IF_Flush),
|
||||
.IF_Stall (IF_Stall),
|
||||
.ID_Stall (ID_Stall),
|
||||
.IF_Instruction (IF_Instruction),
|
||||
.IF_PCAdd4 (IF_PCAdd4),
|
||||
.IF_PC (IF_PCOut),
|
||||
.IF_IsBDS (IF_IsBDS),
|
||||
.ID_Instruction (Instruction),
|
||||
.ID_PCAdd4 (ID_PCAdd4),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.ID_IsBDS (ID_IsBDS),
|
||||
.ID_IsFlushed (ID_IsFlushed)
|
||||
);
|
||||
|
||||
/*** Register File ***/
|
||||
RegisterFile RegisterFile (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.ReadReg1 (Rs),
|
||||
.ReadReg2 (Rt),
|
||||
.WriteReg (WB_RtRd),
|
||||
.WriteData (WB_WriteData),
|
||||
.RegWrite (WB_RegWrite),
|
||||
.ReadData1 (ID_ReadData1_RF),
|
||||
.ReadData2 (ID_ReadData2_RF)
|
||||
);
|
||||
|
||||
/*** ID Rs Forwarding/Link Mux ***/
|
||||
Mux4 #(.WIDTH(32)) IDRsFwd_Mux (
|
||||
.sel (ID_RsFwdSel),
|
||||
.in0 (ID_ReadData1_RF),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (32'hxxxxxxxx),
|
||||
.out (ID_ReadData1_End)
|
||||
);
|
||||
|
||||
/*** ID Rt Forwarding/CP0 Mfc0 Mux ***/
|
||||
Mux4 #(.WIDTH(32)) IDRtFwd_Mux (
|
||||
.sel (ID_RtFwdSel),
|
||||
.in0 (ID_ReadData2_RF),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (CP0_RegOut),
|
||||
.out (ID_ReadData2_End)
|
||||
);
|
||||
|
||||
/*** Condition Compare Unit ***/
|
||||
Compare Compare (
|
||||
.A (ID_ReadData1_End),
|
||||
.B (ID_ReadData2_End),
|
||||
.EQ (ID_CmpEQ),
|
||||
.GZ (ID_CmpGZ),
|
||||
.LZ (ID_CmpLZ),
|
||||
.GEZ (ID_CmpGEZ),
|
||||
.LEZ (ID_CmpLEZ)
|
||||
);
|
||||
|
||||
/*** Branch Address Adder ***/
|
||||
Add BranchAddress_Add (
|
||||
.A (ID_PCAdd4),
|
||||
.B (ID_ImmLeftShift2),
|
||||
.C (ID_BranchAddress)
|
||||
);
|
||||
|
||||
/*** Instruction Decode -> Execute Pipeline Stage ***/
|
||||
IDEX_Stage IDEX (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.ID_Flush (ID_Exception_Flush),
|
||||
.ID_Stall (ID_Stall),
|
||||
.EX_Stall (EX_Stall),
|
||||
.ID_Link (ID_Link),
|
||||
.ID_RegDst (ID_RegDst),
|
||||
.ID_ALUSrcImm (ID_ALUSrcImm),
|
||||
.ID_ALUOp (ID_ALUOp),
|
||||
.ID_Movn (ID_Movn),
|
||||
.ID_Movz (ID_Movz),
|
||||
.ID_LLSC (ID_LLSC),
|
||||
.ID_MemRead (ID_MemRead),
|
||||
.ID_MemWrite (ID_MemWrite),
|
||||
.ID_MemByte (ID_MemByte),
|
||||
.ID_MemHalf (ID_MemHalf),
|
||||
.ID_MemSignExtend (ID_MemSignExtend),
|
||||
.ID_Left (ID_Left),
|
||||
.ID_Right (ID_Right),
|
||||
.ID_RegWrite (ID_RegWrite),
|
||||
.ID_MemtoReg (ID_MemtoReg),
|
||||
.ID_ReverseEndian (ID_ReverseEndian),
|
||||
.ID_Rs (Rs),
|
||||
.ID_Rt (Rt),
|
||||
.ID_WantRsByEX (ID_DP_Hazards[3]),
|
||||
.ID_NeedRsByEX (ID_DP_Hazards[2]),
|
||||
.ID_WantRtByEX (ID_DP_Hazards[1]),
|
||||
.ID_NeedRtByEX (ID_DP_Hazards[0]),
|
||||
.ID_KernelMode (ID_KernelMode),
|
||||
.ID_RestartPC (ID_RestartPC),
|
||||
.ID_IsBDS (ID_IsBDS),
|
||||
.ID_Trap (ID_Trap),
|
||||
.ID_TrapCond (ID_TrapCond),
|
||||
.ID_EX_CanErr (ID_EX_CanErr),
|
||||
.ID_M_CanErr (ID_M_CanErr),
|
||||
.ID_ReadData1 (ID_ReadData1_End),
|
||||
.ID_ReadData2 (ID_ReadData2_End),
|
||||
.ID_SignExtImm (ID_SignExtImm[16:0]),
|
||||
.EX_Link (EX_Link),
|
||||
.EX_LinkRegDst (EX_LinkRegDst),
|
||||
.EX_ALUSrcImm (EX_ALUSrcImm),
|
||||
.EX_ALUOp (EX_ALUOp),
|
||||
.EX_Movn (EX_Movn),
|
||||
.EX_Movz (EX_Movz),
|
||||
.EX_LLSC (EX_LLSC),
|
||||
.EX_MemRead (EX_MemRead),
|
||||
.EX_MemWrite (EX_MemWrite),
|
||||
.EX_MemByte (EX_MemByte),
|
||||
.EX_MemHalf (EX_MemHalf),
|
||||
.EX_MemSignExtend (EX_MemSignExtend),
|
||||
.EX_Left (EX_Left),
|
||||
.EX_Right (EX_Right),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.EX_MemtoReg (EX_MemtoReg),
|
||||
.EX_ReverseEndian (EX_ReverseEndian),
|
||||
.EX_Rs (EX_Rs),
|
||||
.EX_Rt (EX_Rt),
|
||||
.EX_WantRsByEX (EX_WantRsByEX),
|
||||
.EX_NeedRsByEX (EX_NeedRsByEX),
|
||||
.EX_WantRtByEX (EX_WantRtByEX),
|
||||
.EX_NeedRtByEX (EX_NeedRtByEX),
|
||||
.EX_KernelMode (EX_KernelMode),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.EX_IsBDS (EX_IsBDS),
|
||||
.EX_Trap (EX_Trap),
|
||||
.EX_TrapCond (EX_TrapCond),
|
||||
.EX_EX_CanErr (EX_EX_CanErr),
|
||||
.EX_M_CanErr (EX_M_CanErr),
|
||||
.EX_ReadData1 (EX_ReadData1_PR),
|
||||
.EX_ReadData2 (EX_ReadData2_PR),
|
||||
.EX_SignExtImm (EX_SignExtImm),
|
||||
.EX_Rd (EX_Rd),
|
||||
.EX_Shamt (EX_Shamt)
|
||||
);
|
||||
|
||||
/*** EX Rs Forwarding Mux ***/
|
||||
Mux4 #(.WIDTH(32)) EXRsFwd_Mux (
|
||||
.sel (EX_RsFwdSel),
|
||||
.in0 (EX_ReadData1_PR),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (EX_RestartPC),
|
||||
.out (EX_ReadData1_Fwd)
|
||||
);
|
||||
|
||||
/*** EX Rt Forwarding / Link Mux ***/
|
||||
Mux4 #(.WIDTH(32)) EXRtFwdLnk_Mux (
|
||||
.sel (EX_RtFwdSel),
|
||||
.in0 (EX_ReadData2_PR),
|
||||
.in1 (M_ALUResult),
|
||||
.in2 (WB_WriteData),
|
||||
.in3 (32'h00000008),
|
||||
.out (EX_ReadData2_Fwd)
|
||||
);
|
||||
|
||||
/*** EX ALU Immediate Mux ***/
|
||||
Mux2 #(.WIDTH(32)) EXALUImm_Mux (
|
||||
.sel (EX_ALUSrcImm),
|
||||
.in0 (EX_ReadData2_Fwd),
|
||||
.in1 (EX_SignExtImm),
|
||||
.out (EX_ReadData2_Imm)
|
||||
);
|
||||
|
||||
/*** EX RtRd / Link Mux ***/
|
||||
Mux4 #(.WIDTH(5)) EXRtRdLnk_Mux (
|
||||
.sel (EX_LinkRegDst),
|
||||
.in0 (EX_Rt),
|
||||
.in1 (EX_Rd),
|
||||
.in2 (5'b11111),
|
||||
.in3 (5'bxxxxx),
|
||||
.out (EX_RtRd)
|
||||
);
|
||||
|
||||
/*** Arithmetic Logic Unit ***/
|
||||
ALU ALU (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.EX_Stall (EX_Stall),
|
||||
.EX_Flush (EX_Exception_Flush),
|
||||
.A (EX_ReadData1_Fwd),
|
||||
.B (EX_ReadData2_Imm),
|
||||
.Operation (EX_ALUOp),
|
||||
.Shamt (EX_Shamt),
|
||||
.Result (EX_ALUResult),
|
||||
.BZero (EX_BZero),
|
||||
.EXC_Ov (EX_EXC_Ov),
|
||||
.ALU_Stall (EX_ALU_Stall)
|
||||
);
|
||||
|
||||
/*** Execute -> Memory Pipeline Stage ***/
|
||||
EXMEM_Stage EXMEM (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.EX_Flush (EX_Exception_Flush),
|
||||
.EX_Stall (EX_Stall),
|
||||
.M_Stall (M_Stall),
|
||||
.EX_Movn (EX_Movn),
|
||||
.EX_Movz (EX_Movz),
|
||||
.EX_BZero (EX_BZero),
|
||||
.EX_RegWrite (EX_RegWrite),
|
||||
.EX_MemtoReg (EX_MemtoReg),
|
||||
.EX_ReverseEndian (EX_ReverseEndian),
|
||||
.EX_LLSC (EX_LLSC),
|
||||
.EX_MemRead (EX_MemRead),
|
||||
.EX_MemWrite (EX_MemWrite),
|
||||
.EX_MemByte (EX_MemByte),
|
||||
.EX_MemHalf (EX_MemHalf),
|
||||
.EX_MemSignExtend (EX_MemSignExtend),
|
||||
.EX_Left (EX_Left),
|
||||
.EX_Right (EX_Right),
|
||||
.EX_KernelMode (EX_KernelMode),
|
||||
.EX_RestartPC (EX_RestartPC),
|
||||
.EX_IsBDS (EX_IsBDS),
|
||||
.EX_Trap (EX_Trap),
|
||||
.EX_TrapCond (EX_TrapCond),
|
||||
.EX_M_CanErr (EX_M_CanErr),
|
||||
.EX_ALU_Result (EX_ALUResult),
|
||||
.EX_ReadData2 (EX_ReadData2_Fwd),
|
||||
.EX_RtRd (EX_RtRd),
|
||||
.M_RegWrite (M_RegWrite),
|
||||
.M_MemtoReg (M_MemtoReg),
|
||||
.M_ReverseEndian (M_ReverseEndian),
|
||||
.M_LLSC (M_LLSC),
|
||||
.M_MemRead (M_MemRead),
|
||||
.M_MemWrite (M_MemWrite),
|
||||
.M_MemByte (M_MemByte),
|
||||
.M_MemHalf (M_MemHalf),
|
||||
.M_MemSignExtend (M_MemSignExtend),
|
||||
.M_Left (M_Left),
|
||||
.M_Right (M_Right),
|
||||
.M_KernelMode (M_KernelMode),
|
||||
.M_RestartPC (M_RestartPC),
|
||||
.M_IsBDS (M_IsBDS),
|
||||
.M_Trap (M_Trap),
|
||||
.M_TrapCond (M_TrapCond),
|
||||
.M_M_CanErr (M_M_CanErr),
|
||||
.M_ALU_Result (M_ALUResult),
|
||||
.M_ReadData2 (M_ReadData2_PR),
|
||||
.M_RtRd (M_RtRd)
|
||||
);
|
||||
|
||||
/*** Trap Detection Unit ***/
|
||||
TrapDetect TrapDetect (
|
||||
.Trap (M_Trap),
|
||||
.TrapCond (M_TrapCond),
|
||||
.ALUResult (M_ALUResult),
|
||||
.EXC_Tr (M_EXC_Tr)
|
||||
);
|
||||
|
||||
/*** MEM Write Data Mux ***/
|
||||
Mux2 #(.WIDTH(32)) MWriteData_Mux (
|
||||
.sel (M_WriteDataFwdSel),
|
||||
.in0 (M_ReadData2_PR),
|
||||
.in1 (WB_WriteData),
|
||||
.out (M_WriteData_Pre)
|
||||
);
|
||||
|
||||
/*** Data Memory Controller ***/
|
||||
MemControl DataMem_Controller (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.DataIn (M_WriteData_Pre),
|
||||
.Address (M_ALUResult),
|
||||
.MReadData (DataMem_In),
|
||||
.MemRead (M_MemRead),
|
||||
.MemWrite (M_MemWrite),
|
||||
.DataMem_Ready (DataMem_Ready),
|
||||
.Byte (M_MemByte),
|
||||
.Half (M_MemHalf),
|
||||
.SignExtend (M_MemSignExtend),
|
||||
.KernelMode (M_KernelMode),
|
||||
.ReverseEndian (M_ReverseEndian),
|
||||
.LLSC (M_LLSC),
|
||||
.ERET (ID_Eret),
|
||||
.Left (M_Left),
|
||||
.Right (M_Right),
|
||||
.M_Exception_Stall (M_Exception_Stall),
|
||||
|
||||
.IF_Stall (IF_Stall),
|
||||
|
||||
.DataOut (M_MemReadData),
|
||||
.MWriteData (DataMem_Out),
|
||||
.WriteEnable (DataMem_Write),
|
||||
.ReadEnable (DataMem_Read),
|
||||
.M_Stall (M_Stall_Controller),
|
||||
.EXC_AdEL (M_EXC_AdEL),
|
||||
.EXC_AdES (M_EXC_AdES)
|
||||
);
|
||||
|
||||
/*** Memory -> Writeback Pipeline Stage ***/
|
||||
MEMWB_Stage MEMWB (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.M_Flush (M_Exception_Flush),
|
||||
.M_Stall (M_Stall),
|
||||
.WB_Stall (WB_Stall),
|
||||
.M_RegWrite (M_RegWrite),
|
||||
.M_MemtoReg (M_MemtoReg),
|
||||
.M_ReadData (M_MemReadData),
|
||||
.M_ALU_Result (M_ALUResult),
|
||||
.M_RtRd (M_RtRd),
|
||||
.WB_RegWrite (WB_RegWrite),
|
||||
.WB_MemtoReg (WB_MemtoReg),
|
||||
.WB_ReadData (WB_ReadData),
|
||||
.WB_ALU_Result (WB_ALUResult),
|
||||
.WB_RtRd (WB_RtRd)
|
||||
);
|
||||
|
||||
/*** WB MemtoReg Mux ***/
|
||||
Mux2 #(.WIDTH(32)) WBMemtoReg_Mux (
|
||||
.sel (WB_MemtoReg),
|
||||
.in0 (WB_ALUResult),
|
||||
.in1 (WB_ReadData),
|
||||
.out (WB_WriteData)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
demo_chip_rtl/rtl/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src/MIPS32/Register.v
Executable
+34
@@ -0,0 +1,34 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Register.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A variable-width register (d flip-flop) with configurable initial
|
||||
* value. Default is 32-bit width and 0s for initial value.
|
||||
*/
|
||||
module Register #(parameter WIDTH = 32, INIT = 0)(
|
||||
input clock,
|
||||
input reset,
|
||||
input enable,
|
||||
input [(WIDTH-1):0] D,
|
||||
output reg [(WIDTH-1):0] Q
|
||||
);
|
||||
|
||||
initial
|
||||
Q = INIT;
|
||||
|
||||
always @(posedge clock) begin
|
||||
Q <= (reset) ? INIT : ((enable) ? D : Q);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : RegisterFile.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 7-Jun-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A Register File for a MIPS processor. Contains 32 general-purpose
|
||||
* 32-bit wide registers and two read ports. Register 0 always reads
|
||||
* as zero.
|
||||
*/
|
||||
module RegisterFile(
|
||||
input clock,
|
||||
input reset,
|
||||
input [4:0] ReadReg1, ReadReg2, WriteReg,
|
||||
input [31:0] WriteData,
|
||||
input RegWrite,
|
||||
output [31:0] ReadData1, ReadData2
|
||||
);
|
||||
|
||||
// Register file of 32 32-bit registers. Register 0 is hardwired to 0s
|
||||
reg [31:0] registers [1:31];
|
||||
|
||||
// Initialize all to zero
|
||||
integer i;
|
||||
initial begin
|
||||
for (i=1; i<32; i=i+1) begin
|
||||
registers[i] <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
// Sequential (clocked) write.
|
||||
// 'WriteReg' is the register index to write. 'RegWrite' is the command.
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
for (i=1; i<32; i=i+1) begin
|
||||
registers[i] <= 0;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
if (WriteReg != 0)
|
||||
registers[WriteReg] <= (RegWrite) ? WriteData : registers[WriteReg];
|
||||
end
|
||||
end
|
||||
|
||||
// Combinatorial Read. Register 0 is all 0s.
|
||||
assign ReadData1 = (ReadReg1 == 0) ? 32'h00000000 : registers[ReadReg1];
|
||||
assign ReadData2 = (ReadReg2 == 0) ? 32'h00000000 : registers[ReadReg2];
|
||||
|
||||
endmodule
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : TrapDetect.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 15-May-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Detects a Trap Exception in the pipeline.
|
||||
*/
|
||||
module TrapDetect(
|
||||
input Trap,
|
||||
input TrapCond,
|
||||
input [31:0] ALUResult,
|
||||
output EXC_Tr
|
||||
);
|
||||
|
||||
wire ALUZero = (ALUResult == 32'h00000000);
|
||||
assign EXC_Tr = Trap & (TrapCond ^ ALUZero);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Piezo.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 11-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A sound driver for a piezo-electric transducer (or other
|
||||
* oscillating device). When enabled, the output oscillates
|
||||
* between high and low, switching at a rate determined by the
|
||||
* 'count' register and clock frequency. The output is enabled
|
||||
* when the highest bit is set on a Write.
|
||||
*/
|
||||
module Piezo_Driver(
|
||||
input clock,
|
||||
input reset,
|
||||
input [24:0] data,
|
||||
input Write,
|
||||
output reg Ack,
|
||||
output reg Piezo
|
||||
);
|
||||
|
||||
reg [23:0] count;
|
||||
reg [23:0] compare;
|
||||
reg enabled;
|
||||
|
||||
always @(posedge clock) begin
|
||||
count <= (reset | (count == compare)) ? 24'h000000 : count + 1;
|
||||
compare <= (reset) ? 24'h000000 : ((Write) ? data[23:0] : compare);
|
||||
enabled <= (reset) ? 0 : ((Write) ? data[24] : enabled);
|
||||
Piezo <= (reset | ~enabled) ? 0 : ((count == compare) ? ~Piezo : Piezo);
|
||||
Ack <= (reset) ? 0 : Write;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 12:38:44 09/10/2012
|
||||
// Design Name: Top
|
||||
// Module Name: C:/root/Work/Gauss/Final/Hardware/XUM_Singlecore/MIPS32-Pipelined-Hw/src/Simulation/Top_Tester.v
|
||||
// Project Name: MIPS32-Pipelined-Hw
|
||||
// Target Device:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
//
|
||||
// Verilog Test Fixture created by ISE for module: Top
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module Top_Tester;
|
||||
|
||||
// Inputs
|
||||
reg clock_100MHz;
|
||||
reg reset_n;
|
||||
reg [7:0] Switch;
|
||||
reg UART_Rx;
|
||||
|
||||
// Outputs
|
||||
wire [14:0] LED;
|
||||
wire [6:0] LCD;
|
||||
wire UART_Tx;
|
||||
wire Piezo;
|
||||
|
||||
// Bidirs
|
||||
wire i2c_scl;
|
||||
wire i2c_sda;
|
||||
|
||||
// Instantiate the Unit Under Test (UUT)
|
||||
Top uut (
|
||||
.clock_100MHz(clock_100MHz),
|
||||
.reset_n(reset_n),
|
||||
.Switch(Switch),
|
||||
.LED(LED),
|
||||
.LCD(LCD),
|
||||
.UART_Rx(UART_Rx),
|
||||
.UART_Tx(UART_Tx),
|
||||
.i2c_scl(i2c_scl),
|
||||
.i2c_sda(i2c_sda),
|
||||
.Piezo(Piezo)
|
||||
);
|
||||
integer i;
|
||||
|
||||
initial begin
|
||||
// Initialize Inputs
|
||||
clock_100MHz = 0;
|
||||
reset_n = 0;
|
||||
Switch = 0;
|
||||
UART_Rx = 0;
|
||||
|
||||
// Wait 100 ns for global reset to finish
|
||||
#100;
|
||||
|
||||
// Add stimulus here
|
||||
for (i=0; i<900000; i=i+1) begin
|
||||
reset_n = (i < 28) ? 0 : 1;
|
||||
clock_100MHz = ~clock_100MHz;
|
||||
if (i > 4000) Switch <= 8'h00;
|
||||
if (i > 100000) i = i - 1;
|
||||
#5;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
+609
@@ -0,0 +1,609 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wave_config>
|
||||
<wave_state>
|
||||
</wave_state>
|
||||
<db_ref_list>
|
||||
<db_ref path="C:/root/Work/Gauss/XUM/MIPS32-Pipelined-Hw/Top_Tester_isim_beh.wdb" id="1" type="auto">
|
||||
<top_modules>
|
||||
<top_module name="Top_Tester" />
|
||||
<top_module name="glbl" />
|
||||
</top_modules>
|
||||
</db_ref>
|
||||
</db_ref_list>
|
||||
<WVObjectSize size="33" />
|
||||
<wvobject fp_name="/Top_Tester/uut/clock" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">clock</obj_property>
|
||||
<obj_property name="ObjectShortName">clock</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/reset" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">reset</obj_property>
|
||||
<obj_property name="ObjectShortName">reset</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/IFID/ID_Instruction" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_Instruction[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_Instruction[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/ID_RestartPC" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group89" type="group">
|
||||
<obj_property name="label">Stages</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/IDEX/EX_RestartPC" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/EXMEM/M_RestartPC" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">M_RestartPC[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group92" type="group">
|
||||
<obj_property name="label">Forwards</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/ID_RsFwdSel" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_RsFwdSel[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_RsFwdSel[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/ID_RtFwdSel" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_RtFwdSel[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_RtFwdSel[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/EX_RsFwdSel" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_RsFwdSel[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_RsFwdSel[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/EX_RtFwdSel" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_RtFwdSel[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_RtFwdSel[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/M_WriteDataFwdSel" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_WriteDataFwdSel</obj_property>
|
||||
<obj_property name="ObjectShortName">M_WriteDataFwdSel</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group38" type="group">
|
||||
<obj_property name="label">Stalls</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/HazardControl/WB_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/M_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Controller/M_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">M_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Stall</obj_property>
|
||||
<obj_property name="label">M_Stall_Controller</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/HazardControl/EX_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/HazardControl/ID_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/HazardControl/IF_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">IF_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">IF_Stall</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/InstMem_Read" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">InstMem_Read</obj_property>
|
||||
<obj_property name="ObjectShortName">InstMem_Read</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/InstMem_Ready" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">InstMem_Ready</obj_property>
|
||||
<obj_property name="ObjectShortName">InstMem_Ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32_InstMem_In" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">MIPS32_InstMem_In[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">MIPS32_InstMem_In[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/IF_PCIn" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">IF_PCIn[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">IF_PCIn[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/IF_PCOut" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">IF_PCOut[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">IF_PCOut[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/PC/enable" type="logic" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">enable</obj_property>
|
||||
<obj_property name="ObjectShortName">enable</obj_property>
|
||||
<obj_property name="label">PC_Enable</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/ID_PCSrc" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_PCSrc[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_PCSrc[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/ID_PCSrc_Exc" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_PCSrc_Exc</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_PCSrc_Exc</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/EXMEM/M_RegWrite" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_RegWrite</obj_property>
|
||||
<obj_property name="ObjectShortName">M_RegWrite</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Controller/LLSC_Atomic" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">LLSC_Atomic</obj_property>
|
||||
<obj_property name="ObjectShortName">LLSC_Atomic</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group118" type="group">
|
||||
<obj_property name="label">WB STAGE</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/M_Flush" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_Flush</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/M_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/WB_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/M_RtRd" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_RtRd[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">M_RtRd[4:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/WB_RegWrite" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_RegWrite</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_RegWrite</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/WB_MemtoReg" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_MemtoReg</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_MemtoReg</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/M_ReadData" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_ReadData[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">M_ReadData[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/WB_ReadData" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_ReadData[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_ReadData[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/MEMWB/WB_ALU_Result" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_ALU_Result[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_ALU_Result[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/WB_WriteData" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WB_WriteData[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">WB_WriteData[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Controller/Address" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Address[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">Address[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Address" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_Address[29:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_Address[29:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Out" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_Out[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_Out[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_In" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_In[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_In[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Write" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_Write[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_Write[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Read" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_Read</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_Read</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Ready" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">DataMem_Ready</obj_property>
|
||||
<obj_property name="ObjectShortName">DataMem_Ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/M_MemRead" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_MemRead</obj_property>
|
||||
<obj_property name="ObjectShortName">M_MemRead</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/M_MemWrite" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_MemWrite</obj_property>
|
||||
<obj_property name="ObjectShortName">M_MemWrite</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/DataMem_Controller/WriteCondition" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">WriteCondition</obj_property>
|
||||
<obj_property name="ObjectShortName">WriteCondition</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/Memory/web" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">web[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">web[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group19" type="group">
|
||||
<obj_property name="label">Exceptions</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_AdIF" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_AdIF</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_AdIF</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_AdEL" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_AdEL</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_AdEL</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_AdES" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_AdES</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_AdES</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_Ov" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_Ov</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Ov</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_Tr" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_Tr</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Tr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_Sys" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_Sys</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Sys</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_Bp" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_Bp</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Bp</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_RI" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_RI</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_RI</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_CpU" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_CpU</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_CpU</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EXC_Int" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EXC_Int</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Int</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group78" type="group">
|
||||
<obj_property name="label">CP0</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/ID_Exception_Stall" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_Exception_Stall</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_Exception_Stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group100" type="group">
|
||||
<obj_property name="label">Flushes</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/IF_Exception_Flush" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">IF_Exception_Flush</obj_property>
|
||||
<obj_property name="ObjectShortName">IF_Exception_Flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/ID_Exception_Flush" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_Exception_Flush</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_Exception_Flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EX_Exception_Flush" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_Exception_Flush</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_Exception_Flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/M_Exception_Flush" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_Exception_Flush</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Exception_Flush</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/ID_Exception_Ready" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ID_Exception_Ready</obj_property>
|
||||
<obj_property name="ObjectShortName">ID_Exception_Ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EX_Exception_Ready" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EX_Exception_Ready</obj_property>
|
||||
<obj_property name="ObjectShortName">EX_Exception_Ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/M_Exception_Ready" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">M_Exception_Ready</obj_property>
|
||||
<obj_property name="ObjectShortName">M_Exception_Ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/TrapDetect/EXC_Tr" type="logic" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">EXC_Tr</obj_property>
|
||||
<obj_property name="ObjectShortName">EXC_Tr</obj_property>
|
||||
<obj_property name="label">M_EXC_Tr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/ErrorEPC" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ErrorEPC[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">ErrorEPC[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/EPC" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">EPC[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">EPC[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Exc_PC_Out" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Exc_PC_Out[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">Exc_PC_Out[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Status_ERL" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Status_ERL</obj_property>
|
||||
<obj_property name="ObjectShortName">Status_ERL</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Status_EXL" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Status_EXL</obj_property>
|
||||
<obj_property name="ObjectShortName">Status_EXL</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Status" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Status[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">Status[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Cause" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Cause[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">Cause[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/Mtc0" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Mtc0</obj_property>
|
||||
<obj_property name="ObjectShortName">Mtc0</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/CP0_WriteCond" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">CP0_WriteCond</obj_property>
|
||||
<obj_property name="ObjectShortName">CP0_WriteCond</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/CP0/ERET" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">ERET</obj_property>
|
||||
<obj_property name="ObjectShortName">ERET</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/Interrupts" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Interrupts[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">Interrupts[4:0]</obj_property>
|
||||
<obj_property name="Radix">BINARYRADIX</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group39" type="group">
|
||||
<obj_property name="label">Registers</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[1]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[1,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[1,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">at (1)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[2]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[2,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[2,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">v0 (2)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[3]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[3,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[3,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">v1 (3)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[4]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[4,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[4,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">a0 (4)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[5]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[5,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[5,31:0]</obj_property>
|
||||
<obj_property name="Radix">ASCIIRADIX</obj_property>
|
||||
<obj_property name="label">a1 (5)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[6]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[6,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[6,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">a2 (6)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[7]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[7,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[7,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">a3 (7)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[8]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[8,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[8,31:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
<obj_property name="label">t0 (8)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[9]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[9,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[9,31:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
<obj_property name="label">t1 (9)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[10]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[10,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[10,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t2 (10)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[11]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[11,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[11,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t3 (11)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[12]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[12,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[12,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t4 (12)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[13]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[13,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[13,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t5 (13)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[14]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[14,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[14,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t6 (14)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[15]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[15,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[15,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">t7 (15)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[16]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[16,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[16,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">s0 (16)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[17]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[17,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[17,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[18]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[18,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[18,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[19]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[19,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[19,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[20]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[20,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[20,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[21]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[21,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[21,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[22]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[22,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[22,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[23]" type="array" db_ref_id="1">
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<obj_property name="ElementShortName">[23,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[23,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
<obj_property name="label">s7 (23)</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[24]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[24,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[24,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[25]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[25,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[25,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[26]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[26,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[26,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[27]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[27,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[27,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[28]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[28,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[28,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[29]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[29,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[29,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[30]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[30,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[30,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/MIPS32/RegisterFile/registers[31]" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">[31,31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">registers[31,31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
<wvobject fp_name="group105" type="group">
|
||||
<obj_property name="label">I2C</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/PHY/scl" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">scl</obj_property>
|
||||
<obj_property name="ObjectShortName">scl</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/i2c_sda" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">i2c_sda</obj_property>
|
||||
<obj_property name="ObjectShortName">i2c_sda</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/PHY/scl_tick_90" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">scl_tick_90</obj_property>
|
||||
<obj_property name="ObjectShortName">scl_tick_90</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/PHY/state" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">state[5:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">state[5:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/PHY/Write" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">Write</obj_property>
|
||||
<obj_property name="ObjectShortName">Write</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/I2C_Nack" type="logic" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">I2C_Nack</obj_property>
|
||||
<obj_property name="ObjectShortName">I2C_Nack</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="/Top_Tester/uut/I2C/PHY/FIFO/count" type="array" db_ref_id="1">
|
||||
<obj_property name="ElementShortName">count[8:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">count[8:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
</wvobject>
|
||||
</wave_config>
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Switch_Filter.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 18-Jun-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A debouncer for 8 switches.
|
||||
*/
|
||||
module Switch_Filter(
|
||||
input clock,
|
||||
input reset,
|
||||
input [7:0] switch_in,
|
||||
output reg [7:0] switch_out
|
||||
);
|
||||
|
||||
|
||||
reg [5:0] c7, c6, c5, c4, c3, c2, c1, c0;
|
||||
|
||||
always @(posedge clock) begin
|
||||
c0 <= (reset) ? 6'h20 : ((switch_in[0] & (c0 != 6'h3F)) ? c0 + 1 : ((~switch_in[0] & (c0 != 6'h00)) ? c0 - 1 : c0));
|
||||
c1 <= (reset) ? 6'h20 : ((switch_in[1] & (c1 != 6'h3F)) ? c1 + 1 : ((~switch_in[1] & (c1 != 6'h00)) ? c1 - 1 : c1));
|
||||
c2 <= (reset) ? 6'h20 : ((switch_in[2] & (c2 != 6'h3F)) ? c2 + 1 : ((~switch_in[2] & (c2 != 6'h00)) ? c2 - 1 : c2));
|
||||
c3 <= (reset) ? 6'h20 : ((switch_in[3] & (c3 != 6'h3F)) ? c3 + 1 : ((~switch_in[3] & (c3 != 6'h00)) ? c3 - 1 : c3));
|
||||
c4 <= (reset) ? 6'h20 : ((switch_in[4] & (c4 != 6'h3F)) ? c4 + 1 : ((~switch_in[4] & (c4 != 6'h00)) ? c4 - 1 : c4));
|
||||
c5 <= (reset) ? 6'h20 : ((switch_in[5] & (c5 != 6'h3F)) ? c5 + 1 : ((~switch_in[5] & (c5 != 6'h00)) ? c5 - 1 : c5));
|
||||
c6 <= (reset) ? 6'h20 : ((switch_in[6] & (c6 != 6'h3F)) ? c6 + 1 : ((~switch_in[6] & (c6 != 6'h00)) ? c6 - 1 : c6));
|
||||
c7 <= (reset) ? 6'h20 : ((switch_in[7] & (c7 != 6'h3F)) ? c7 + 1 : ((~switch_in[7] & (c7 != 6'h00)) ? c7 - 1 : c7));
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
switch_out[0] <= (reset) ? 0 : ((c0 == 6'h00) ? 0 : ((c0 == 6'h3F) ? 1 : switch_out[0]));
|
||||
switch_out[1] <= (reset) ? 0 : ((c1 == 6'h00) ? 0 : ((c1 == 6'h3F) ? 1 : switch_out[1]));
|
||||
switch_out[2] <= (reset) ? 0 : ((c2 == 6'h00) ? 0 : ((c2 == 6'h3F) ? 1 : switch_out[2]));
|
||||
switch_out[3] <= (reset) ? 0 : ((c3 == 6'h00) ? 0 : ((c3 == 6'h3F) ? 1 : switch_out[3]));
|
||||
switch_out[4] <= (reset) ? 0 : ((c4 == 6'h00) ? 0 : ((c4 == 6'h3F) ? 1 : switch_out[4]));
|
||||
switch_out[5] <= (reset) ? 0 : ((c5 == 6'h00) ? 0 : ((c5 == 6'h3F) ? 1 : switch_out[5]));
|
||||
switch_out[6] <= (reset) ? 0 : ((c6 == 6'h00) ? 0 : ((c6 == 6'h3F) ? 1 : switch_out[6]));
|
||||
switch_out[7] <= (reset) ? 0 : ((c7 == 6'h00) ? 0 : ((c7 == 6'h3F) ? 1 : switch_out[7]));
|
||||
end
|
||||
|
||||
/*
|
||||
reg [19:0] c7, c6, c5, c4, c3, c2, c1, c0;
|
||||
|
||||
always @(posedge clock) begin
|
||||
c0 <= (reset) ? 20'h80000 : ((switch_in[0] & (c0 != 20'hFFFFF)) ? c0 + 1 : ((~switch_in[0] & (c0 != 20'h00000)) ? c0 - 1 : c0));
|
||||
c1 <= (reset) ? 20'h80000 : ((switch_in[1] & (c1 != 20'hFFFFF)) ? c1 + 1 : ((~switch_in[1] & (c1 != 20'h00000)) ? c1 - 1 : c1));
|
||||
c2 <= (reset) ? 20'h80000 : ((switch_in[2] & (c2 != 20'hFFFFF)) ? c2 + 1 : ((~switch_in[2] & (c2 != 20'h00000)) ? c2 - 1 : c2));
|
||||
c3 <= (reset) ? 20'h80000 : ((switch_in[3] & (c3 != 20'hFFFFF)) ? c3 + 1 : ((~switch_in[3] & (c3 != 20'h00000)) ? c3 - 1 : c3));
|
||||
c4 <= (reset) ? 20'h80000 : ((switch_in[4] & (c4 != 20'hFFFFF)) ? c4 + 1 : ((~switch_in[4] & (c4 != 20'h00000)) ? c4 - 1 : c4));
|
||||
c5 <= (reset) ? 20'h80000 : ((switch_in[5] & (c5 != 20'hFFFFF)) ? c5 + 1 : ((~switch_in[5] & (c5 != 20'h00000)) ? c5 - 1 : c5));
|
||||
c6 <= (reset) ? 20'h80000 : ((switch_in[6] & (c6 != 20'hFFFFF)) ? c6 + 1 : ((~switch_in[6] & (c6 != 20'h00000)) ? c6 - 1 : c6));
|
||||
c7 <= (reset) ? 20'h80000 : ((switch_in[7] & (c7 != 20'hFFFFF)) ? c7 + 1 : ((~switch_in[7] & (c7 != 20'h00000)) ? c7 - 1 : c7));
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
switch_out[0] <= (reset) ? 0 : ((c0 == 20'h00000) ? 0 : ((c0 == 20'hFFFFF) ? 1 : switch_out[0]));
|
||||
switch_out[1] <= (reset) ? 0 : ((c1 == 20'h00000) ? 0 : ((c1 == 20'hFFFFF) ? 1 : switch_out[1]));
|
||||
switch_out[2] <= (reset) ? 0 : ((c2 == 20'h00000) ? 0 : ((c2 == 20'hFFFFF) ? 1 : switch_out[2]));
|
||||
switch_out[3] <= (reset) ? 0 : ((c3 == 20'h00000) ? 0 : ((c3 == 20'hFFFFF) ? 1 : switch_out[3]));
|
||||
switch_out[4] <= (reset) ? 0 : ((c4 == 20'h00000) ? 0 : ((c4 == 20'hFFFFF) ? 1 : switch_out[4]));
|
||||
switch_out[5] <= (reset) ? 0 : ((c5 == 20'h00000) ? 0 : ((c5 == 20'hFFFFF) ? 1 : switch_out[5]));
|
||||
switch_out[6] <= (reset) ? 0 : ((c6 == 20'h00000) ? 0 : ((c6 == 20'hFFFFF) ? 1 : switch_out[6]));
|
||||
switch_out[7] <= (reset) ? 0 : ((c7 == 20'h00000) ? 0 : ((c7 == 20'hFFFFF) ? 1 : switch_out[7]));
|
||||
end
|
||||
*/
|
||||
|
||||
endmodule
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Switches.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 17-Jul-2012 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* A read interface between a 4-way handshaking data bus and
|
||||
* 8 physical switches, which are debounced.
|
||||
*/
|
||||
module Switches(
|
||||
input clock,
|
||||
input reset,
|
||||
input Read,
|
||||
input Write,
|
||||
input [7:0] Switch_in, // Direct from physical switches
|
||||
output reg Ack,
|
||||
output [7:0] Switch_out
|
||||
);
|
||||
|
||||
always @(posedge clock) begin
|
||||
Ack <= (reset) ? 0 : (Read | Write);
|
||||
end
|
||||
|
||||
// Low-level switch debounce filter
|
||||
Switch_Filter Switch_Filter (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.switch_in (Switch_in),
|
||||
.switch_out (Switch_out)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
|
||||
# Clock and Reset
|
||||
NET "clock_100Mhz" LOC = AH15 | IOSTANDARD = LVCMOS33; # 100 MHz
|
||||
NET "clock_100MHz" TNM_NET = "BOARD_CLK";
|
||||
TIMESPEC "TS_BOARD_CLK" = PERIOD "BOARD_CLK" 10 ns HIGH 50 %;
|
||||
NET "reset_n" LOC = E9 | IOSTANDARD = LVCMOS33;
|
||||
|
||||
# UART
|
||||
NET "UART_Rx" LOC = AG15 | IOSTANDARD = LVCMOS33;
|
||||
NET "UART_Tx" LOC = AG20 | IOSTANDARD = LVCMOS33;
|
||||
|
||||
# LCD Screen
|
||||
NET "lcd[6]" LOC = T11 | IOSTANDARD = LVCMOS33; #D_4
|
||||
NET "lcd[5]" LOC = G6 | IOSTANDARD = LVCMOS33; #D_3
|
||||
NET "lcd[4]" LOC = G7 | IOSTANDARD = LVCMOS33; #D_2
|
||||
NET "lcd[3]" LOC = T9 | IOSTANDARD = LVCMOS33; #D_1
|
||||
NET "lcd[2]" LOC = AC9 | IOSTANDARD = LVCMOS33; #E
|
||||
NET "lcd[1]" LOC = J17 | IOSTANDARD = LVCMOS25; #RS
|
||||
NET "lcd[0]" LOC = AC10 | IOSTANDARD = LVCMOS33; #RW
|
||||
|
||||
# General-Purpose LEDs
|
||||
NET "LED[0]" LOC = AE24 | IOSTANDARD = SSTL18_I; # LED 7
|
||||
NET "LED[1]" LOC = AD24 | IOSTANDARD = SSTL18_I; # LED 6
|
||||
NET "LED[2]" LOC = AD25 | IOSTANDARD = SSTL18_I; # LED 5
|
||||
NET "LED[3]" LOC = G16 | IOSTANDARD = LVCMOS25; # LED 4
|
||||
NET "LED[4]" LOC = AD26 | IOSTANDARD = SSTL18_I; # LED 3
|
||||
NET "LED[5]" LOC = G15 | IOSTANDARD = LVCMOS25; # LED 2
|
||||
NET "LED[6]" LOC = L18 | IOSTANDARD = LVCMOS25; # LED 1
|
||||
NET "LED[7]" LOC = H18 | IOSTANDARD = LVCMOS25; # LED 0
|
||||
NET "LED[8]" LOC = E8 | IOSTANDARD = LVCMOS33; # LED Center
|
||||
NET "LED[9]" LOC = AF23 | IOSTANDARD = LVCMOS33; # LED West
|
||||
NET "LED[10]" LOC = AG12 | IOSTANDARD = LVCMOS33; # LED South
|
||||
NET "LED[11]" LOC = AG23 | IOSTANDARD = LVCMOS33; # LED East
|
||||
NET "LED[12]" LOC = AF13 | IOSTANDARD = LVCMOS33; # LED North
|
||||
NET "LED[13]" LOC = F6 | IOSTANDARD = LVCMOS33; # LED Error 1
|
||||
NET "LED[14]" LOC = T10 | IOSTANDARD = LVCMOS33; # LED Error 2
|
||||
|
||||
# Piezo Transducer
|
||||
NET "Piezo" LOC = G30 | IOSTANDARD = SSTL18_I;
|
||||
|
||||
# General Purpose Switches
|
||||
NET "Switch[7]" LOC = U25 | IOSTANDARD = SSTL18_I; # DIP 1
|
||||
NET "Switch[6]" LOC = AG27 | IOSTANDARD = SSTL18_I; # DIP 2
|
||||
NET "Switch[5]" LOC = AF25 | IOSTANDARD = SSTL18_I; # DIP 3
|
||||
NET "Switch[4]" LOC = AF26 | IOSTANDARD = SSTL18_I; # DIP 4
|
||||
NET "Switch[3]" LOC = AE27 | IOSTANDARD = SSTL18_I; # DIP 5
|
||||
NET "Switch[2]" LOC = AE26 | IOSTANDARD = SSTL18_I; # DIP 6
|
||||
NET "Switch[1]" LOC = AC25 | IOSTANDARD = SSTL18_I; # DIP 7
|
||||
NET "Switch[0]" LOC = AC24 | IOSTANDARD = SSTL18_I; # DIP 8
|
||||
|
||||
# Main IIC Bus
|
||||
NET "i2c_scl" LOC = F9 | IOSTANDARD = LVCMOS33; # IIC_Main SCL
|
||||
NET "i2c_sda" LOC = F8 | IOSTANDARD = LVCMOS33; # IIC_Main SDA
|
||||
+307
@@ -0,0 +1,307 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : Top.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 8-Jul-2011 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* The top-level file for the FPGA. Also known as the 'motherboard,' this
|
||||
* file connects all processor, memory, clocks, and I/O devices together.
|
||||
* All inputs and outputs correspond to actual FPGA pins.
|
||||
*/
|
||||
module Top(
|
||||
input clock_100MHz,
|
||||
input reset_n,
|
||||
// I/O
|
||||
input [7:0] Switch,
|
||||
output [14:0] LED,
|
||||
output [6:0] LCD,
|
||||
input UART_Rx,
|
||||
output UART_Tx,
|
||||
inout i2c_scl,
|
||||
inout i2c_sda,
|
||||
output Piezo
|
||||
);
|
||||
|
||||
|
||||
// Clock signals
|
||||
wire clock, clock2x;
|
||||
wire PLL_Locked;
|
||||
|
||||
reg reset;
|
||||
always @(posedge clock) begin
|
||||
reset <= ~reset_n | ~PLL_Locked;
|
||||
end
|
||||
|
||||
// MIPS Processor Signals
|
||||
reg [31:0] MIPS32_DataMem_In;
|
||||
wire [31:0] MIPS32_DataMem_Out, MIPS32_InstMem_In;
|
||||
wire [29:0] MIPS32_DataMem_Address, MIPS32_InstMem_Address;
|
||||
wire [3:0] MIPS32_DataMem_WE;
|
||||
wire MIPS32_DataMem_Read, MIPS32_InstMem_Read;
|
||||
reg MIPS32_DataMem_Ready;
|
||||
wire [4:0] MIPS32_Interrupts;
|
||||
wire MIPS32_NMI;
|
||||
wire [7:0] MIPS32_IP;
|
||||
wire MIPS32_IO_WE;
|
||||
|
||||
// BRAM Memory Signals
|
||||
reg [3:0] BRAM_WEA;
|
||||
reg BRAM_REA;
|
||||
reg [17:0] BRAM_AddrA;
|
||||
reg [31:0] BRAM_DINA;
|
||||
wire BRAM_ReadyA;
|
||||
wire BRAM_REB;
|
||||
wire [3:0] BRAM_WEB;
|
||||
wire [31:0] BRAM_DOUTB;
|
||||
wire BRAM_ReadyB;
|
||||
|
||||
// LCD Signals
|
||||
wire [3:0] LCD_WE;
|
||||
wire LCD_Ready;
|
||||
|
||||
// UART Bootloader Signals
|
||||
wire UART_RE;
|
||||
wire UART_WE;
|
||||
wire [16:0] UART_DOUT;
|
||||
wire UART_Ack;
|
||||
wire UART_Interrupt;
|
||||
wire UART_BootResetCPU;
|
||||
wire [17:0] UART_BootAddress;
|
||||
wire [31:0] UART_BootData;
|
||||
wire UART_BootWriteMem_pre;
|
||||
wire [3:0] UART_BootWriteMem = (UART_BootWriteMem_pre) ? 4'hF : 4'h0;
|
||||
|
||||
// I2C Signals
|
||||
wire I2C_Ready;
|
||||
wire [10:0] I2C_DOUT;
|
||||
wire I2C_RE, I2C_WE;
|
||||
|
||||
// Piezo Transducer Signals
|
||||
wire Piezo_WE;
|
||||
wire Piezo_Ready;
|
||||
|
||||
// LED Signals
|
||||
wire LED_WE;
|
||||
wire LED_RE;
|
||||
wire [13:0] LED_DOUT;
|
||||
wire LED_Ready;
|
||||
wire [13:0] LED_Sw_LEDs;
|
||||
|
||||
// Filtered Switch Input Signals
|
||||
wire Switches_RE;
|
||||
wire Switches_WE;
|
||||
wire Switches_Ready;
|
||||
wire [7:0] Switches_DOUT;
|
||||
|
||||
// Clock Generation
|
||||
PLL_100MHz_to_33MHz_66MHz Clock_Generator (
|
||||
.CLKIN1_IN (clock_100MHz),
|
||||
.RST_IN (1'b0),
|
||||
.CLKOUT0_OUT (clock),
|
||||
.CLKOUT1_OUT (clock2x),
|
||||
.LOCKED_OUT (PLL_Locked)
|
||||
);
|
||||
|
||||
// MIPS-32 Core
|
||||
Processor MIPS32 (
|
||||
.clock (clock),
|
||||
.reset ((reset | UART_BootResetCPU)),
|
||||
.Interrupts (MIPS32_Interrupts),
|
||||
.NMI (MIPS32_NMI),
|
||||
.DataMem_In (MIPS32_DataMem_In),
|
||||
.DataMem_Ready (MIPS32_DataMem_Ready),
|
||||
.DataMem_Read (MIPS32_DataMem_Read),
|
||||
.DataMem_Write (MIPS32_DataMem_WE),
|
||||
.DataMem_Address (MIPS32_DataMem_Address),
|
||||
.DataMem_Out (MIPS32_DataMem_Out),
|
||||
.InstMem_In (MIPS32_InstMem_In),
|
||||
.InstMem_Address (MIPS32_InstMem_Address),
|
||||
.InstMem_Ready (BRAM_ReadyA),
|
||||
.InstMem_Read (MIPS32_InstMem_Read),
|
||||
.IP (MIPS32_IP)
|
||||
);
|
||||
|
||||
// On-Chip Block RAM
|
||||
BRAM_592KB_Wrapper Memory (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.rea (BRAM_REA),
|
||||
.wea (BRAM_WEA),
|
||||
.addra (BRAM_AddrA),
|
||||
.dina (BRAM_DINA),
|
||||
.douta (MIPS32_InstMem_In),
|
||||
.dreadya (BRAM_ReadyA),
|
||||
.reb (BRAM_REB),
|
||||
.web (BRAM_WEB),
|
||||
.addrb (MIPS32_DataMem_Address[17:0]),
|
||||
.dinb (MIPS32_DataMem_Out),
|
||||
.doutb (BRAM_DOUTB),
|
||||
.dreadyb (BRAM_ReadyB)
|
||||
);
|
||||
|
||||
// 16x2 LCD Display Screen
|
||||
LCD LCD_Screen (
|
||||
.clock_100MHz (clock2x),
|
||||
.clock_Mem (clock2x),
|
||||
.reset (reset),
|
||||
.address (MIPS32_DataMem_Address[2:0]),
|
||||
.data (MIPS32_DataMem_Out),
|
||||
.writeEnable (LCD_WE),
|
||||
.ack (LCD_Ready),
|
||||
.LCD (LCD)
|
||||
);
|
||||
|
||||
// UART + Boot Loader (v2)
|
||||
uart_bootloader UART (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.Read (UART_RE),
|
||||
.Write (UART_WE),
|
||||
.DataIn (MIPS32_DataMem_Out[8:0]),
|
||||
.DataOut (UART_DOUT),
|
||||
.Ack (UART_Ack),
|
||||
.DataReady (UART_Interrupt),
|
||||
.BootResetCPU (UART_BootResetCPU),
|
||||
.BootWriteMem (UART_BootWriteMem_pre),
|
||||
.BootAddr (UART_BootAddress),
|
||||
.BootData (UART_BootData),
|
||||
.RxD (UART_Rx),
|
||||
.TxD (UART_Tx)
|
||||
);
|
||||
|
||||
// I2C Module
|
||||
I2C_Controller I2C (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.Read (I2C_RE),
|
||||
.Write (I2C_WE),
|
||||
.DataIn (MIPS32_DataMem_Out[12:0]),
|
||||
.DataOut (I2C_DOUT),
|
||||
.Ack (I2C_Ready),
|
||||
.i2c_scl (i2c_scl),
|
||||
.i2c_sda (i2c_sda)
|
||||
);
|
||||
|
||||
// Piezo-electric Transducer
|
||||
Piezo_Driver Piezo_Driver (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.data (MIPS32_DataMem_Out[24:0]),
|
||||
.Write (Piezo_WE),
|
||||
.Ack (Piezo_Ready),
|
||||
.Piezo (Piezo)
|
||||
);
|
||||
|
||||
// LEDs
|
||||
LED LEDs (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.dataIn (MIPS32_DataMem_Out[14:0]),
|
||||
.IP (MIPS32_IP),
|
||||
.Write (LED_WE),
|
||||
.Read (LED_RE),
|
||||
.dataOut (LED_DOUT),
|
||||
.Ack (LED_Ready),
|
||||
.LED (LED_Sw_LEDs)
|
||||
);
|
||||
|
||||
// Filtered Input Switches
|
||||
Switches Switches (
|
||||
.clock (clock2x),
|
||||
.reset (reset),
|
||||
.Read (Switches_RE),
|
||||
.Write (Switches_WE),
|
||||
.Switch_in (Switch),
|
||||
.Ack (Switches_Ready),
|
||||
.Switch_out (Switches_DOUT)
|
||||
);
|
||||
|
||||
|
||||
assign MIPS32_IO_WE = (MIPS32_DataMem_WE == 4'hF) ? 1 : 0;
|
||||
assign MIPS32_Interrupts[4:1] = Switches_DOUT[7:4];
|
||||
assign MIPS32_Interrupts[0] = UART_Interrupt;
|
||||
assign MIPS32_NMI = Switches_DOUT[3];
|
||||
assign LED = {UART_BootResetCPU, LED_Sw_LEDs[13:0]};
|
||||
|
||||
// Allow writes to Instruction Memory Port when bootloading
|
||||
always @(*) begin
|
||||
BRAM_REA <= (UART_BootResetCPU) ? 0 : MIPS32_InstMem_Read;
|
||||
BRAM_WEA <= (UART_BootResetCPU) ? UART_BootWriteMem : 4'h0;
|
||||
BRAM_AddrA <= (UART_BootResetCPU) ? UART_BootAddress : MIPS32_InstMem_Address;
|
||||
BRAM_DINA <= (UART_BootResetCPU) ? UART_BootData : 32'h0000_0000;
|
||||
end
|
||||
|
||||
|
||||
always @(*) begin
|
||||
case (MIPS32_DataMem_Address[29])
|
||||
0 : begin
|
||||
MIPS32_DataMem_In <= BRAM_DOUTB;
|
||||
MIPS32_DataMem_Ready <= BRAM_ReadyB;
|
||||
end
|
||||
1 : begin
|
||||
// Memory-mapped I/O
|
||||
case (MIPS32_DataMem_Address[28:26])
|
||||
// LCD
|
||||
3'b000 : begin
|
||||
MIPS32_DataMem_In <= 32'h0000_0000;
|
||||
MIPS32_DataMem_Ready <= LCD_Ready;
|
||||
end
|
||||
// I2C
|
||||
3'b001 : begin
|
||||
MIPS32_DataMem_In <= {21'h000000, I2C_DOUT[10:0]};
|
||||
MIPS32_DataMem_Ready <= I2C_Ready;
|
||||
end
|
||||
// Piezo
|
||||
3'b010 : begin
|
||||
MIPS32_DataMem_In <= 32'h0000_0000;
|
||||
MIPS32_DataMem_Ready <= Piezo_Ready;
|
||||
end
|
||||
// UART
|
||||
3'b011 : begin
|
||||
MIPS32_DataMem_In <= {15'h0000, UART_DOUT[16:0]};
|
||||
MIPS32_DataMem_Ready <= UART_Ack;
|
||||
end
|
||||
// LED
|
||||
3'b100 : begin
|
||||
MIPS32_DataMem_In <= {18'h00000, LED_DOUT[13:0]};
|
||||
MIPS32_DataMem_Ready <= LED_Ready;
|
||||
end
|
||||
// Switches
|
||||
3'b101 : begin
|
||||
MIPS32_DataMem_In <= {24'h000000, Switches_DOUT[7:0]};
|
||||
MIPS32_DataMem_Ready <= Switches_Ready;
|
||||
end
|
||||
default: begin
|
||||
MIPS32_DataMem_In <= 32'h0000_0000;
|
||||
MIPS32_DataMem_Ready <= 0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
// Memory
|
||||
assign BRAM_REB = (MIPS32_DataMem_Address[29]) ? 0 : MIPS32_DataMem_Read;
|
||||
assign BRAM_WEB = (MIPS32_DataMem_Address[29]) ? 4'h0 : MIPS32_DataMem_WE;
|
||||
// I/O
|
||||
assign LCD_WE = (MIPS32_DataMem_Address[29:26] == 4'b1000) ? MIPS32_DataMem_WE : 4'h0;
|
||||
assign Piezo_WE = (MIPS32_DataMem_Address[29:26] == 4'b1010) ? MIPS32_IO_WE : 0;
|
||||
assign I2C_WE = (MIPS32_DataMem_Address[29:26] == 4'b1001) ? MIPS32_IO_WE : 0;
|
||||
assign I2C_RE = (MIPS32_DataMem_Address[29:26] == 4'b1001) ? MIPS32_DataMem_Read : 0;
|
||||
assign UART_WE = (MIPS32_DataMem_Address[29:26] == 4'b1011) ? MIPS32_IO_WE : 0;
|
||||
assign UART_RE = (MIPS32_DataMem_Address[29:26] == 4'b1011) ? MIPS32_DataMem_Read : 0;
|
||||
assign LED_WE = (MIPS32_DataMem_Address[29:26] == 4'b1100) ? MIPS32_IO_WE : 0;
|
||||
assign LED_RE = (MIPS32_DataMem_Address[29:26] == 4'b1100) ? MIPS32_DataMem_Read : 0;
|
||||
assign Switches_WE = (MIPS32_DataMem_Address[29:26] == 4'b1101) ? MIPS32_IO_WE : 0;
|
||||
assign Switches_RE = (MIPS32_DataMem_Address[29:26] == 4'b1101) ? MIPS32_DataMem_Read : 0;
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+129
@@ -0,0 +1,129 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : uart-min.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-May-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* 115200 baud 8-N-1 serial port, using only Tx and Rx.
|
||||
* (8 data bits, no parity, 1 stop bit, no flow control.)
|
||||
* Configurable baud rate determined by clocking module, 16x oversampling
|
||||
* for Rx data, Rx filtering, and configurable FIFO buffers for receiving
|
||||
* and transmitting.
|
||||
*
|
||||
* Described as '_min' due to lack of overflow and other status signals
|
||||
* as well as the use of only Tx and Rx signals.
|
||||
*/
|
||||
module uart_min(
|
||||
input clock,
|
||||
input reset,
|
||||
input write,
|
||||
input [7:0] data_in, // tx going into uart, out of serial port
|
||||
input read,
|
||||
output [7:0] data_out, // rx coming in from serial port, out of uart
|
||||
output data_ready,
|
||||
output [8:0] rx_count,
|
||||
/*------------------------*/
|
||||
input RxD,
|
||||
output TxD
|
||||
);
|
||||
|
||||
localparam DATA_WIDTH = 8; // Bit-width of FIFO data (should be 8)
|
||||
localparam ADDR_WIDTH = 8; // 2^ADDR_WIDTH words of FIFO space
|
||||
|
||||
/* Clocking Signals */
|
||||
wire uart_tick, uart_tick_16x;
|
||||
|
||||
/* Receive Signals */
|
||||
wire [7:0] rx_data; // Raw bytes coming in from uart
|
||||
wire rx_data_ready; // Synchronous pulse indicating this (^)
|
||||
wire rx_fifo_empty;
|
||||
|
||||
/* Send Signals */
|
||||
reg tx_fifo_deQ = 0;
|
||||
reg tx_start = 0;
|
||||
wire tx_free;
|
||||
wire tx_fifo_empty;
|
||||
wire [7:0] tx_fifo_data_out;
|
||||
|
||||
assign data_ready = ~rx_fifo_empty;
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
tx_fifo_deQ <= 0;
|
||||
tx_start <= 0;
|
||||
end
|
||||
else begin
|
||||
if (~tx_fifo_empty & tx_free & uart_tick) begin
|
||||
tx_fifo_deQ <= 1;
|
||||
tx_start <= 1;
|
||||
end
|
||||
else begin
|
||||
tx_fifo_deQ <= 0;
|
||||
tx_start <= 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
uart_clock clocks (
|
||||
.clock (clock),
|
||||
.uart_tick (uart_tick),
|
||||
.uart_tick_16x (uart_tick_16x)
|
||||
);
|
||||
|
||||
uart_tx tx (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.uart_tick (uart_tick),
|
||||
.TxD_data (tx_fifo_data_out),
|
||||
.TxD_start (tx_start),
|
||||
.ready (tx_free),
|
||||
.TxD (TxD)
|
||||
);
|
||||
|
||||
uart_rx rx (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.RxD (RxD),
|
||||
.uart_tick_16x (uart_tick_16x),
|
||||
.RxD_data (rx_data),
|
||||
.data_ready (rx_data_ready)
|
||||
);
|
||||
|
||||
FIFO_NoFull_Count #(
|
||||
.DATA_WIDTH (DATA_WIDTH),
|
||||
.ADDR_WIDTH (ADDR_WIDTH))
|
||||
tx_buffer (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.enQ (write),
|
||||
.deQ (tx_fifo_deQ),
|
||||
.data_in (data_in),
|
||||
.data_out (tx_fifo_data_out),
|
||||
.empty (tx_fifo_empty),
|
||||
.count ()
|
||||
);
|
||||
|
||||
FIFO_NoFull_Count #(
|
||||
.DATA_WIDTH (DATA_WIDTH),
|
||||
.ADDR_WIDTH (ADDR_WIDTH))
|
||||
rx_buffer (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.enQ (rx_data_ready),
|
||||
.deQ (read),
|
||||
.data_in (rx_data),
|
||||
.data_out (data_out),
|
||||
.empty (rx_fifo_empty),
|
||||
.count (rx_count)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
+183
@@ -0,0 +1,183 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer: Grant Ayers (ayers@cs.utah.edu)
|
||||
//
|
||||
// Create Date: 09:59:05 05/24/2010
|
||||
// Design Name:
|
||||
// Module Name: uart_bootloader
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
// Implements the XUM bootloader protocol over a serial port (115200 8N1).
|
||||
// The protocol is as follows:
|
||||
//
|
||||
// 1. Programmer sends 'XUM' ascii bytes
|
||||
// 2. Programmer sends a number indicating how many 32-bit data words it
|
||||
// has to send, minus 1. (For example, if it has one 32-bit data word,
|
||||
// this number will be 0.) The size of this number is 18 bits.
|
||||
// This means the minimum transmission size is 1 word (32 bits), and
|
||||
// the maximum transmission size is 262144 words (exactly 1MB).
|
||||
// This 18-bit number is sent in three bytes, and the six most
|
||||
// significant bits of the first byte must be 0.
|
||||
// 3. The FPGA sends back the third size byte from the programmer, allowing
|
||||
// the programmer to determine if the FPGA is listening and conforming
|
||||
// to the XUM boot protocol.
|
||||
// 4. The programmer sends another 18-bit number indicating the starting
|
||||
// offset in memory where the data should be placed. Normally this will
|
||||
// be 0. This number is also sent in three bytes, and the six most
|
||||
// significant bits of the first byte are ignored.
|
||||
// 5. The programmer sends the data. A copy of each byte that it sends will
|
||||
// be sent back to the programmer from the FPGA, allowing the programmer
|
||||
// to determine if all of the data was transmitted successfully.
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
module uart_bootloader(
|
||||
input clock, // 100Mhz
|
||||
input reset, // System-wide global reset
|
||||
input RxD, // UART data from computer
|
||||
output TxD, // UART data to computer
|
||||
output resetCPU, // Reset CPUs' PCs to start execution at 0x0
|
||||
output reg writeMem = 0, // Write command to instruction memory
|
||||
output reg [17:0] addrMem = 0, // address to instruction memory
|
||||
output reg [31:0] dataMem = 0 // 32-bit data words of instruction memory
|
||||
);
|
||||
|
||||
localparam [3:0] HEAD_1=0, HEAD_2=1, HEAD_3=2, SIZE_1=3, SIZE_2=4, SIZE_3=5, OFST_1=6, OFST_2=7,
|
||||
OFST_3=8, ADDRSET=9, DATA_1=10, DATA_2=11, DATA_3=12, DATA_4=13, ADDRINC=14;
|
||||
|
||||
/* UART Signals */
|
||||
reg uart_write = 0;
|
||||
reg uart_read = 0;
|
||||
|
||||
wire [7:0] uart_rx_data;
|
||||
wire [7:0] uart_tx_data = uart_rx_data;
|
||||
wire uart_rx_data_ready;
|
||||
|
||||
reg [17:0] size = 0; // Number of 32-bit words to expect
|
||||
reg [17:0] offset = 0; // Starting address to store words
|
||||
reg [17:0] rx_count = 0; // Number of 32-bit words received so far
|
||||
|
||||
reg [3:0] state = HEAD_1;
|
||||
|
||||
// The CPU(s) is continuously reset while memory is being replaced.
|
||||
assign resetCPU = ((state!=HEAD_1) && (state!=HEAD_2) && (state!=HEAD_3) && (state!=SIZE_1));
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= HEAD_1;
|
||||
uart_read <= 0;
|
||||
uart_write <= 0;
|
||||
writeMem <= 0;
|
||||
rx_count <= 0;
|
||||
end
|
||||
else begin
|
||||
uart_read <= uart_rx_data_ready & ((state!=ADDRSET) && (state!=ADDRINC));
|
||||
uart_write <= uart_rx_data_ready & ((state==SIZE_3) || (state==DATA_1) || (state==DATA_2) || (state==DATA_3) || (state==DATA_4));
|
||||
writeMem <= uart_rx_data_ready & (state == DATA_4);
|
||||
rx_count <= (state == HEAD_1) ? 0 : ((state == ADDRINC) ? rx_count + 1 : rx_count);
|
||||
case (state)
|
||||
HEAD_1: begin
|
||||
if (uart_rx_data_ready) begin
|
||||
state <= (uart_rx_data == 8'h58) ? HEAD_2 : HEAD_1; // 'X'
|
||||
end
|
||||
else begin
|
||||
state <= HEAD_1;
|
||||
end
|
||||
end
|
||||
HEAD_2: begin
|
||||
if (uart_rx_data_ready) begin
|
||||
state <= (uart_rx_data == 8'h55) ? HEAD_3 : HEAD_1; // 'U'
|
||||
end
|
||||
else begin
|
||||
state <= HEAD_2;
|
||||
end
|
||||
end
|
||||
HEAD_3: begin
|
||||
if (uart_rx_data_ready) begin
|
||||
state <= (uart_rx_data == 8'h4D) ? SIZE_1 : HEAD_1; // 'M'
|
||||
end
|
||||
else begin
|
||||
state <= HEAD_3;
|
||||
end
|
||||
end
|
||||
SIZE_1: begin
|
||||
if (uart_rx_data_ready) begin
|
||||
state <= (uart_rx_data[7:2] == 6'b000000) ? SIZE_2 : HEAD_1; // 6 leading 0s
|
||||
size[17:16] <= uart_rx_data[1:0];
|
||||
end
|
||||
else begin
|
||||
state <= SIZE_1;
|
||||
end
|
||||
end
|
||||
SIZE_2: begin
|
||||
state <= (uart_rx_data_ready) ? SIZE_3 : SIZE_2;
|
||||
size[15:8] <= (uart_rx_data_ready) ? uart_rx_data : size[15:8];
|
||||
end
|
||||
SIZE_3: begin
|
||||
state <= (uart_rx_data_ready) ? OFST_1 : SIZE_3;
|
||||
size[7:0] <= (uart_rx_data_ready) ? uart_rx_data : size[7:0];
|
||||
end
|
||||
OFST_1: begin
|
||||
state <= (uart_rx_data_ready) ? OFST_2 : OFST_1;
|
||||
offset[17:16] <= (uart_rx_data_ready) ? uart_rx_data[1:0] : offset[17:16];
|
||||
end
|
||||
OFST_2: begin
|
||||
state <= (uart_rx_data_ready) ? OFST_3 : OFST_2;
|
||||
offset[15:8] <= (uart_rx_data_ready) ? uart_rx_data : offset[15:8];
|
||||
end
|
||||
OFST_3: begin
|
||||
state <= (uart_rx_data_ready) ? ADDRSET : OFST_3;
|
||||
offset[7:0] <= (uart_rx_data_ready) ? uart_rx_data : offset[7:0];
|
||||
end
|
||||
ADDRSET: begin
|
||||
state <= DATA_1;
|
||||
addrMem <= offset;
|
||||
end
|
||||
DATA_1: begin
|
||||
state <= (uart_rx_data_ready) ? DATA_2 : DATA_1;
|
||||
dataMem[31:24] <= (uart_rx_data_ready) ? uart_rx_data : dataMem[31:24];
|
||||
end
|
||||
DATA_2: begin
|
||||
state <= (uart_rx_data_ready) ? DATA_3 : DATA_2;
|
||||
dataMem[23:16] <= (uart_rx_data_ready) ? uart_rx_data : dataMem[23:16];
|
||||
end
|
||||
DATA_3: begin
|
||||
state <= (uart_rx_data_ready) ? DATA_4 : DATA_3;
|
||||
dataMem[15:8] <= (uart_rx_data_ready) ? uart_rx_data : dataMem[15:8];
|
||||
end
|
||||
DATA_4: begin
|
||||
state <= (uart_rx_data_ready) ? ADDRINC : DATA_4;
|
||||
dataMem[7:0] <= (uart_rx_data_ready) ? uart_rx_data : dataMem[7:0];
|
||||
end
|
||||
ADDRINC: begin
|
||||
addrMem <= addrMem + 1;
|
||||
state <= (rx_count == size) ? HEAD_1 : DATA_1;
|
||||
end
|
||||
default: state <= HEAD_1;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
uart_min uart (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.write (uart_write),
|
||||
.data_in (uart_tx_data),
|
||||
.read (uart_read),
|
||||
.data_out (uart_rx_data),
|
||||
.data_ready (uart_rx_data_ready),
|
||||
.RxD (RxD),
|
||||
.TxD (TxD)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
+221
@@ -0,0 +1,221 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : uart_bootloader_v2.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-May-2010 GEA Initial design of standalone bootloader
|
||||
* 2.0 7-Jul-2012 GEA Added data memory bus to allow for general-purpose use.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* An RS-232 compatible UART coupled with the XUM bootloader.
|
||||
*
|
||||
* The UART is general-purpose and capable of sending and receiving at a
|
||||
* pre-determined BAUD rate (determined by the clocking module)
|
||||
* with 8 data bits, 1 stop bit, and no parity. In other words it
|
||||
* is 8N1 with only RxD and TxD signals. It uses two 256-byte FIFO
|
||||
* buffers, one for receiving and the other for transmitting.
|
||||
*
|
||||
* The XUM bootloader protocol is as follows:
|
||||
*
|
||||
* 1. Programmer sends 'XUM' ASCII bytes.
|
||||
* 2. Programmer sends a number indicating how many 32-bit data words
|
||||
* it has to send, minus 1. (For example, if it has one 32-bit data word,
|
||||
* this number would be 0.) The size of this number is 18 bits.
|
||||
* This means the minimum transmission size is 1 word (32 bits), and
|
||||
* the maximum transmission size is 262144 words, or exactly 1 MB.
|
||||
* This 18-bit number is sent MSB first, in three bytes, with the six
|
||||
* most-significant bits set to 0.
|
||||
* 3. The FPGA sends back the third size byte from the programmer, allowing
|
||||
* the programmer to determine if the FPGA is listening and conforming
|
||||
* to the XUM boot protocol.
|
||||
* 4. The programmer sends another 18-bit number indicating the starting
|
||||
* offset in memory where the data should be placed. Normally this will
|
||||
* be 0. This number is also sent in three bytes, and the six most-significant
|
||||
* bits of the first byte are ignored.
|
||||
* 5. The programmer sends the data. A copy of each byte that it sends will be
|
||||
* sent back to the programmer from the FPGA, allowing the programmer
|
||||
* to determine if all of the data was transmitted successfully.
|
||||
*
|
||||
* On reset, the bootloader is enabled by default. When the bootloader is enabled,
|
||||
* the data memory bus will not see any incoming data. To configure the UART for
|
||||
* general-purpose use, software must issue a write command to the UART
|
||||
* over the data memory bus with bit 8 set. This disables the boot protocol until
|
||||
* the UART is reset again and allows normal use. Note however that there is
|
||||
* a 5-second guard time after reset during which the boot loader is
|
||||
* enabled regardless of any software commands to disable it. After the 5 second
|
||||
* time has lapsed after reset, the software state determines the operating mode
|
||||
* of the UART.
|
||||
*/
|
||||
module uart_bootloader(
|
||||
input clock,
|
||||
input reset,
|
||||
input Read, // MMIO
|
||||
input Write, // MMIO
|
||||
input [8:0] DataIn, // MMIO
|
||||
output reg [16:0] DataOut, // MMIO
|
||||
output Ack, // MMIO
|
||||
output DataReady, // Can be used as an interrupt
|
||||
output BootResetCPU, // XUM Boot Protocol: Reset CPU
|
||||
output BootWriteMem, // XUM Boot Protocol: Write to CPU memory
|
||||
output reg [17:0] BootAddr, // XUM Boot Protocol
|
||||
output reg [31:0] BootData, // XUM Boot Protocol
|
||||
input RxD, // UART Rx Signal
|
||||
output TxD // UART Tx Signal
|
||||
);
|
||||
|
||||
localparam [4:0] IDLE=0, WRITE=1, READ=2, BUSW=3, XHEAD1=4, XHEAD2=5, XHEAD3=6, XSIZE1=7, XSIZE2=8, XSIZE3=9,
|
||||
XOFST1=10, XOFST2=11, XOFST3=12, XDATA1=13, XDATA2=14, XDATA3=15, XDATA4=16, XADDRI=17;
|
||||
|
||||
// UART module signals
|
||||
wire uart_write;
|
||||
reg uart_read;
|
||||
wire uart_data_ready;
|
||||
wire [7:0] uart_data_in;
|
||||
wire [7:0] uart_data_out;
|
||||
wire [8:0] uart_rx_count;
|
||||
|
||||
reg [8:0] DataIn_r; // Latch for incoming data to improve timing
|
||||
wire DisableBoot = DataIn_r[8]; // Software boot disable command is bit 8
|
||||
reg [28:0] BootTimedEnable; // Hardware override enabler for boot loader after reset
|
||||
reg BootSwEnabled; // Software enabled/disabled state of bootloader
|
||||
wire BootProtoEnabled; // Master bootloader enabled signal
|
||||
reg [17:0] rx_count; // Number of 32-bit words received (boot loader)
|
||||
reg [17:0] rx_size; // Number of 32-bit words to expect (boot loader)
|
||||
reg [4:0] state;
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
state <= IDLE;
|
||||
end
|
||||
else begin
|
||||
case (state)
|
||||
IDLE: begin
|
||||
if (Write) state <= WRITE;
|
||||
else if (Read) state <= READ;
|
||||
else if (BootProtoEnabled & uart_data_ready) state <= XHEAD1;
|
||||
else state <= IDLE;
|
||||
end
|
||||
WRITE: state <= BUSW;
|
||||
READ: state <= BUSW;
|
||||
BUSW: state <= ~(Read | Write) ? IDLE : BUSW;
|
||||
XHEAD1: state <= (uart_data_out == 8'h58) ? XHEAD2 : IDLE; // 'X'
|
||||
XHEAD2: state <= (uart_data_ready) ? ((uart_data_out == 8'h55) ? XHEAD3 : IDLE) : XHEAD2; // 'U'
|
||||
XHEAD3: state <= (uart_data_ready) ? ((uart_data_out == 8'h4D) ? XSIZE1 : IDLE) : XHEAD3; // 'M'
|
||||
XSIZE1: state <= (uart_data_ready) ? ((uart_data_out[7:2] == 6'b000000) ? XSIZE2 : IDLE) : XSIZE1;
|
||||
XSIZE2: state <= (uart_data_ready) ? XSIZE3 : XSIZE2;
|
||||
XSIZE3: state <= (uart_data_ready) ? XOFST1 : XSIZE3;
|
||||
XOFST1: state <= (uart_data_ready) ? XOFST2 : XOFST1;
|
||||
XOFST2: state <= (uart_data_ready) ? XOFST3 : XOFST2;
|
||||
XOFST3: state <= (uart_data_ready) ? XDATA1 : XOFST3;
|
||||
XDATA1: state <= (uart_data_ready) ? XDATA2 : XDATA1;
|
||||
XDATA2: state <= (uart_data_ready) ? XDATA3 : XDATA2;
|
||||
XDATA3: state <= (uart_data_ready) ? XDATA4 : XDATA3;
|
||||
XDATA4: state <= (uart_data_ready) ? XADDRI : XDATA4;
|
||||
XADDRI: state <= (rx_count == rx_size) ? IDLE : XDATA1;
|
||||
default: state <= IDLE;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
always @(*) begin
|
||||
case (state)
|
||||
IDLE: uart_read <= 0;
|
||||
WRITE: uart_read <= 0;
|
||||
READ: uart_read <= 1;
|
||||
BUSW: uart_read <= 0;
|
||||
XHEAD1: uart_read <= uart_data_ready;
|
||||
XHEAD2: uart_read <= uart_data_ready;
|
||||
XHEAD3: uart_read <= uart_data_ready;
|
||||
XSIZE1: uart_read <= uart_data_ready;
|
||||
XSIZE2: uart_read <= uart_data_ready;
|
||||
XSIZE3: uart_read <= uart_data_ready;
|
||||
XOFST1: uart_read <= uart_data_ready;
|
||||
XOFST2: uart_read <= uart_data_ready;
|
||||
XOFST3: uart_read <= uart_data_ready;
|
||||
XDATA1: uart_read <= uart_data_ready;
|
||||
XDATA2: uart_read <= uart_data_ready;
|
||||
XDATA3: uart_read <= uart_data_ready;
|
||||
XDATA4: uart_read <= uart_data_ready;
|
||||
XADDRI: uart_read <= 0;
|
||||
default: uart_read <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
DataIn_r <= ((state == IDLE) & Write) ? DataIn : DataIn_r;
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
DataOut <= (reset) ? 17'h00000 : ((state == READ) ? {uart_rx_count[8:0], uart_data_out[7:0]} : DataOut);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
BootTimedEnable <= (reset) ? 29'h00000000 : (BootTimedEnable != 29'h1dcd6500) ? BootTimedEnable + 1 : BootTimedEnable; // 5 sec @ 100 MHz
|
||||
BootSwEnabled <= (reset) ? 1 : ((state == WRITE) ? ~DisableBoot : BootSwEnabled);
|
||||
end
|
||||
|
||||
assign BootResetCPU = (state != IDLE) && (state != WRITE) && (state != READ) && (state != BUSW) &&
|
||||
(state != XHEAD1) && (state != XHEAD2) && (state != XHEAD3) && (state != XSIZE1);
|
||||
assign BootWriteMem = (state == XADDRI);
|
||||
assign uart_write = ((state == WRITE) & ~DisableBoot) |
|
||||
(uart_data_ready & ((state == XSIZE3) | (state == XDATA1) | (state == XDATA2) | (state == XDATA3) | (state == XDATA4)));
|
||||
assign uart_data_in = (state == WRITE) ? DataIn_r[7:0] : uart_data_out;
|
||||
assign Ack = (state == BUSW);
|
||||
assign DataReady = uart_data_ready;
|
||||
assign BootProtoEnabled = BootSwEnabled | (BootTimedEnable != 29'h1dcd6500);
|
||||
|
||||
|
||||
// XUM Boot Protocol Logic
|
||||
always @(posedge clock) begin
|
||||
BootData[31:24] <= (reset) ? 8'h00 : (((state == XDATA1) & uart_data_ready) ? uart_data_out : BootData[31:24]);
|
||||
BootData[23:16] <= (reset) ? 8'h00 : (((state == XDATA2) & uart_data_ready) ? uart_data_out : BootData[23:16]);
|
||||
BootData[15:8] <= (reset) ? 8'h00 : (((state == XDATA3) & uart_data_ready) ? uart_data_out : BootData[15:8]);
|
||||
BootData[7:0] <= (reset) ? 8'h00 : (((state == XDATA4) & uart_data_ready) ? uart_data_out : BootData[7:0]);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
BootAddr <= 18'h00000;
|
||||
end
|
||||
else if (state == XADDRI) begin
|
||||
BootAddr <= BootAddr + 1;
|
||||
end
|
||||
else begin
|
||||
BootAddr[17:16] <= ((state == XOFST1) & uart_data_ready) ? uart_data_out[1:0] : BootAddr[17:16];
|
||||
BootAddr[15:8] <= ((state == XOFST2) & uart_data_ready) ? uart_data_out[7:0] : BootAddr[15:8];
|
||||
BootAddr[7:0] <= ((state == XOFST3) & uart_data_ready) ? uart_data_out[7:0] : BootAddr[7:0];
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
rx_count <= (state == IDLE) ? 18'h00000 : ((state == XADDRI) ? rx_count + 1 : rx_count);
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
rx_size[17:16] <= (reset) ? 2'b00 : (((state == XSIZE1) & uart_data_ready) ? uart_data_out[1:0] : rx_size[17:16]);
|
||||
rx_size[15:8] <= (reset) ? 8'h00 : (((state == XSIZE2) & uart_data_ready) ? uart_data_out[7:0] : rx_size[15:8]);
|
||||
rx_size[7:0] <= (reset) ? 8'h00 : (((state == XSIZE3) & uart_data_ready) ? uart_data_out[7:0] : rx_size[7:0]);
|
||||
end
|
||||
|
||||
// UART Driver
|
||||
uart_min UART (
|
||||
.clock (clock),
|
||||
.reset (reset),
|
||||
.write (uart_write),
|
||||
.data_in (uart_data_in),
|
||||
.read (uart_read),
|
||||
.data_out (uart_data_out),
|
||||
.data_ready (uart_data_ready),
|
||||
.rx_count (uart_rx_count),
|
||||
.RxD (RxD),
|
||||
.TxD (TxD)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
demo_chip_rtl/rtl/mips32r1/trunk/Hardware/XUPV5-LX110T_SoC/MIPS32-Pipelined-Hw/src/UART/uart_clock.v
Executable
+56
@@ -0,0 +1,56 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : uart_clock.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 24-May-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Takes a 100 MHz clock and generates synchronous pulses for 115200 baud
|
||||
* and 16x 115200 baud (synchronized).
|
||||
*
|
||||
* This timing can be adjusted to allow for other baud rates.
|
||||
*/
|
||||
module uart_clock(
|
||||
input clock,
|
||||
output uart_tick,
|
||||
output uart_tick_16x
|
||||
);
|
||||
|
||||
// 100MHz / (2^13 / 151) == 16 * 115203.857 Hz
|
||||
// 100MHz / (2^17 / 151) == 115203.857 Hz
|
||||
// 66MHz / (2^14 / 453) == 16 * 115203.857 Hz
|
||||
// 66MHz / (2^18 / 453) == 115203.857 Hz
|
||||
|
||||
|
||||
// 66 MHz version
|
||||
reg [14:0] accumulator = 15'h0000;
|
||||
always @(posedge clock) begin
|
||||
accumulator <= accumulator[13:0] + 453;
|
||||
end
|
||||
assign uart_tick_16x = accumulator[14];
|
||||
|
||||
/*
|
||||
// 100 MHz version
|
||||
reg [13:0] accumulator = 14'h0000;
|
||||
always @(posedge clock) begin
|
||||
accumulator <= accumulator[12:0] + 151;
|
||||
end
|
||||
assign uart_tick_16x = accumulator[13];
|
||||
*/
|
||||
|
||||
//------------------------------
|
||||
reg [3:0] uart_16x_count = 4'h0;
|
||||
always @(posedge clock) begin
|
||||
uart_16x_count <= (uart_tick_16x) ? uart_16x_count + 1 : uart_16x_count;
|
||||
end
|
||||
assign uart_tick = (uart_tick_16x==1'b1 && (uart_16x_count == 4'b1111));
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+96
@@ -0,0 +1,96 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : uart_rx.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 26-May-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Recovers received data from the serial port with 16x clock over-sampling.
|
||||
* 'data_ready' is a synchronous pulse indicator. 8N1.
|
||||
*/
|
||||
module uart_rx(
|
||||
input clock,
|
||||
input reset,
|
||||
input RxD,
|
||||
input uart_tick_16x,
|
||||
output reg [7:0] RxD_data = 0,
|
||||
output data_ready
|
||||
);
|
||||
|
||||
/* Synchronize incoming RxD */
|
||||
reg [1:0] RxD_sync = 2'b11; //0;
|
||||
always @(posedge clock) RxD_sync <= (uart_tick_16x) ? {RxD_sync[0], RxD} : RxD_sync;
|
||||
|
||||
/* Filter Input */
|
||||
reg [1:0] RxD_cnt = 0;
|
||||
reg RxD_bit = 1; //0;
|
||||
always @(posedge clock) begin
|
||||
if (uart_tick_16x) begin
|
||||
case (RxD_sync[1])
|
||||
0: RxD_cnt <= (RxD_cnt == 2'b11) ? RxD_cnt : RxD_cnt + 1;
|
||||
1: RxD_cnt <= (RxD_cnt == 2'b00) ? RxD_cnt : RxD_cnt - 1;
|
||||
endcase
|
||||
RxD_bit <= (RxD_cnt == 2'b11) ? 0 : ((RxD_cnt == 2'b00) ? 1 : RxD_bit);
|
||||
end
|
||||
else begin
|
||||
RxD_cnt <= RxD_cnt;
|
||||
RxD_bit <= RxD_bit;
|
||||
end
|
||||
end
|
||||
|
||||
/* State Definitions */
|
||||
localparam [3:0] IDLE=0, BIT_0=1, BIT_1=2, BIT_2=3, BIT_3=4, BIT_4=5, BIT_5=6,
|
||||
BIT_6=7, BIT_7=8, STOP=9;
|
||||
reg [3:0] state = IDLE;
|
||||
|
||||
/* Next-bit spacing and clock locking */
|
||||
reg clock_lock = 0;
|
||||
reg [3:0] bit_spacing = 4'b1110; // Enable quick jumping from IDLE to BIT_0 when line was idle.
|
||||
always @(posedge clock) begin
|
||||
if (uart_tick_16x) begin
|
||||
if (~clock_lock) clock_lock <= ~RxD_bit; // We lock on when we detect a filtered 0 from idle
|
||||
else clock_lock <= ((state == IDLE) && (RxD_bit == 1'b1)) ? 0 : clock_lock;
|
||||
bit_spacing <= (clock_lock) ? bit_spacing + 1 : 4'b1110;
|
||||
end
|
||||
else begin
|
||||
clock_lock <= clock_lock;
|
||||
bit_spacing <= bit_spacing;
|
||||
end
|
||||
end
|
||||
wire next_bit = (bit_spacing == 4'b1111);
|
||||
|
||||
/* State Machine */
|
||||
always @(posedge clock) begin
|
||||
if (reset) state <= IDLE;
|
||||
else if (uart_tick_16x) begin
|
||||
case (state)
|
||||
IDLE: state <= (next_bit & (RxD_bit == 1'b0)) ? BIT_0 : IDLE; // Start bit is 0
|
||||
BIT_0: state <= (next_bit) ? BIT_1 : BIT_0;
|
||||
BIT_1: state <= (next_bit) ? BIT_2 : BIT_1;
|
||||
BIT_2: state <= (next_bit) ? BIT_3 : BIT_2;
|
||||
BIT_3: state <= (next_bit) ? BIT_4 : BIT_3;
|
||||
BIT_4: state <= (next_bit) ? BIT_5 : BIT_4;
|
||||
BIT_5: state <= (next_bit) ? BIT_6 : BIT_5;
|
||||
BIT_6: state <= (next_bit) ? BIT_7 : BIT_6;
|
||||
BIT_7: state <= (next_bit) ? STOP : BIT_7;
|
||||
STOP: state <= (next_bit) ? IDLE : STOP;
|
||||
default: state <= 4'bxxxx;
|
||||
endcase
|
||||
end
|
||||
else state <= state;
|
||||
end
|
||||
|
||||
/* Shift Register to Collect Rx bits as they come */
|
||||
wire capture = (uart_tick_16x & next_bit & (state!=IDLE) & (state!=STOP));
|
||||
always @(posedge clock) RxD_data <= (capture) ? {RxD_bit, RxD_data[7:1]} : RxD_data[7:0];
|
||||
assign data_ready = (uart_tick_16x & next_bit & (state==STOP));
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+79
@@ -0,0 +1,79 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*
|
||||
* File : uart_tx.v
|
||||
* Project : University of Utah, XUM Project MIPS32 core
|
||||
* Creator(s) : Grant Ayers (ayers@cs.utah.edu)
|
||||
*
|
||||
* Modification History:
|
||||
* Rev Date Initials Description of Change
|
||||
* 1.0 25-Mar-2010 GEA Initial design.
|
||||
*
|
||||
* Standards/Formatting:
|
||||
* Verilog 2001, 4 soft tab, wide column.
|
||||
*
|
||||
* Description:
|
||||
* Transmits bytes of data from the serial port. Capable of back-to-back
|
||||
* transmission of data for maximum bandwidth utilization.
|
||||
* 'TxD_start' must only pulse with a 'uart_tick' pulse. 8N1.
|
||||
*/
|
||||
module uart_tx (
|
||||
input clock,
|
||||
input reset,
|
||||
input uart_tick,
|
||||
input [7:0] TxD_data,
|
||||
input TxD_start, // Must happen with a uart_tick
|
||||
output ready,
|
||||
output reg TxD
|
||||
);
|
||||
|
||||
localparam [3:0] IDLE=0, START=1, BIT_0=2, BIT_1=3, BIT_2=4, BIT_3=5,
|
||||
BIT_4=6, BIT_5=7, BIT_6=8, BIT_7=9, STOP=10;
|
||||
|
||||
reg [3:0] tx_state = IDLE;
|
||||
reg [7:0] TxD_data_r = 8'h00; // Registered input data so it doesn't need to be held
|
||||
|
||||
assign ready = (tx_state == IDLE) || (tx_state == STOP);
|
||||
|
||||
always @(posedge clock) begin
|
||||
TxD_data_r <= (ready & TxD_start) ? TxD_data : TxD_data_r;
|
||||
end
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) tx_state <= IDLE;
|
||||
else begin
|
||||
case (tx_state)
|
||||
IDLE: if (TxD_start) tx_state <= START;
|
||||
START: if (uart_tick) tx_state <= BIT_0;
|
||||
BIT_0: if (uart_tick) tx_state <= BIT_1;
|
||||
BIT_1: if (uart_tick) tx_state <= BIT_2;
|
||||
BIT_2: if (uart_tick) tx_state <= BIT_3;
|
||||
BIT_3: if (uart_tick) tx_state <= BIT_4;
|
||||
BIT_4: if (uart_tick) tx_state <= BIT_5;
|
||||
BIT_5: if (uart_tick) tx_state <= BIT_6;
|
||||
BIT_6: if (uart_tick) tx_state <= BIT_7;
|
||||
BIT_7: if (uart_tick) tx_state <= STOP;
|
||||
STOP: if (uart_tick) tx_state <= (TxD_start) ? START : IDLE;
|
||||
default: tx_state <= 4'bxxxx;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
always @(tx_state, TxD_data_r) begin
|
||||
case (tx_state)
|
||||
IDLE: TxD <= 1;
|
||||
START: TxD <= 0;
|
||||
BIT_0: TxD <= TxD_data_r[0];
|
||||
BIT_1: TxD <= TxD_data_r[1];
|
||||
BIT_2: TxD <= TxD_data_r[2];
|
||||
BIT_3: TxD <= TxD_data_r[3];
|
||||
BIT_4: TxD <= TxD_data_r[4];
|
||||
BIT_5: TxD <= TxD_data_r[5];
|
||||
BIT_6: TxD <= TxD_data_r[6];
|
||||
BIT_7: TxD <= TxD_data_r[7];
|
||||
STOP: TxD <= 1;
|
||||
default: TxD <= 1'bx;
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
Executable
+165
@@ -0,0 +1,165 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
XUM MIPS32-R1 Release - 14 Oct 2012
|
||||
-----------------------------------
|
||||
|
||||
!!! Update January 1, 2014
|
||||
!!! This project has moved to GitHub. No updates will be committed
|
||||
!!! to the OpenCores repository, and the repository itself may become
|
||||
!!! unavailable at a later time.
|
||||
!!!
|
||||
!!! Please visit https://github.com/grantea/mips32r1 for the latest project.
|
||||
|
||||
|
||||
This is an OpenCores release of the XUM MIPS32 processor
|
||||
from release 2.0 of the XUM project at the University of Utah.
|
||||
|
||||
This project provides all of the hardware and software needed to build
|
||||
a MIPS32-compliant processor and several I/O peripherals all from scratch
|
||||
and implement them on an FPGA. It contains a GCC- and binutils-based
|
||||
cross-compiler toolchain to allow custom code to be compiled and run
|
||||
on the hardware.
|
||||
|
||||
|
||||
Directory Layout
|
||||
----------------
|
||||
|
||||
Hardware:
|
||||
-> MIPS32_Standalone: Processor HDL only. Top file is "Processor.v".
|
||||
|
||||
-> XUPV5-LX110T_SoC: Full System-on-Chip for XUPV5 board and Xilinx ISE 14.1
|
||||
Project Navigator. Useful as a starting point for other
|
||||
boards as well. See "HOWTO" in this directory for more
|
||||
information.
|
||||
|
||||
Software:
|
||||
-> demos: Software demos for XUM
|
||||
-> toolchain: Instructions for creating a MIPS crosscompiler toolchain
|
||||
-> xum_bootloader: A C# implementation of the XUM bootloader.
|
||||
|
||||
|
||||
Legal
|
||||
-----
|
||||
|
||||
All software and hardware included in this distribution is licensed under
|
||||
the GNU LGPL. See the file 'LEGAL' in this same directory for more information.
|
||||
|
||||
|
||||
Enjoy!
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
Directory Contents
|
||||
------------------
|
||||
util -> A set of utilities required to make XUM programs.
|
||||
XD* -> XUM MIPS32 single-core demos
|
||||
@@ -0,0 +1,29 @@
|
||||
README for XUM Demo 1 : Hello
|
||||
-----------------------------
|
||||
|
||||
Creator: Grant Ayers (ayers@cs.utah.edu)
|
||||
Date: 25 July 2012
|
||||
|
||||
|
||||
|
||||
DEMONSTRATES
|
||||
------------
|
||||
|
||||
LCD screen, basic hardware functionality test.
|
||||
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
Prints the message "It works!" to the LCD screen.
|
||||
|
||||
|
||||
|
||||
BUILDING AND RUNNING
|
||||
--------------------
|
||||
|
||||
To compile, enter the 'bin' directory and update the paths in the Makefile.
|
||||
Then run 'make' from within the same directory. Use the XUM bootloader to
|
||||
send the resulting .xum file to the FPGA.
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# Makefile for XUM
|
||||
#
|
||||
# Compiles code to run on the XUM platform, which
|
||||
# is based on MIPS32 and a GCC cross-compiler toolchain.
|
||||
#
|
||||
# Author: Grant Ayers (ayers@cs.utah.edu)
|
||||
# Date: 3 July 2012
|
||||
#
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
SRC = ../src
|
||||
MIPS_PREFIX = /home/User/XUM/gnu_mips/crosstools
|
||||
MIPS_BIN = $(MIPS_PREFIX)/bin
|
||||
MIPS_LIB = $(MIPS_PREFIX)/mips-elf/lib
|
||||
MIPS_CC = $(MIPS_BIN)/mips-elf-gcc-4.7.1.exe
|
||||
MIPS_AS = $(MIPS_BIN)/mips-elf-as.exe
|
||||
MIPS_LD = $(MIPS_BIN)/mips-elf-ld.exe
|
||||
MIPS_OBJDUMP = $(MIPS_BIN)/mips-elf-objdump.exe
|
||||
MIPS_OBJCOPY = $(MIPS_BIN)/mips-elf-objcopy.exe
|
||||
UTIL_PREFIX = /home/User/XUM/demos/util
|
||||
UTIL_CONVBIN = $(UTIL_PREFIX)/bintohex.exe
|
||||
UTIL_CONVXUM = $(UTIL_PREFIX)/bintoxum.exe
|
||||
|
||||
AS_FLAGS = -march=mips32 -EB -G0
|
||||
LD_FLAGS = -EB -static -Map app.map -T ../src/os/xum.ls
|
||||
LD_LIBS = -lm -lc -lgcc
|
||||
LD_SEARCH = -L$(MIPS_PREFIX)/mips-elf/lib \
|
||||
-L$(MIPS_PREFIX)/lib/gcc/mips-elf/4.7.1
|
||||
LD_DRIVER = $(MIPS_LD) $(LD_FLAGS) $(LD_SEARCH) $(LD_LIBS)
|
||||
CC_FLAGS_ARCH = -march=mips32 -EB -msoft-float -mno-mips16
|
||||
CC_FLAGS_LANG = -Wall -O2 -mgpopt -mxgot -G0
|
||||
CC_FLAGS_INC = -I../src/
|
||||
CC_FLAGS_AS = -Wa,-EB,-mips32,-msoft-float
|
||||
CC_FLAGS_LD = -nostdlib -nostartfiles -static -T ../src/os/xum.ls
|
||||
CC_FLAGS_LIB = -lm -lc -lgcc
|
||||
CC_DRIVER = $(MIPS_CC) $(CC_FLAGS_ARCH) $(CC_FLAGS_LANG) \
|
||||
$(CC_FLAGS_AS) $(CC_FLAGS_INC)
|
||||
|
||||
|
||||
all : app
|
||||
|
||||
app : app.o lcd.o boot.o vectors.o exceptions.o
|
||||
$(LD_DRIVER) $^ -o app.exe
|
||||
@$(MIPS_OBJDUMP) -EB --disassemble app.exe > app.lst
|
||||
@$(MIPS_OBJCOPY) -O binary -j .text app.exe app-code.bin
|
||||
@$(MIPS_OBJCOPY) -O binary -j .data app.exe app-data1.bin
|
||||
@$(MIPS_OBJCOPY) -O binary -j .sdata app.exe app-data2.bin
|
||||
@$(MIPS_OBJCOPY) -O binary -j .sbss app.exe app-data3.bin
|
||||
@$(MIPS_OBJCOPY) -O binary -j .bss app.exe app-data4.bin
|
||||
@cat app-data1.bin app-data2.bin app-data3.bin app-data4.bin >> app-data.bin
|
||||
@$(UTIL_CONVXUM) -d 4096 app-code.bin app-data.bin app.xum
|
||||
#@$(UTIL_CONVBIN) -c -b app-code.bin app-code.coe
|
||||
$(UTIL_CONVBIN) -c -b app.xum app.coe
|
||||
|
||||
|
||||
|
||||
app.o : $(SRC)/app/app.c
|
||||
$(CC_DRIVER) -c $(SRC)/app/app.c -o app.o
|
||||
|
||||
lcd.o : $(SRC)/drivers/lcd.c $(SRC)/drivers/lcd.h
|
||||
$(CC_DRIVER) -c $(SRC)/drivers/lcd.c -o lcd.o
|
||||
|
||||
boot.o : $(SRC)/os/boot.asm
|
||||
$(MIPS_AS) $(AS_FLAGS) -o boot.o $(SRC)/os/boot.asm
|
||||
|
||||
vectors.o : $(SRC)/os/vectors.asm
|
||||
$(MIPS_AS) $(AS_FLAGS) -o vectors.o $(SRC)/os/vectors.asm
|
||||
|
||||
exceptions.o : $(SRC)/os/exceptions.asm
|
||||
$(MIPS_AS) $(AS_FLAGS) -o exceptions.o $(SRC)/os/exceptions.asm
|
||||
|
||||
clean :
|
||||
rm -f *.o *.exe *.map *.coe *.bin *.map *.xum *.lst
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
#include "drivers/lcd.h"
|
||||
|
||||
char *message = "It works!";
|
||||
|
||||
int main(void)
|
||||
{
|
||||
LCD_clear();
|
||||
LCD_setPos(19);
|
||||
LCD_printString(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user