FIxed first circular issue

This commit is contained in:
felsabbagh3 2019-10-24 10:38:04 -04:00
parent de8de00f6e
commit 1e648c5819
19 changed files with 2302 additions and 2799 deletions

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -1,405 +1,405 @@
:0200000480007A
:10000000373500FF13050530930570002322B50036
:100010001300000013000000130000000326450039
:10002000130500006B000500938B0600130D0700FD
:10003000130F01009303050013051000635C7500A6
:1000400013010180130305006B5003001305150015
:100050006FF0DFFE1300000013000000130000002B
:1000600013000000130000001300000013010F0034
:1000700013050000930F0600938D0300130000008A
:1000000037050200930570002322B500130000009D
:100010001300000013000000032645001305000034
:100020006B000500938B0600130D0700130F0100F2
:100030009303050013051000635C75001301018034
:10004000130305006B500300130515006FF0DFFE6E
:100050001300000013000000130000001300000054
:10006000130000001300000013010F00130500002F
:10007000930F0600938D030013000000130000008F
:100080001300000013000000130000001300000024
:10009000130000001300000013000000EBE0BF019C
:100090001300000013000000EBE0BF01130000009C
:1000A0001300000013000000130000001300000004
:1000B0001300000013000000170500001305451B86
:1000C0006B40050017030000130343F66B000300A9
:1000D00067800000170200011302C22323200200E0
:1000E0002322120023242200232632002328420048
:1000F000232A5200232C6200232E72002320820226
:10010000232292022324A2022326B2022328C2021F
:10011000232AD202232CE202232EF20223200205FC
:1001200023221205232422052326320523284205F3
:10013000232A5205232C6205232E720523208207D1
:10014000232292072324A2072326B2072328C207CB
:10015000232AD207232CE207232EF20713021000D2
:1001600067800000170200011302C21A0320020078
:1001700083204200032182008321C2000322020166
:1001800083224201032382018323C201032402024A
:1001900083244202032582028325C202032602032E
:1001A00083264203032782038327C2030328020412
:1001B00083284204032982048329C204032A0205F6
:1001C000832A4205032B8205832BC205032C0206DA
:1001D000832C4206032D8206832DC206032E0207BE
:1001E000832E4207032F8207832FC20713020000CA
:1001F00067800000732500026780000073251002ED
:1002000067800000130101FE232E1100232C8100C2
:1002100013040102232604FE6F0040030327C4FEDB
:10022000B7170000938747973307F702B707008196
:1002300093870741B307F70013850700EF000044D9
:100240008327C4FE938717002326F4FE0327C4FEEA
:100250009307F001E3D4E7FC130000008320C10101
:10026000032481011301010267800000130101FDD5
:1002700023261102232481022322A1031304010354
:100280001300000013070D00B7170000938747976E
:100290003307F702B707008193870741B307F700D9
:1002A00013850700EF00405093070500638A07029B
:1002B00013070D00B70700811317270093878726C0
:1002C000B307F7001307100023A0E70093070D0002
:1002D00063960700EFF01FE96F00C0057300000090
:1002E00013070D00B7170000938747973307F702EE
:1002F000B707008193870741B307F700130784FD11
:100300009305070013850700EF000040832704FED4
:10031000138107008327C4FD832584FD032644FE43
:10032000832684FE0327C4FE13850700EFF0DFCF8A
:10033000730000008320C10203248102032D4102C7
:100340001301010367800000130101FB2326110440
:100350002324810413040105EFF0DFE92324A4FE24
:1003600093090100930710002326F4FE6F00C008D4
:100370000327C4FEB7170000938747973307F70298
:10038000B707008193870741B307F700138507007C
:10039000EF00804193070500639A07040327C4FE1A
:1003A000B7170000938747973307F702B707008115
:1003B00093870741B307F700130704FD9305070070
:1003C00013850700EF004034832784FD1381070065
:1003D000832744FD832504FD0326C4FD832604FEF4
:1003E000032744FE13850700EFF0DFCD8327C4FE0B
:1003F000938717002326F4FE8327C4FE032784FE79
:10040000E3E8E7F613810900EFF0DFCC9307020081
:1004100063880704B707008113850741EF00C038E0
:1004200093070500639E0702930784FB93850700EB
:10043000B707008113850741EF00002D832704FCD7
:10044000138107008327C4FB832584FB032644FC18
:10045000832684FC0327C4FC13850700EFF0DFBC70
:10046000130000008320C10403248104130101054B
:1004700067800000130101FB23261104232481045B
:1004800013040105232EA4FA232CB4FA232AC4FA58
:100490002328D4FAEFF01FD7EFF0DFD52322A4FEF4
:1004A00013090100232604FE232404FE6F00000923
:1004B000B709FFFF33013101832784FE2326F4FCB3
:1004C000832784FB2328F4FC93070100232AF4FCF0
:1004D000832744FB232CF4FC832704FB232EF4FC0A
:1004E0008327C4FE2320F4FE0327C4FEB7170000B1
:1004F000938747973307F702B70700819387074130
:10050000B307F7001307C4FC930507001385070022
:10051000EF0000198327C4FE938717002326F4FEFB
:100520008327C4FE032744FE63E4E700232604FE7A
:10053000832784FE938717002324F4FE032784FE79
:100540008327C4FBE366F7F613010900EFF0DFDF52
:10055000130000008320C10403248104130101055A
:1005600067800000130101FD23261102232481026C
:1005700013040103232EA4FC8325C4FDB7070081C7
:1005800013850704EF004035EFF0DFC62320A4FEFB
:10059000232604FE6F008006930710002326F4FE36
:1005A000232404FE6F00C003B7070081032784FEE5
:1005B0001317270093878726B307F70003A70700C1
:1005C000930710006318F7008327C4FE9387170072
:1005D0002326F4FE832784FE938717002324F4FE4A
:1005E000032784FE9307F001E3D0E7FC8325C4FED4
:1005F000B70700811385C704EF00002E0327C4FE50
:100600008327C4FDE36AF7F8232204FE6F0080020B
:10061000B7070081032744FE131727009387872617
:10062000B307F70023A00700832744FE9387170032
:100630002322F4FE832744FE032704FEE3EAE7FCBB
:10064000130000008320C10203248102130101036F
:1006500067800000130101FF23268100232471011C
:100660001304010193870B00138507000324C100C5
:10067000832B8100130101016780000093020500B4
:10068000130300009303700023A0620023A2620002
:1006900023A4620023A6720023A8620067800000E2
:1006A0009302050003A382001303130023A4620036
:1006B0001383420183AE420093935E0033037300C1
:1006C00003AE05002320C30103AE45002322C3016E
:1006D00003AE85002324C30103AEC5002326C30156
:1006E00003AE05012328C30103AE4501232AC3013C
:1006F000938E1E00130F20036394EE01930E0000EF
:1007000023A2D201678000009302050003A38200A8
:1000B00013000000170500001305451B6B400500E9
:1000C00017030000130343F66B0003006780000072
:1000D000170200011302022423200200232212002F
:1000E000232422002326320023284200232A520000
:1000F000232C6200232E72002320820223229202EC
:100100002324A2022326B2022328C202232AD202D7
:10011000232CE202232EF2022320020523221205C1
:10012000232422052326320523284205232A5205AB
:10013000232C6205232E7205232082072322920797
:100140002324A2072326B2072328C207232AD20783
:10015000232CE207232EF207130210006780000011
:10016000170200011302021B032002008320420039
:10017000032182008321C200032202018322420163
:10018000032382018323C201032402028324420247
:10019000032582028325C20203260203832642032B
:1001A000032782038327C20303280204832842040F
:1001B000032982048329C204032A0205832A4205F3
:1001C000032B8205832BC205032C0206832C4206D7
:1001D000032D8206832DC206032E0207832E4207BB
:1001E000032F8207832FC2071302000067800000DD
:1001F00073250002678000007325100267800000ED
:10020000130101FE232E1100232C8100130401028F
:10021000232604FE6F0040030327C4FEB717000027
:10022000938747973307F702B70700819387074102
:10023000B307F70013850700EF0000448327C4FECF
:10024000938717002326F4FE0327C4FE9307F001CB
:10025000E3D4E7FC130000008320C10103248101E3
:100260001301010267800000130101FD2326110222
:10027000232481022322A10313040103130000009D
:1002800013070D00B7170000938747973307F7024E
:10029000B707008193870741B307F700138507006D
:1002A000EF00405093070500638A070213070D0013
:1002B000B70700811317270093878726B307F70036
:1002C0001307100023A0E70093070D0063960700B3
:1002D000EFF01FE96F00C0057300000013070D0069
:1002E000B7170000938747973307F702B7070081D6
:1002F00093870741B307F700130784FD93050700B1
:1003000013850700EF000040832704FE13810700D8
:100310008327C4FD832584FD032644FE832684FEB3
:100320000327C4FE13850700EFF0DFCF7300000042
:100330008320C10203248102032D41021301010322
:1003400067800000130101FB23261104232481048C
:1003500013040105EFF0DFE92324A4FE9309010053
:10036000930710002326F4FE6F00C0080327C4FE85
:10037000B7170000938747973307F702B707008145
:1003800093870741B307F70013850700EF0080410B
:1003900093070500639A07040327C4FEB7170000FC
:1003A000938747973307F702B70700819387074181
:1003B000B307F700130704FD930507001385070033
:1003C000EF004034832784FD13810700832744FD19
:1003D000832504FD0326C4FD832604FE032744FE73
:1003E00013850700EFF0DFCD8327C4FE9387170046
:1003F0002326F4FE8327C4FE032784FEE3E8E7F602
:1004000013810900EFF0DFCC930702006388070433
:10041000B707008113850741EF00C0389307050037
:10042000639E0702930784FB93850700B70700814B
:1004300013850741EF00002D832704FC138107007B
:100440008327C4FB832584FB032644FC832684FC8A
:100450000327C4FC13850700EFF0DFBC1300000086
:100460008320C10403248104130101056780000077
:10047000130101FB23261104232481041304010525
:10048000232EA4FA232CB4FA232AC4FA2328D4FA5C
:10049000EFF01FD7EFF0DFD52322A4FE13090100F0
:1004A000232604FE232404FE6F000009B709FFFF82
:1004B00033013101832784FE2326F4FC832784FB48
:1004C0002328F4FC93070100232AF4FC832744FB30
:1004D000232CF4FC832704FB232EF4FC8327C4FE87
:1004E0002320F4FE0327C4FEB71700009387479725
:1004F0003307F702B707008193870741B307F70077
:100500001307C4FC9305070013850700EF000019CB
:100510008327C4FE938717002326F4FE8327C4FE97
:10052000032744FE63E4E700232604FE832784FEBA
:10053000938717002324F4FE032784FE8327C4FB3C
:10054000E366F7F613010900EFF0DFDF13000000A8
:100550008320C10403248104130101056780000086
:10056000130101FD23261102232481021304010338
:10057000232EA4FC8325C4FDB7070081138507043F
:10058000EF004035EFF0DFC62320A4FE232604FE53
:100590006F008006930710002326F4FE232404FE38
:1005A0006F00C003B7070081032784FE13172700DD
:1005B00093878726B307F70003A707009307100068
:1005C0006318F7008327C4FE938717002326F4FEE1
:1005D000832784FE938717002324F4FE032784FED9
:1005E0009307F001E3D0E7FC8325C4FEB707008141
:1005F0001385C704EF00002E0327C4FE8327C4FD24
:10060000E36AF7F8232204FE6F008002B707008137
:10061000032744FE1317270093878726B307F700A5
:1006200023A00700832744FE938717002322F4FEAC
:10063000832744FE032704FEE3EAE7FC13000000DF
:100640008320C1020324810213010103678000009B
:10065000130101FF232681002324710113040101EA
:1006600093870B00138507000324C100832B8100AF
:1006700013010101678000009302050013030000CD
:100680009303700023A0620023A2620023A46200EF
:1006900023A6720023A86200678000009302050071
:1006A00003A382001303130023A4620013834201F7
:1006B00083AE420093935E003303730003AE0500E4
:1006C0002320C30103AE45002322C30103AE8500EE
:1006D0002324C30103AEC5002326C30103AE0501D5
:1006E0002328C30103AE4501232AC301938E1E00B4
:1006F000130F20036394EE01930E000023A2D20196
:10070000678000009302050003A38200130000002D
:10071000130000001300000013000000130000008D
:1007200013000000130000001303F3FF23A4620072
:100730001383420183AE0200930F2003138F0E0038
:10074000130F1F006314FF01130F000023A0E20129
:1007500093935E0033037300032E030023A0C501AF
:10076000032E430023A2C501032E830023A4C50149
:10077000032EC30023A6C501032E030123A8C50130
:10078000032E430123AAC5016780000093020500E0
:1007900003A3820013050000130E200363146E00F0
:1007A00013051500678000009302050003A3820073
:1007B00013050000130E000063146E0013051500EE
:1007C000678000009302050003A3C20083A3020117
:1007D00033B5630067800000130141FF232011003F
:1007E0002322B1008345050063880500EF00C001A6
:1007F000130515006FF01FFF8320010083254100C2
:100800001301C10067800000B708010023A0B800F1
:1008100067800000130101FD2326110223248102B9
:1008200013040103232EA4FC0327C4FD9307F00047
:1008300063E4E702B70700810327C4FD131727000D
:100840009387871AB307F70083A70700138507006C
:10085000EFF09FF86F004007930700022326F4FE95
:10086000A30504FE8327C4FE9387C7FF0327C4FDA7
:10087000B357F70093F7F7002322F4FE832744FED3
:100880006386070093071000A305F4FE8347B4FEB8
:1008900063820702B7070081032744FE131727006E
:1008A0009387871AB307F70083A70700138507000C
:1008B000EFF09FF28327C4FE9387C7FF2326F4FE41
:1008C0008327C4FEE340F0FA8320C102032481029F
:1008D0001301010367800000130101FE232E1100A4
:1008E000232C8100130401022326A4FE2324B4FE3A
:1008F0000325C4FEEFF05FEE032584FEEFF09FF1C9
:10090000B707008113854709EFF01FED13000000C2
:100910008320C101032481011301010267800000CB
:10092000130101FD23261102232481021304010374
:10093000232EA4FC232CB4FC232AC4FC2328D4FC9F
:10094000B76702810327C4FD23ACE71AB7670281AA
:100950009387871B032784FD23A2E700B7670281E3
:100960009387871B032744FD23A4E700B767028111
:100970009387871B032704FD23A6E700EFF01F885A
:100980002324A4FE032704FD832784FEB357F70224
:100990002326F4FE032704FD832784FEB377F702A2
:1009A000638807008327C4FE938717002326F4FE7D
:1009B000B76702819387871B0327C4FE23A8E7003C
:1009C000032704FD832784FE6362F702B767028171
:1009D0009386871BB7170080138647A4832584FE60
:1009E000032504FDEFF01FA96F000002B767028125
:1009F0009386871BB7170080138647A4832504FDC1
:100A0000032504FDEFF01FA7EFF0CFFE2322A4FE85
:100A1000032704FD832744FE63F8E700032544FE13
:100A2000EFF05FB46F00C000032504FDEFF09FB34B
:100A3000130000008320C10203248102130101037B
:100A400067800000130101FA232E1104232C810476
:100A5000130401062326A4FA2324B4FAEFF09FBF5F
:100A6000232CA4FC832784FD83A70700232AF4FCFE
:100A7000832784FD83A747002328F4FC832784FD74
:100A800083A787002326F4FC832784FD83A707011F
:100A90002326F4FE0327C4FE8327C4FAB307F70214
:100AA0002324F4FE8327C4FE639A070093071000F3
:100AB0002326F4FE8327C4FA2324F4FE832784FD2F
:100AC00083A7C7002324F4FC232204FE6F00800DBB
:100AD000232004FE232E04FC6F008007032784FAE2
:100AE000832784FCB307F7020327C4FDB307F7008D
:100AF0002322F4FC032784FC8327C4FDB307F702F9
:100B0000032784FEB307F7002320F4FC832744FC6B
:100B100093972700032744FDB307F70003A70700B7
:100B2000832704FC93972700832604FDB387F600F0
:100B300083A70700B307F702032704FEB307F700F4
:100B40002320F4FE8327C4FD93871700232EF4FC93
:100B50000327C4FD832784FCE362F7F8032784FAA4
:100B6000832784FC3307F702832784FEB307F7004B
:100B7000232EF4FA8327C4FB939727000327C4FC92
:100B8000B307F700032704FE23A0E700832784FEB2
:100B9000938717002324F4FE832744FE93871700CE
:100BA0002322F4FE832744FE0327C4FEE3E2E7F298
:100BB000130000008320C1050324810513010106F1
:100BC00067800000130101FC232E1102232C8102F7
:100BD00013040104232EA4FC232CB4FC232AC4FCFC
:100BE0002328D4FC2326E4FCB76702810327C4FD35
:100BF00023A6E71CB76702819387C71C032784FDE0
:100C000023A2E700B76702819387C71C032744FD2F
:100C100023A4E700B76702819387C71C0327C4FC9E
:100C200023A6E700B76702819387C71C032704FD4B
:100C300023A8E700EFF08FDC2324A4FE0327C4FCE5
:100C4000832784FEB357F7022326F4FE0327C4FC50
:100C5000832784FEB377F702638807008327C4FEE7
:100C6000938717002326F4FEB76702819387C71C7A
:100C70000327C4FE23AAE7000327C4FC832784FEBE
:100C80006362F702B76702819386C71CB7170080BB
:100C90001386C7CF832584FE032504FDEFF08FFD67
:100CA0006F000002B76702819386C71CB7170080E8
:100CB0001386C7CF8325C4FC032504FDEFF08FFB0B
:100CC000EFF04FD32322A4FE032704FD832744FE25
:100CD00063F8E700032544FEEFF0DF886F00C000F3
:100CE000032504FDEFF01F88130000008320C103DB
:100CF000032481031301010467800000130101FB39
:100D0000232611042324810413040105232EA4FAAD
:100D1000232CB4FAEFF01F942320A4FE832704FEB3
:100D200083A70700232EF4FC832704FE83A7470034
:100D3000232CF4FC832704FE83A78700232AF4FCDA
:100D4000832704FE83A747012326F4FE0327C4FE5E
:100D50008327C4FBB307F7022324F4FE8327C4FED2
:100D6000639A0700930710002326F4FE8327C4FB31
:100D70002324F4FE832704FE83A7C7002328F4FC62
:100D8000232204FE6F00000C032784FB832704FD4D
:100D90003307F702832784FEB307F7002326F4FC0A
:100DA000032784FE832704FDB337F70093F7F70F7B
:100DB0002324F4FC832784FC93B71700A303F4FCDB
:100DC000834774FC138F0700B7170080938F07E3E6
:100DD0006B200F007B70FF018327C4FC93972700D3
:100DE0000327C4FDB307F70083A607008327C4FCCD
:100DF00093972700032784FDB307F70003A7070095
:100E00008327C4FC93972700032644FDB307F6000D
:100E10003387E60023A0E700832784FE938717002B
:100E20002324F4FEB7170080138E47E367000E00FB
:100E3000130000006B300000832744FE93871700E7
:100E40002322F4FE832744FE0327C4FEE3EEE7F2E9
:100E5000130000008320C104032481041301010551
:100E600067800000130101FC232E1102232C810254
:100E700013040104232EA4FC232CB4FC232AC4FC59
:100E80002328D4FC2326E4FCB76702810327C4FD92
:100E900023A6E71CB76702819387C71C032784FD3D
:100EA00023A2E700B76702819387C71C032744FD8D
:100EB00023A4E700B76702819387C71C0327C4FCFC
:100EC00023A6E700B76702819387C71C032704FDA9
:100ED00023A8E700EFF08FB22324A4FE0327C4FC6D
:100EE000832784FEB357F7022326F4FE0327C4FCAE
:100EF000832784FEB377F702638807008327C4FE45
:100F0000938717002326F4FEB76702819387C71CD7
:100F10000327C4FE23AAE7000327C4FC832784FE1B
:100F20006362F702B76702819386C71CB717008018
:100F30001386C7F9832584FE032504FDEFF08FD3C4
:100F40006F000002B76702819386C71CB717008045
:100F50001386C7F98325C4FC032504FDEFF08FD168
:100F6000EFF04FA92322A4FE032704FD832744FEAC
:100F700063F8E700032544FEEFF0CFDE6F00C0000A
:100F8000032504FDEFF00FDE130000008320C103F2
:100F9000032481031301010467800000130101FB96
:100FA000232611042324810413040105232EA4FA0B
:100FB000232CB4FAEFF00FEA2320A4FE832704FECB
:100FC00083A70700232EF4FC832704FE83A7470092
:100FD000232CF4FC832704FE83A78700232AF4FC38
:100FE000832704FE83A747012326F4FE0327C4FEBC
:100FF0008327C4FBB307F7022324F4FE8327C4FE30
:10100000639A0700930710002326F4FE8327C4FB8E
:101010002324F4FE832704FE83A7C7002328F4FCBF
:10102000232204FE6F00000C032784FB832704FDAA
:101030003307F702832784FEB307F7002326F4FC67
:10104000032784FE832704FDB337F70093F7F70FD8
:101050002324F4FC832784FC93B71700A303F4FC38
:10106000834774FC138F0700B7170080938F070D19
:101070006B200F007B70FF018327C4FC9397270030
:101080000327C4FDB307F70083A607008327C4FC2A
:1010900093972700032784FDB307F70003A70700F2
:1010A0008327C4FC93972700032644FDB307F6006B
:1010B0003387E64023A0E700832784FE9387170049
:1010C0002324F4FEB7170080138E470D67000E002F
:1010D000130000006B300000832744FE9387170045
:1010E0002322F4FE832744FE0327C4FEE3EEE7F247
:1010F000130000008320C1040324810413010105AF
:1011000067800000130101FC232E1102232C8102B1
:1011100013040104232EA4FC232CB4FC232AC4FCB6
:101120002328D4FC2326E4FCB76702810327C4FDEF
:1011300023A2E71EB76702819387471E032784FD1A
:1011400023A2E700B76702819387471E032744FD68
:1011500023A4E700B76702819387471E0327C4FCD7
:1011600023A6E700B76702819387471E032704FD84
:1011700023A8E700EFF08F882324A4FE0327C4FCF4
:10118000832784FEB357F7022326F4FE0327C4FC0B
:10119000832784FEB377F702638807008327C4FEA2
:1011A000938717002326F4FEB76702819387471EB3
:1011B0000327C4FE23AAE7000327C4FC832784FE79
:1011C0006362F702B76702819386471EB7170080F4
:1011D0001386C723832584FE032504FDEFF08FA922
:1011E0006F000002B76702819386471EB717008021
:1011F0001386C7238325C4FC032504FDEFF08FA7C6
:10120000EFE05FFF2322A4FE032704FD832744FEB3
:1012100063F8E700032544FEEFF0CFB46F00C00091
:10122000032504FDEFF00FB4130000008320C10379
:10123000032481031301010467800000130101FBF3
:10124000232611042324810413040105232EA4FA68
:10125000232CB4FAEFF00FC02320A4FE832704FE52
:1012600083A70700232EF4FC832704FE83A74700EF
:1012700083A70700232CF4FC832704FE83A78700A1
:10128000232AF4FC832704FE83A747012326F4FEC8
:101290000327C4FE8327C4FBB307F7022324F4FE0D
:1012A0008327C4FE639A0700930710002326F4FEE9
:1012B0008327C4FB2324F4FE832704FE83A7C700EF
:1012C0002328F4FC232204FE6F00000B032784FB79
:1012D000832704FD3307F702832784FEB307F70053
:1012E0002326F4FC032784FE832704FDB337F7008D
:1012F00093F7F70F2324F4FC832784FC93B717009C
:10130000A303F4FC834774FC138F0700B717008016
:10131000938F47366B200F007B70FF018327C4FC3F
:10132000939727000327C4FDB307F70083A60700A0
:101330008327C4FC93972700032744FDB307F700D6
:10134000032784FD3387E60023A0E700832784FE7C
:10135000938717002324F4FEB7170080138E873677
:1013600067000E00130000006B300000832744FE6E
:10137000938717002322F4FE832744FE0327C4FE2D
:10138000E3E6E7F4130000008320C1040324810492
:101390001301010567800000130101FC232E1102D7
:1013A000232C810213040104232EA4FC232CB4FC5F
:1013B000232AC4FC2328D4FC2326E4FCB76702813B
:1013C0000327C4FD23A2E71EB76702819387471E48
:1013D000032784FD23A2E700B76702819387471E96
:1013E000032744FD23A4E700B76702819387471EC4
:1013F0000327C4FC23A6E700B76702819387471E33
:10140000032704FD23A8E700EFE05FDF2324A4FE09
:101410000327C4FC832784FEB357F7022326F4FE78
:101420000327C4FC832784FEB377F7026388070091
:101430008327C4FE938717002326F4FEB767028133
:101440009387471E0327C4FE23AAE7000327C4FC93
:10145000832784FE6362F702B76702819386471E83
:10146000B71700801386074D832584FE032504FDEE
:10147000EFF04F806F000002B76702819386471E2E
:10148000B71700801386074D8325C4FC032504FD90
:10149000EFE05FFEEFE01FD62322A4FE032704FD4A
:1014A000832744FE63F8E700032544FEEFF08F8BAB
:1014B0006F00C000032504FDEFF0CF8A1300000089
:1014C0008320C1030324810313010104678000000A
:1014D000130101FB232611042324810413040105B5
:1014E000232EA4FA232CB4FAEFF0CF962320A4FEE7
:1014F000832704FE83A70700232EF4FC832704FE22
:1015000083A7470083A70700232CF4FC832704FE4E
:1015100083A78700232AF4FC832704FE83A74701BF
:101520002326F4FE0327C4FE8327C4FBB307F70278
:101530002324F4FE8327C4FE639A07009307100058
:101540002326F4FE8327C4FB2324F4FE832704FE12
:1015500083A7C7002328F4FC232204FE6F00000B9E
:10156000032784FB832704FD3307F702832784FEC8
:10157000B307F7002326F4FC032784FE832704FD2A
:10158000B337F70093F7F70F2324F4FC832784FC89
:1015900093B71700A303F4FC834774FC138F070071
:1015A000B7170080938F875F6B200F007B70FF0160
:1015B0008327C4FC939727000327C4FDB307F700D4
:1015C00083A607008327C4FC93972700032744FDC5
:1015D000B307F700032784FD3387E60223A0E70063
:1015E000832784FE938717002324F4FEB717008017
:1015F000138EC75F67000E00130000006B30000001
:10160000832744FE938717002322F4FE832744FE9A
:101610000327C4FEE3E6E7F4130000008320C104BF
:10162000032481041301010567800000130101FDFB
:101630002326810213040103232EA4FC232604FE87
:101640006F0000018327C4FE938717002326F4FE52
:101650000327C4FE8327C4FDE346F7FE1300000002
:101660000324C1021301010367800000130101FD7F
:10167000232611022324810213040103232EA4FC38
:10168000232CB4FCB76702811387C71F8327C4FDCF
:10169000B307F700130710002380E7008327C4FD7A
:1016A0006390070CA30104FE232604FE6F00800A4A
:1016B000232604FE232404FE6F004003B767028143
:1016C0001387C71F832784FEB307F70083C707006C
:1016D000638807008327C4FE938717002326F4FE40
:1016E000832784FE938717002324F4FE032784FEB8
:1016F000832784FDE344F7FC0327C4FE832784FD8E
:10170000631AF704232204FE6F000004B767028106
:101710001387C71F832744FEB307F7002380070002
:10172000B7970281130710002382E72C130560048A
:10173000EFF0DFEFB79702812382072C832744FE67
:10174000938717002322F4FE032744FE832784FD9A
:10175000E34EF7FA834734FEE39C07F46F00400240
:1017600013000000B797028183C7472C93C7170067
:1017700093F7F70FE39807FE13054006EFF01FEB12
:10178000130000008320C10203248102130101031E
:1017900067800000130101FF23268100130401016B
:1017A0009307000013080000138507009305080045
:1017B0000324C1001301010167800000130101FE31
:1017C000232E810013040102232604FE6F008004EF
:1017D000B76702810327C4FE131727009387C72129
:1017E000B307F7001307300023A0E700B7770281A3
:1017F0000327C4FE131727009387C721B307F700F9
:101800001307200023A0E7008327C4FE9387170057
:101810002326F4FE0327C4FE9307F00FE3DAE7FA6A
:10182000130000000324C1011301010267800000BE
:10183000130101FD23261102232481021304010355
:10184000232EA4FCB707008113858711EFE0DFF892
:10185000232604FE6F0080058327C4FE638E0700E5
:101860008327C4FE93F7F70063980700B70700814A
:101870001385C713EFE05FF68327C4FE9397270015
:101880000327C4FDB307F70083A7070013850700EC
:10189000EFE05FF8B707008113850714EFE0DFF38F
:1018A0008327C4FE938717002326F4FE0327C4FE74
:1018B0009307F00FE3D2E7FAB707008113854714C7
:1018C000EFE09FF1130000008320C1020324810296
:1018D0001301010367800000130101FF232611009B
:1018E0002324810013040101EFF05FEDB76702814B
:1018F0001385C721EFF0DFF393070000138507007E
:101900008320C100032481001301010167800000CE
:10072000130000001303F3FF23A4620013834201AC
:1007300083AE0200930F2003138F0E00130F1F00D0
:100740006314FF01130F000023A0E20193935E00E6
:1007500033037300032E030023A0C501032E4300BF
:1007600023A2C501032E830023A4C501032EC300C9
:1007700023A6C501032E030123A8C501032E4301AF
:1007800023AAC501678000009302050003A382002D
:1007900013050000130E200363146E0013051500EB
:1007A000678000009302050003A382001305000088
:1007B000130E000063146E0013051500678000001F
:1007C0009302050003A3C20083A3020133B56300B3
:1007D00067800000130141FF232011002322B10094
:1007E0008345050063880500EF00C001130515006F
:1007F0006FF01FFF83200100832541001301C1001A
:1008000067800000B708010023A0B80067800000DF
:10081000130101FD23261102232481021304010385
:10082000232EA4FC0327C4FD9307F00063E4E70232
:10083000B70700810327C4FD131727009387871A82
:10084000B307F70083A7070013850700EFF09FF8B1
:100850006F004007930700022326F4FEA30504FE61
:100860008327C4FE9387C7FF0327C4FDB357F70050
:1008700093F7F7002322F4FE832744FE63860700E4
:1008800093071000A305F4FE8347B4FE63820702BA
:10089000B7070081032744FE131727009387871AA1
:1008A000B307F70083A7070013850700EFF09FF257
:1008B0008327C4FE9387C7FF2326F4FE8327C4FE45
:1008C000E340F0FA8320C1020324810213010103F3
:1008D00067800000130101FE232E1100232C8100EC
:1008E000130401022326A4FE2324B4FE0325C4FE20
:1008F000EFF05FEE032584FEEFF09FF1B707008174
:1009000013854709EFF01FED130000008320C1019C
:10091000032481011301010267800000130101FD1E
:10092000232611022324810213040103232EA4FC95
:10093000232CB4FC232AC4FC2328D4FCB7670281EF
:100940000327C4FD23ACE71AB76702819387871B8F
:10095000032784FD23A2E700B76702819387871BE3
:10096000032744FD23A4E700B76702819387871B11
:10097000032704FD23A6E700EFF01F882324A4FE2D
:10098000032704FD832784FEB357F7022326F4FED2
:10099000032704FD832784FEB377F70263880700EB
:1009A0008327C4FE938717002326F4FEB7670281CE
:1009B0009387871B0327C4FE23A8E700032704FDB2
:1009C000832784FE6362F702B76702819386871BE1
:1009D000B7170080138607A4832584FE032504FD32
:1009E000EFF01FA96F000002B76702819386871B93
:1009F000B7170080138607A4832504FD032504FD93
:100A0000EFF01FA7EFF0CFFE2322A4FE032704FD83
:100A1000832744FE63F8E700032544FEEFF05FB44C
:100A20006F00C000032504FDEFF09FB3130000002A
:100A30008320C102032481021301010367800000A7
:100A4000130101FA232E1104232C8104130401063F
:100A50002326A4FA2324B4FAEFF09FBF232CA4FC8E
:100A6000832784FD83A70700232AF4FC832784FDC2
:100A700083A747002328F4FC832784FD83A78700EE
:100A80002326F4FC832784FD83A707012326F4FE95
:100A90000327C4FE8327C4FAB307F7022324F4FE16
:100AA0008327C4FE639A0700930710002326F4FEF1
:100AB0008327C4FA2324F4FE832784FD83A7C70079
:100AC0002324F4FC232204FE6F00800D232004FE67
:100AD000232E04FC6F008007032784FA832784FCFD
:100AE000B307F7020327C4FDB307F7002322F4FC82
:100AF000032784FC8327C4FDB307F702032784FE82
:100B0000B307F7002320F4FC832744FC93972700C6
:100B1000032744FDB307F70003A70700832704FC5E
:100B200093972700832604FDB387F60083A7070069
:100B3000B307F702032704FEB307F7002320F4FEF0
:100B40008327C4FD93871700232EF4FC0327C4FDDD
:100B5000832784FCE362F7F8032784FA832784FC65
:100B60003307F702832784FEB307F700232EF4FA36
:100B70008327C4FB939727000327C4FCB307F70020
:100B8000032704FE23A0E700832784FE9387170032
:100B90002324F4FE832744FE938717002322F4FEC8
:100BA000832744FE0327C4FEE3E2E7F213000000BC
:100BB0008320C1050324810513010106678000001D
:100BC000130101FC232E1102232C810213040104C2
:100BD000232EA4FC232CB4FC232AC4FC2328D4FCFD
:100BE0002326E4FCB76702810327C4FD23A6E71C84
:100BF000B76702819387C71C032784FD23A2E70000
:100C0000B76702819387C71C032744FD23A4E7002D
:100C1000B76702819387C71C0327C4FC23A6E7009C
:100C2000B76702819387C71C032704FD23A8E70049
:100C3000EFF08FDC2324A4FE0327C4FC832784FE6B
:100C4000B357F7022326F4FE0327C4FC832784FE50
:100C5000B377F702638807008327C4FE93871700E2
:100C60002326F4FEB76702819387C71C0327C4FEBF
:100C700023AAE7000327C4FC832784FE6362F702EC
:100C8000B76702819386C71CB7170080138687CF8A
:100C9000832584FE032504FDEFF08FFD6F00000225
:100CA000B76702819386C71CB7170080138687CF6A
:100CB0008325C4FC032504FDEFF08FFBEFF04FD339
:100CC0002322A4FE032704FD832744FE63F8E700E4
:100CD000032544FEEFF0DF886F00C000032504FD0C
:100CE000EFF01F88130000008320C1030324810359
:100CF0001301010467800000130101FB2326110486
:100D00002324810413040105232EA4FA232CB4FA0E
:100D1000EFF01F942320A4FE832704FE83A707007F
:100D2000232EF4FC832704FE83A74700232CF4FC26
:100D3000832704FE83A78700232AF4FC832704FE6D
:100D400083A747012326F4FE0327C4FE8327C4FBA1
:100D5000B307F7022324F4FE8327C4FE639A070037
:100D6000930710002326F4FE8327C4FB2324F4FEFC
:100D7000832704FE83A7C7002328F4FC232204FE54
:100D80006F00000C032784FB832704FD3307F70261
:100D9000832784FEB307F7002326F4FC032784FE91
:100DA000832704FDB337F70093F7F70F2324F4FCF0
:100DB000832784FC93B71700A303F4FC834774FCD8
:100DC000138F0700B7170080938FC7E26B200F00C7
:100DD0007B70FF018327C4FC939727000327C4FD82
:100DE000B307F70083A607008327C4FC9397270067
:100DF000032784FDB307F70003A707008327C4FC7C
:100E000093972700032644FDB307F6003387E600D7
:100E100023A0E700832784FE938717002324F4FE92
:100E2000B7170080138E07E367000E001300000061
:100E30006B300000832744FE938717002322F4FEC3
:100E4000832744FE0327C4FEE3EEE7F2130000000D
:100E50008320C1040324810413010105678000007D
:100E6000130101FC232E1102232C8102130401041F
:100E7000232EA4FC232CB4FC232AC4FC2328D4FC5A
:100E80002326E4FCB76702810327C4FD23A6E71CE1
:100E9000B76702819387C71C032784FD23A2E7005D
:100EA000B76702819387C71C032744FD23A4E7008B
:100EB000B76702819387C71C0327C4FC23A6E700FA
:100EC000B76702819387C71C032704FD23A8E700A7
:100ED000EFF08FB22324A4FE0327C4FC832784FEF3
:100EE000B357F7022326F4FE0327C4FC832784FEAE
:100EF000B377F702638807008327C4FE9387170040
:100F00002326F4FEB76702819387C71C0327C4FE1C
:100F100023AAE7000327C4FC832784FE6362F70249
:100F2000B76702819386C71CB7170080138687F9BD
:100F3000832584FE032504FDEFF08FD36F000002AC
:100F4000B76702819386C71CB7170080138687F99D
:100F50008325C4FC032504FDEFF08FD1EFF04FA9EA
:100F60002322A4FE032704FD832744FE63F8E70041
:100F7000032544FEEFF0CFDE6F00C000032504FD23
:100F8000EFF00FDE130000008320C1030324810370
:100F90001301010467800000130101FB23261104E3
:100FA0002324810413040105232EA4FA232CB4FA6C
:100FB000EFF00FEA2320A4FE832704FE83A7070097
:100FC000232EF4FC832704FE83A74700232CF4FC84
:100FD000832704FE83A78700232AF4FC832704FECB
:100FE00083A747012326F4FE0327C4FE8327C4FBFF
:100FF000B307F7022324F4FE8327C4FE639A070095
:10100000930710002326F4FE8327C4FB2324F4FE59
:10101000832704FE83A7C7002328F4FC232204FEB1
:101020006F00000C032784FB832704FD3307F702BE
:10103000832784FEB307F7002326F4FC032784FEEE
:10104000832704FDB337F70093F7F70F2324F4FC4D
:10105000832784FC93B71700A303F4FC834774FC35
:10106000138F0700B7170080938FC70C6B200F00FA
:101070007B70FF018327C4FC939727000327C4FDDF
:10108000B307F70083A607008327C4FC93972700C4
:10109000032784FDB307F70003A707008327C4FCD9
:1010A00093972700032644FDB307F6003387E640F5
:1010B00023A0E700832784FE938717002324F4FEF0
:1010C000B7170080138E070D67000E001300000095
:1010D0006B300000832744FE938717002322F4FE21
:1010E000832744FE0327C4FEE3EEE7F2130000006B
:1010F0008320C104032481041301010567800000DB
:10110000130101FC232E1102232C8102130401047C
:10111000232EA4FC232CB4FC232AC4FC2328D4FCB7
:101120002326E4FCB76702810327C4FD23A2E71E40
:10113000B76702819387471E032784FD23A2E70038
:10114000B76702819387471E032744FD23A4E70066
:10115000B76702819387471E0327C4FC23A6E700D5
:10116000B76702819387471E032704FD23A8E70082
:10117000EFF08F882324A4FE0327C4FC832784FE7A
:10118000B357F7022326F4FE0327C4FC832784FE0B
:10119000B377F702638807008327C4FE938717009D
:1011A0002326F4FEB76702819387471E0327C4FEF8
:1011B00023AAE7000327C4FC832784FE6362F702A7
:1011C000B76702819386471EB7170080138687236F
:1011D000832584FE032504FDEFF08FA96F00000234
:1011E000B76702819386471EB7170080138687234F
:1011F0008325C4FC032504FDEFF08FA7EFE05FFF1C
:101200002322A4FE032704FD832744FE63F8E7009E
:10121000032544FEEFF0CFB46F00C000032504FDAA
:10122000EFF00FB4130000008320C10303248103F7
:101230001301010467800000130101FB2326110440
:101240002324810413040105232EA4FA232CB4FAC9
:10125000EFF00FC02320A4FE832704FE83A707001E
:10126000232EF4FC832704FE83A7470083A70700EF
:10127000232CF4FC832704FE83A78700232AF4FC95
:10128000832704FE83A747012326F4FE0327C4FE19
:101290008327C4FBB307F7022324F4FE8327C4FE8D
:1012A000639A0700930710002326F4FE8327C4FBEC
:1012B0002324F4FE832704FE83A7C7002328F4FC1D
:1012C000232204FE6F00000B032784FB832704FD09
:1012D0003307F702832784FEB307F7002326F4FCC5
:1012E000032784FE832704FDB337F70093F7F70F36
:1012F0002324F4FC832784FC93B71700A303F4FC96
:10130000834774FC138F0700B7170080938F07364D
:101310006B200F007B70FF018327C4FC939727008D
:101320000327C4FDB307F70083A607008327C4FC87
:1013300093972700032744FDB307F700032784FD95
:101340003387E60023A0E700832784FE93871700F6
:101350002324F4FEB7170080138E473667000E0073
:10136000130000006B300000832744FE93871700B2
:101370002322F4FE832744FE0327C4FEE3E6E7F4BA
:10138000130000008320C10403248104130101051C
:1013900067800000130101FC232E1102232C81021F
:1013A00013040104232EA4FC232CB4FC232AC4FC24
:1013B0002328D4FC2326E4FCB76702810327C4FD5D
:1013C00023A2E71EB76702819387471E032784FD88
:1013D00023A2E700B76702819387471E032744FDD6
:1013E00023A4E700B76702819387471E0327C4FC45
:1013F00023A6E700B76702819387471E032704FDF2
:1014000023A8E700EFE05FDF2324A4FE0327C4FC4A
:10141000832784FEB357F7022326F4FE0327C4FC78
:10142000832784FEB377F702638807008327C4FE0F
:10143000938717002326F4FEB76702819387471E20
:101440000327C4FE23AAE7000327C4FC832784FEE6
:101450006362F702B76702819386471EB717008061
:101460001386C74C832584FE032504FDEFF04F80CF
:101470006F000002B76702819386471EB71700808E
:101480001386C74C8325C4FC032504FDEFE05FFEF3
:10149000EFE01FD62322A4FE032704FD832744FE8A
:1014A00063F8E700032544FEEFF08F8B6F00C00068
:1014B000032504FDEFF0CF8A130000008320C10351
:1014C000032481031301010467800000130101FB61
:1014D000232611042324810413040105232EA4FAD6
:1014E000232CB4FAEFF0CF962320A4FE832704FE2A
:1014F00083A70700232EF4FC832704FE83A747005D
:1015000083A70700232CF4FC832704FE83A787000E
:10151000232AF4FC832704FE83A747012326F4FE35
:101520000327C4FE8327C4FBB307F7022324F4FE7A
:101530008327C4FE639A0700930710002326F4FE56
:101540008327C4FB2324F4FE832704FE83A7C7005C
:101550002328F4FC232204FE6F00000B032784FBE6
:10156000832704FD3307F702832784FEB307F700C0
:101570002326F4FC032784FE832704FDB337F700FA
:1015800093F7F70F2324F4FC832784FC93B7170009
:10159000A303F4FC834774FC138F0700B717008084
:1015A000938F475F6B200F007B70FF018327C4FC84
:1015B000939727000327C4FDB307F70083A607000E
:1015C0008327C4FC93972700032744FDB307F70044
:1015D000032784FD3387E60223A0E700832784FEE8
:1015E000938717002324F4FEB7170080138E875FBC
:1015F00067000E00130000006B300000832744FEDC
:10160000938717002322F4FE832744FE0327C4FE9A
:10161000E3E6E7F4130000008320C10403248104FF
:101620001301010567800000130101FD23268102DB
:1016300013040103232EA4FC232604FE6F000001E3
:101640008327C4FE938717002326F4FE0327C4FED6
:101650008327C4FDE346F7FE130000000324C10204
:101660001301010367800000130101FD232611020D
:101670002324810213040103232EA4FC232CB4FC95
:10168000B76702811387C71F8327C4FDB307F7001D
:10169000130710002380E7008327C4FD6390070C25
:1016A000A30104FE232604FE6F00800A232604FE05
:1016B000232404FE6F004003B76702811387C71F0E
:1016C000832784FEB307F70083C7070063880700FA
:1016D0008327C4FE938717002326F4FE832784FE06
:1016E000938717002324F4FE032784FE832784FDB9
:1016F000E344F7FC0327C4FE832784FD631AF70441
:10170000232204FE6F000004B76702811387C71FFE
:10171000832744FEB307F70023800700B7970281B1
:10172000130710002382E72C13056004EFF0DFEFAE
:10173000B79702812382072C832744FE93871700E3
:101740002322F4FE032744FE832784FDE34EF7FAA9
:10175000834734FEE39C07F46F004002130000004F
:10176000B797028183C7472C93C7170093F7F70FEA
:10177000E39807FE13054006EFF01FEB130000008F
:101780008320C1020324810213010103678000004A
:10179000130101FF232681001304010193070000B8
:1017A0001308000013850700930508000324C100F7
:1017B0001301010167800000130101FE232E810047
:1017C00013040102232604FE6F008004B767028120
:1017D0000327C4FE131727009387C721B307F70019
:1017E0001307300023A0E700B77702810327C4FE68
:1017F000131727009387C721B307F70013072000AB
:1018000023A0E7008327C4FE938717002326F4FE56
:101810000327C4FE9307F00FE3DAE7FA1300000092
:101820000324C1011301010267800000130101FDBF
:10183000232611022324810213040103232EA4FC76
:10184000B707008113858711EFE0DFF8232604FE38
:101850006F0080058327C4FE638E07008327C4FEC4
:1018600093F7F70063980700B70700811385C71344
:10187000EFE05FF68327C4FE939727000327C4FD9C
:10188000B307F70083A7070013850700EFE05FF8B1
:10189000B707008113850714EFE0DFF38327C4FE49
:1018A000938717002326F4FE0327C4FE9307F00F47
:1018B000E3D2E7FAB707008113854714EFE09FF101
:1018C000130000008320C1020324810213010103DD
:1018D00067800000130101FF2326110023248100EB
:1018E00013040101EFF05FEDB76702811385C72193
:1018F000EFF0DFF393070000138507008320C1009A
:0C19000003248100130101016780000036
:02000004810079
:10000000300000003100000032000000330000002A
:10001000340000003500000036000000370000000A

View file

@ -6,7 +6,7 @@
.type _start, @function
.global _start
_start:
la a0, 0xFF003300
la a0, 0x020000
li a1, 7
sw a1, 4(a0)
nop

View file

@ -11,18 +11,20 @@ EXE=--exe ./simulate/test_bench.cpp
COMP=--compiler gcc
WNO=-Wno-UNOPTFLAT -Wno-UNDRIVEN --Wno-PINMISSING -Wno-STMTDLY -Wno-WIDTH -Wno-UNSIGNED
# WNO=-Wno-UNDRIVEN --Wno-PINMISSING -Wno-STMTDLY -Wno-WIDTH -Wno-UNSIGNED
WNO=
LIGHTW=-Wno-UNOPTFLAT
LIGHTW=
# LIGHTW=-Wno-UNOPTFLAT
# LIB=-LDFLAGS '-L/usr/local/systemc/'
LIB=
CF=-CFLAGS '-std=c++11 -O3'
DEB=--prof-cfuncs -DVL_DEBUG=1 --coverage --trace
DEB=--trace --prof-cfuncs -DVL_DEBUG=1
MAKECPP=(cd obj_dir && make -j -f VVortex.mk)
MAKECPP=(cd obj_dir && make -j -f VVortex.mk OPT='-DVL_DEBUG' VL_DEBUG=1 DVL_DEBUG=1)
# -LDFLAGS '-lsystemc'
VERILATOR:
@ -35,7 +37,7 @@ VERILATORnoWarnings:
compdebug:
echo "#define VCD_OUTPUT" > simulate/tb_debug.h
verilator $(COMP) -cc $(FILE) $(INCLUDE) $(EXE) $(LIB) -CFLAGS '-std=c++11 -DVL_DEBUG' $(WNO) $(DEB)
verilator_bin_dbg $(COMP) -cc $(FILE) $(INCLUDE) $(EXE) $(LIB) -CFLAGS '-std=c++11 -DVL_DEBUG' $(WNO) $(DEB)
RUNFILE: VERILATOR
$(MAKECPP)

View file

@ -72,7 +72,8 @@ VX_gpr_stage VX_gpr_stage(
VX_lsu load_store_unit(
// .clk (clk),
.clk (clk),
.reset (reset),
.VX_lsu_req (VX_lsu_req),
.VX_mem_wb (VX_mem_wb),
.VX_dcache_rsp(VX_dcache_rsp),

View file

@ -11,6 +11,7 @@
// `define SYN 1
`define CACHE_NUM_BANKS 8
`define NUMBER_BANKS 8
`define NUM_WORDS_PER_BLOCK 4

View file

@ -17,9 +17,7 @@ module VX_dmem_controller (
wire[`NT_M1:0] sm_driver_in_valid = VX_dcache_req.out_cache_driver_in_valid & {`NT{to_shm}};
wire[`NT_M1:0] cache_driver_in_valid = VX_dcache_req.out_cache_driver_in_valid & {`NT{~to_shm}};
// Cache don't understand
wire initial_request = (|cache_driver_in_valid);
wire read_or_write = (VX_dcache_req.out_cache_driver_in_mem_write != `NO_MEM_WRITE);
wire read_or_write = (VX_dcache_req.out_cache_driver_in_mem_write != `NO_MEM_WRITE) && (|cache_driver_in_valid);
@ -58,7 +56,8 @@ module VX_dmem_controller (
.i_p_read_or_write (read_or_write),
.o_p_readdata (cache_driver_out_data),
.o_p_delay (cache_delay),
.o_m_addr (VX_dram_req_rsp.o_m_addr),
.o_m_evict_addr (VX_dram_req_rsp.o_m_evict_addr),
.o_m_read_addr (VX_dram_req_rsp.o_m_read_addr),
.o_m_valid (VX_dram_req_rsp.o_m_valid),
.o_m_writedata (VX_dram_req_rsp.o_m_writedata),
.o_m_read_or_write (VX_dram_req_rsp.o_m_read_or_write),
@ -68,8 +67,7 @@ module VX_dmem_controller (
assign VX_dcache_rsp.in_cache_driver_out_data = to_shm ? sm_driver_out_data : cache_driver_out_data;
// assign VX_dcache_rsp.delay = sm_delay;
assign VX_dcache_rsp.delay = sm_delay || (!cache_delay);
assign VX_dcache_rsp.delay = sm_delay || cache_delay;
endmodule

View file

@ -25,10 +25,6 @@ VX_inst_meta_inter fe_inst_meta_fd();
VX_frE_to_bckE_req_inter VX_frE_to_bckE_req();
VX_inst_meta_inter fd_inst_meta_de();
// From decode
wire decode_branch_stall;
wire total_freeze = schedule_delay;
/* verilator lint_off UNUSED */

View file

@ -3,7 +3,8 @@
module VX_lsu (
// input wire clk,
input wire clk,
input wire reset,
VX_lsu_req_inter VX_lsu_req,
// Write back to GPR
@ -14,7 +15,7 @@ module VX_lsu (
output wire out_delay
);
// VX_inst_mem_wb_inter VX_mem_wb_temp();
VX_inst_mem_wb_inter VX_mem_wb_temp();
assign out_delay = VX_dcache_rsp.delay;
@ -33,32 +34,32 @@ module VX_lsu (
for (index = 0; index <= `NT_M1; index = index + 1) begin
assign VX_dcache_req.out_cache_driver_in_address[index] = address[index];
assign VX_dcache_req.out_cache_driver_in_data[index] = VX_lsu_req.store_data[index];
assign VX_dcache_req.out_cache_driver_in_valid[index] = (VX_lsu_req.valid[index] && !VX_dcache_rsp.delay);
assign VX_dcache_req.out_cache_driver_in_valid[index] = (VX_lsu_req.valid[index]);
assign VX_mem_wb.loaded_data[index] = VX_dcache_rsp.in_cache_driver_out_data[index];
assign VX_mem_wb_temp.loaded_data[index] = VX_dcache_rsp.in_cache_driver_out_data[index];
end
assign VX_dcache_req.out_cache_driver_in_mem_read = VX_lsu_req.mem_read;
assign VX_dcache_req.out_cache_driver_in_mem_write = VX_lsu_req.mem_write;
assign VX_mem_wb.rd = VX_lsu_req.rd;
assign VX_mem_wb.wb = VX_lsu_req.wb;
assign VX_mem_wb.wb_valid = VX_lsu_req.valid;
assign VX_mem_wb.wb_warp_num = VX_lsu_req.warp_num;
assign VX_mem_wb_temp.rd = VX_lsu_req.rd;
assign VX_mem_wb_temp.wb = VX_lsu_req.wb;
assign VX_mem_wb_temp.wb_valid = VX_lsu_req.valid;
assign VX_mem_wb_temp.wb_warp_num = VX_lsu_req.warp_num;
// wire zero_temp = 0;
// VX_generic_register #(.N(256)) register_wb_data
// (
// .clk (clk),
// .reset(zero_temp),
// .stall(zero_temp),
// .flush(zero_temp),
// .in ({VX_mem_wb_temp.loaded_data, VX_mem_wb_temp.rd, VX_mem_wb_temp.wb, VX_mem_wb_temp.wb_valid, VX_mem_wb_temp.wb_warp_num}),
// .out ({VX_mem_wb.loaded_data , VX_mem_wb.rd , VX_mem_wb.wb , VX_mem_wb.wb_valid , VX_mem_wb.wb_warp_num })
// );
wire zero_temp = 0;
VX_generic_register #(.N(142)) register_wb_data
(
.clk (clk),
.reset(reset),
.stall(zero_temp),
.flush(out_delay),
.in ({VX_mem_wb_temp.loaded_data, VX_mem_wb_temp.rd, VX_mem_wb_temp.wb, VX_mem_wb_temp.wb_valid, VX_mem_wb_temp.wb_warp_num}),
.out ({VX_mem_wb.loaded_data , VX_mem_wb.rd , VX_mem_wb.wb , VX_mem_wb.wb_valid , VX_mem_wb.wb_warp_num })
);
endmodule // Memory

View file

@ -10,16 +10,15 @@ module VX_priority_encoder_w_mask
);
integer i;
always @(*) begin
always @(valids) begin
index = 0;
found = 0;
mask = 0;
for (i = 0; i < N; i=i+1)
begin
if (!found && valids[i]) begin
for (i = 0; i < N; i=i+1) begin
if (valids[i]) begin
index = i[$clog2(N)-1:0];
found = 1;
mask[i[$clog2(N)-1:0]] = 1;
mask[i[$clog2(N)-1:0]] = 1 << i;
end
end
end

View file

@ -8,7 +8,8 @@ module Vortex(
input wire[31:0] icache_response_instruction,
output wire[31:0] icache_request_pc_address,
// Req
output reg [31:0] o_m_addr,
output reg [31:0] o_m_read_addr,
output reg [31:0] o_m_evict_addr,
output reg o_m_valid,
output reg [31:0] o_m_writedata[`NUMBER_BANKS - 1:0][`NUM_WORDS_PER_BLOCK-1:0],
output reg o_m_read_or_write,
@ -16,32 +17,9 @@ module Vortex(
// Rsp
input wire [31:0] i_m_readdata[`NUMBER_BANKS - 1:0][`NUM_WORDS_PER_BLOCK-1:0],
input wire i_m_ready,
// Remove Start
input wire[31:0] in_cache_driver_out_data[`NT_M1:0],
output wire[31:0] out_cache_driver_in_address[`NT_M1:0],
output wire[2:0] out_cache_driver_in_mem_read,
output wire[2:0] out_cache_driver_in_mem_write,
output wire out_cache_driver_in_valid[`NT_M1:0],
output wire[31:0] out_cache_driver_in_data[`NT_M1:0],
// Remove end
output wire out_ebreak
output wire out_ebreak
);
// assign out_cache_driver_in_address = 0;
assign out_cache_driver_in_mem_read = `NO_MEM_READ;
assign out_cache_driver_in_mem_write = `NO_MEM_WRITE;
// assign out_cache_driver_in_valid = 0;
// assign out_cache_driver_in_data = 0;
// assign out_cache_driver_in_address = VX_dcache_req.out_cache_driver_in_address;
// assign out_cache_driver_in_mem_read = VX_dcache_req.out_cache_driver_in_mem_read;
// assign out_cache_driver_in_mem_write = VX_dcache_req.out_cache_driver_in_mem_write;
// assign out_cache_driver_in_valid = VX_dcache_req.out_cache_driver_in_valid;
// assign out_cache_driver_in_data = VX_dcache_req.out_cache_driver_in_data;
// assign VX_dcache_rsp.in_cache_driver_out_data = in_cache_driver_out_data;
// Dcache Interface
VX_dcache_response_inter VX_dcache_rsp();
@ -50,7 +28,8 @@ VX_dcache_request_inter VX_dcache_req();
VX_dram_req_rsp_inter VX_dram_req_rsp();
assign o_m_addr = VX_dram_req_rsp.o_m_addr;
assign o_m_read_addr = VX_dram_req_rsp.o_m_read_addr;
assign o_m_evict_addr = VX_dram_req_rsp.o_m_evict_addr;
assign o_m_valid = VX_dram_req_rsp.o_m_valid;
assign o_m_read_or_write = VX_dram_req_rsp.o_m_read_or_write;
@ -61,7 +40,6 @@ genvar curr_word;
for (curr_bank = 0; curr_bank < `NUMBER_BANKS; curr_bank = curr_bank + 1) begin
for (curr_word = 0; curr_word < `NUM_WORDS_PER_BLOCK; curr_word = curr_word + 1) begin
assign o_m_writedata[curr_bank][curr_word] = VX_dram_req_rsp.o_m_writedata[curr_bank][curr_word];
assign VX_dram_req_rsp.i_m_readdata[curr_bank][curr_word] = i_m_readdata[curr_bank][curr_word];

View file

@ -46,7 +46,7 @@ module VX_Cache_Bank
// Inputs
input wire clk;
input wire [3:0] state;
//input wire write_from_mem;
//input wire write_from_mem;
// Reading Data
input wire[$clog2(NUMBER_INDEXES)-1:0] actual_index;
@ -118,7 +118,6 @@ module VX_Cache_Bank
.evict (write_from_mem),
.data_write(data_write),
.tag_write (o_tag),
// Outputs
.tag_use (tag_use),
.data_use (data_use),

View file

@ -10,7 +10,7 @@
`include "../VX_define.v"
//`include "VX_priority_encoder.v"
`include "VX_Cache_Bank.v"
// `include "VX_Cache_Bank.v"
//`include "cache_set.v"
@ -102,7 +102,6 @@ module VX_d_cache(clk,
reg[`NT_M1:0] threads_serviced_Qual;
VX_cache_bank_valid #(.NUMBER_BANKS(NUMBER_BANKS)) multip_banks(
.i_p_valid (use_valid),
@ -111,38 +110,52 @@ module VX_d_cache(clk,
);
reg detect_bank_conflict;
genvar bank_ind;
for (bank_ind = 0; bank_ind < NUMBER_BANKS; bank_ind=bank_ind+1)
begin
assign detect_bank_conflict = detect_bank_conflict | ($countones(thread_track_banks[bank_ind]) > 1);
VX_priority_encoder_w_mask #(.N(`NT)) choose_thread(
.valids(thread_track_banks[bank_ind]),
.mask (use_mask_per_bank[bank_ind]),
.index (index_per_bank[bank_ind]),
.found (valid_per_bank[bank_ind])
);
reg[`NT_M1:0] threads_serviced_Qual;
// reg detect_bank_conflict;
// genvar bank_ind;
// always @(*) begin
// for (bank_ind = 0; bank_ind < NUMBER_BANKS; bank_ind=bank_ind+1)
// begin
// detect_bank_conflict = detect_bank_conflict | ($countones(thread_track_banks[bank_ind]) > 1);
////////////////
assign new_final_data_read[index_per_bank[bank_ind]] = hit_per_bank[bank_ind] ? readdata_per_bank[bank_ind] : 0;
assign threads_serviced_per_bank[bank_ind] = use_mask_per_bank[bank_ind] & {`NT{hit_per_bank[bank_ind]}};
end
// end
// end
genvar bid;
for (bid = 0; bid < NUMBER_BANKS; bid=bid+1)
begin
assign threads_serviced_Qual = threads_serviced_Qual | threads_serviced_per_bank[bid];
wire[`NT_M1:0] use_threads_track_banks = thread_track_banks[bid];
VX_priority_encoder_w_mask #(.N(`NT)) choose_thread(
.valids(use_threads_track_banks),
.mask (use_mask_per_bank[bid]),
.index (index_per_bank[bid]),
.found (valid_per_bank[bid])
);
assign new_final_data_read[index_per_bank[bid]] = hit_per_bank[bid] ? readdata_per_bank[bid] : 0;
assign threads_serviced_per_bank[bid] = use_mask_per_bank[bid] & {`NT{hit_per_bank[bid]}};
end
wire[NUMBER_BANKS - 1 : 0] detect_bank_miss = (valid_per_bank & ~hit_per_bank);
// genvar tid;
assign threads_serviced_Qual = threads_serviced_per_bank[0] | threads_serviced_per_bank[1] | threads_serviced_per_bank[2] | threads_serviced_per_bank[3] | threads_serviced_per_bank[4] | threads_serviced_per_bank[5] | threads_serviced_per_bank[6] | threads_serviced_per_bank[7];
// for(tid = 0; tid )
wire[NUMBER_BANKS - 1 : 0] detect_bank_miss;
// genvar bbid;
// always @(*) begin
// for (bbid = 0; bbid < NUMBER_BANKS; bbid=bbid+1)
// begin
// assign threads_serviced_Qual = threads_serviced_Qual | threads_serviced_per_bank[bbid];
// end
// end
assign detect_bank_miss = (valid_per_bank & ~hit_per_bank);
wire delay;
assign delay = (new_stored_valid != 0); // add other states
assign delay = (new_stored_valid != 0) || (state != CACHE_IDLE); // add other states
assign o_p_delay = delay;
@ -173,7 +186,7 @@ module VX_d_cache(clk,
always @(posedge clk) begin
state <= new_state;
if (state == CACHE_IDLE) stored_valid <= new_stored_valid;
stored_valid <= new_stored_valid;
if (miss_found) begin
miss_addr <= i_p_addr[send_index_to_bank[miss_bank_index]];
@ -220,10 +233,10 @@ module VX_d_cache(clk,
.readdata (readdata_per_bank[bank_id]), // Data read
.eviction_addr (eviction_addr_per_bank[bank_id]),
.data_evicted (o_m_writedata[bank_id]),
.eviction_wb (eviction_wb[bank_ind]), // Something needs to be written back
.eviction_wb (eviction_wb[bank_id]), // Something needs to be written back
.fetched_writedata(i_m_readdata[bank_ind]) // Data From memory
.fetched_writedata(i_m_readdata[bank_id]) // Data From memory
);
end

View file

@ -1,568 +0,0 @@
// Cache Memory (8way 4word) //
// i_ means input port //
// o_ means output port //
// _p_ means data exchange with processor //
// _m_ means data exchange with memory //
// TO DO:
// - Send in a response from memory of what the data is from the test bench
`include "VX_define.v"
//`include "VX_priority_encoder.v"
`include "VX_Cache_Bank.v"
//`include "cache_set.v"
module VX_d_cache(clk,
rst,
i_p_initial_request,
i_p_addr,
//i_p_byte_en,
i_p_writedata,
i_p_read_or_write, // 0 = Read | 1 = Write
i_p_valid,
//i_p_write,
o_p_readdata,
o_p_readdata_valid,
o_p_waitrequest, // 0 = all threads done | 1 = Still threads that need to
o_m_addr,
//o_m_byte_en,
o_m_writedata,
o_m_read_or_write, // 0 = Read | 1 = Write
o_m_valid,
//o_m_write,
i_m_readdata,
//i_m_readdata_ready,
//i_m_waitrequest,
i_m_ready
//cnt_r,
//cnt_w,
//cnt_hit_r,
//cnt_hit_w
//cnt_wb_r,
//cnt_wb_w
);
parameter NUMBER_BANKS = 8;
localparam CACHE_IDLE = 0; // Idle
localparam SORT_BY_BANK = 1; // Determines the bank each thread will access
localparam INITIAL_ACCESS = 2; // Accesses the bank and checks if it is a hit or miss
localparam INITIAL_PROCESSING = 3; // Check to see if there were misses
localparam CONTINUED_PROCESSING = 4; // Keep checking status of banks that need to be written back or fetched
localparam DIRTY_EVICT_GRAB_BLOCK = 5; // Grab the full block of dirty data
localparam DIRTY_EVICT_WB = 6; // Write back this block into memory
localparam FETCH_FROM_MEM = 7; // Send a request to mem looking for read data
localparam FETCH2 = 8; // Stall until memory gets back with the data
localparam UPDATE_CACHE = 9; // Update the cache with the data read from mem
localparam RE_ACCESS = 10; // Access the cache after the block has been fetched from memory
localparam RE_ACCESS_PROCESSING = 11; // Access the cache after the block has been fetched from memory
//parameter cache_entry = 9;
input wire clk, rst;
input wire [`NT_M1:0] i_p_valid;
//input wire [`NT_M1:0][24:0] i_p_addr; // FIXME
input wire [`NT_M1:0][31:0] i_p_addr; // FIXME
input wire i_p_initial_request;
//input wire [3:0] i_p_byte_en;
input wire [`NT_M1:0][31:0] i_p_writedata;
input wire i_p_read_or_write; //, i_p_write;
output reg [`NT_M1:0][31:0] o_p_readdata;
output reg [`NT_M1:0] o_p_readdata_valid;
output wire o_p_waitrequest;
//output reg [24:0] o_m_addr; // Only one address is sent out at a time to memory -- FIXME
output reg [31:0] o_m_addr; // Address is xxxxxxxxxxoooobbbyy
output reg o_m_valid;
//output wire [255:0][31:0] evicted_data;
//output wire [3:0] o_m_byte_en;
//output reg [(NUMBER_BANKS * 32) - 1:0] o_m_writedata;
output reg[NUMBER_BANKS - 1:0][`NUM_WORDS_PER_BLOCK-1:0][31:0] o_m_writedata;
output reg o_m_read_or_write; //, o_m_write;
//input wire [(NUMBER_BANKS * 32) - 1:0] i_m_readdata; // Read Data that is passed from the memory module back to the controller
input wire[NUMBER_BANKS - 1:0][`NUM_WORDS_PER_BLOCK-1:0][31:0] i_m_readdata;
//input wire i_m_readdata_ready;
//input wire i_m_waitrequest;
input wire i_m_ready;
//output reg [31:0] cnt_r;
//output reg [31:0] cnt_w;
//output reg [31:0] cnt_hit_r;
//output reg [31:0] cnt_hit_w;
//output reg [31:0] cnt_wb_r;
//output reg [31:0] cnt_wb_w;
//wire [1:0] tag [`NT_M1:0];
//wire [3:0] index [`NT_M1:0];
//wire [2:0] bank [`NT_M1:0];
//wire all_done;
//integer i;
reg [`NT_M1:0] thread_done; // Maybe should have "thread_serviced" and "thread_done", serviced==checked cache
//reg [`NT_M1:0] thread_serviced; // Maybe should have "thread_serviced" and "thread_done", serviced==checked cache
reg [NUMBER_BANKS - 1:0] banks_ready;
//reg [NUMBER_BANKS - 1:0] banks_missed;
reg [NUMBER_BANKS - 1:0] banks_to_service;
reg [NUMBER_BANKS - 1:0] banks_wb_needed;
reg [NUMBER_BANKS - 1:0][31:0] banks_wb_addr;
//reg [NUMBER_BANKS - 1:0] bank_states;
//reg [NUMBER_BANKS - 1:0][31:0] banks_wb_data;
//reg [NUMBER_BANKS - 1:0][13:0] banks_in_addr;
reg [3:0] state;
reg [NUMBER_BANKS - 1:0][31:0] data_from_bank;
//reg got_valid_data;
//reg [31:0] data_to_write;
//reg [`NT_M1:0] thread_track_bank_0;
//reg [`NT_M1:0] thread_track_bank_1;
//reg [`NT_M1:0] thread_track_bank_2;
//reg [`NT_M1:0] thread_track_bank_3;
//reg [`NT_M1:0] thread_track_bank_4;
//reg [`NT_M1:0] thread_track_bank_5;
//reg [`NT_M1:0] thread_track_bank_6;
//reg [`NT_M1:0] thread_track_bank_7;
reg [NUMBER_BANKS - 1 : 0][`NT_M1:0] thread_track_banks;
reg [NUMBER_BANKS - 1 : 0] bank_has_access; // Will track if a bank has been accessed in this cycle
reg [NUMBER_BANKS - 1 : 0][31:0] bank_access_addr;
reg [NUMBER_BANKS - 1 : 0][31:0] bank_access_data;
reg [NUMBER_BANKS - 1 : 0][1:0] threads_in_banks;
//reg [1:0] thread_in_memory; // keeps track of threadID which is in memory
reg rd_or_wr;
//reg did_miss, needs_service; Commented out Oct 21
integer bnk;
integer found;
integer t_id;
//integer num_misses;
//integer num_evictions_to_wb;
integer i; //reg [1:0] correct_tag;
integer index;
//reg [3:0] correct_index;
//assign tag = i_p_addr[13:12];
assign o_p_waitrequest = (thread_done == 4'hF) ? 1'b0 : 1'b1; // change thread_done to be generic
//assign did_miss = (banks_missed != 8'h0) ? 1'b1 : 1'b0;
//assign needs_service = ((banks_to_service != 8'b0 || banks_to_service_temp != 8'b0)) ? 1'b1 : 1'b0; // added banks_to_service temp
//assign w_Test1 = r_Check ? 1'b1 : 1'b0;
//for ( i = 0;i < `NT_M1;i = i + 1) begin
// assign tag[i] = i_p_addr[i][13:12];
// Fares
// wire no_bank_misses;
// assign no_bank_misses = banks_to_service != 8'b0;
reg[NUMBER_BANKS - 1:0] banks_to_service_temp;
reg[NUMBER_BANKS - 1:0] banks_to_wb;
reg[NUMBER_BANKS - 1:0] banks_to_wb_temp;
reg[NUMBER_BANKS - 1:0] banks_all_help;
always @(posedge clk) begin
if (rst) begin
state <= CACHE_IDLE;
//banks_ready <= 8'b0;
//cnt_r <= 0;
//cnt_w <= 0;
//cnt_hit_r <= 0;
//cnt_hit_w <= 0;
//cnt_wb_r <= 0;
//cnt_wb_w <= 0;
end else begin
// Change Logic of which state the cache is in
case (state)
CACHE_IDLE:begin
if (i_p_initial_request == 1'b1) begin
state <= SORT_BY_BANK;
end
end
SORT_BY_BANK:begin
state <= INITIAL_ACCESS;
end
INITIAL_ACCESS:begin
if (thread_done == 4'hF) begin
state <= CACHE_IDLE;
end else begin
state <= INITIAL_PROCESSING;
end
end
INITIAL_PROCESSING:begin
//if (bank_has_access == banks_ready ) begin // if all hits
if (thread_done == 4'hF) begin
state <= INITIAL_ACCESS;
end else begin
state <= CONTINUED_PROCESSING;
end
end
CONTINUED_PROCESSING:begin
if (banks_to_wb == 8'b0 && banks_to_service == 8'b0) begin // If all threads are done, then the cache can go back into idle state (not currently fetching any requests)
//if (banks_to_wb_temp == 8'b0 && banks_to_service_temp == 8'b0) begin
state <= INITIAL_ACCESS;
//end else if (num_misses > 0) begin
end else if ((banks_to_wb != 8'b0)) begin // change 1pm
//end else if ((banks_to_wb_temp != 8'b0)) begin // change 1pm
state <= DIRTY_EVICT_GRAB_BLOCK;
//end else if (did_miss == 1'b1 || needs_service == 1'b1) begin
end else if(banks_to_service != 8'b0) begin
//end else if(banks_to_service_temp != 8'b0) begin
state <= FETCH_FROM_MEM;
// end else if (did_miss == 1'b0 && num_evictions_to_wb > 0) begin
//end else if (needs_service == 1'b0 && did_miss == 1'b0 && (banks_to_wb != 8'b0)) begin
//end else if (did_miss == 1'b0 && needs_service == 1'b0) begin
//state <= INITIAL_ACCESS;
end
end
FETCH_FROM_MEM:begin
state <= FETCH2;
end
FETCH2:begin
if (i_m_ready == 1'b1) begin
state <= UPDATE_CACHE; // Not sure about this one !!!!!! Check
end else begin
state <= FETCH2;
end
end
UPDATE_CACHE:begin
state <= RE_ACCESS;
end
RE_ACCESS:begin
state <= CONTINUED_PROCESSING;
end
RE_ACCESS_PROCESSING: begin
state <= CONTINUED_PROCESSING;
end
DIRTY_EVICT_GRAB_BLOCK:begin
state <= DIRTY_EVICT_WB;
end
DIRTY_EVICT_WB:begin
state <= CONTINUED_PROCESSING;
end
endcase
end
//tag[`NT_M1:0] <= i_p_addr[`NT_M1:0][13:12];
end
// Change values which will be fed into the cache
always @(*) begin
case (state)
CACHE_IDLE:begin
thread_done = 0;
o_m_read_or_write = 0;
o_m_valid = 0;
o_m_writedata = 0;
o_p_readdata = 0;
o_p_readdata_valid = 0;
bank_has_access = 8'b0;
//bank_states = CACHE_IDLE;
//thread_track_bank_0 = 4'b0;
//thread_track_bank_1 = 4'b0;
//thread_track_bank_2 = 4'b0;
//thread_track_bank_3 = 4'b0;
//thread_track_bank_4 = 4'b0;
//thread_track_bank_5 = 4'b0;
//thread_track_bank_6 = 4'b0;
//thread_track_bank_7 = 4'b0;
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
thread_track_banks[bnk] = 4'b0;
end
end
SORT_BY_BANK:begin
//bank_states = SORT_BY_BANK;
rd_or_wr = i_p_read_or_write;
for (t_id = 0; t_id <= `NT_M1; t_id = t_id + 1) begin
//t_id = {1'b0,t_id};
if (i_p_valid[t_id] == 1'b0) begin
thread_done[t_id] = 1'b1;
end
//if (i_p_valid[t_id] == 1'b1 && thread_done[t_id] == 1'b0) begin // Need logic for thread done
else if (i_p_addr[t_id][4:2] == 3'b000) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_0[t_id] = 1'b1;
thread_track_banks[0][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b001) begin // !!!!!!!
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_1[t_id] = 1'b1;
thread_track_banks[1][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b010) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_2[t_id] = 1'b1;
thread_track_banks[2][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b011) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_3[t_id] = 1'b1;
thread_track_banks[3][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b100) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_4[t_id] = 1'b1;
thread_track_banks[4][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b101) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_5[t_id] = 1'b1;
thread_track_banks[5][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b110) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_6[t_id] = 1'b1;
thread_track_banks[6][t_id] = 1'b1;
end
else if (i_p_addr[t_id][4:2] == 3'b111) begin
//banks_in_addr[0] = i_p_addr[t_id]; // WIll need to do this later
//thread_track_bank_7[t_id] = 1'b1;
thread_track_banks[7][t_id] = 1'b1;
end
end
end
INITIAL_ACCESS:begin
//bank_states = INITIAL_ACCESS;
o_m_valid = 1'b0;
// Before Access
// if (no_bank_misses) begin
// Dont do anything, next clock cycle it will switch back to (Fetch from mem)
// end else begin // Do logic to send requests to each bank (look through thread_track_bank regs)
bank_has_access = 8'b0;
for (t_id = 0; t_id <= `NT_M1; t_id = t_id + 1) begin
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
if(thread_track_banks[bnk][t_id] == 1'b1 && bank_has_access[bnk] == 1'b0) begin
bank_has_access[bnk] = 1'b1;
bank_access_data[bnk] = i_p_writedata[t_id];
bank_access_addr[bnk] = i_p_addr[t_id];
threads_in_banks[bnk] = t_id[1:0];
end
end
//if (banks_wb_needed[bnk]) begin // need to fix this for multiple misses
//o_m_read_or_write = 1'b0;
//o_m_addr = banks_wb_addr[bnk];
//o_m_valid = 1'b1;
//o_m_writedata = {banks_wb_data[bnk], 96'b0};
//end
//if(thread_track_bank_0[t_id] == 1'b1 && bank_has_access[0] == 1'b0) begin
//bank_has_access[0] = 1'b1;
//bank_access_data[0] = i_p_writedata[t_id];
//bank_access_addr[0] = i_p_addr[t_id];
//threads_in_banks[0] = t_id;
//end
// NEED TO UPDATE HITS (STORE IN THREADS_DONE)
end
//num_misses = {28'b0, $countones(banks_missed)};
//did_miss = (banks_missed == 4'hF);
// end
end
INITIAL_PROCESSING:begin
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
if(banks_ready[bnk]) begin // FIX to handle hits
thread_done[threads_in_banks[bnk]] = 1'b1;
o_p_readdata[threads_in_banks[bnk]] = data_from_bank[bnk];
if(i_p_read_or_write == 1'b0) begin
o_p_readdata_valid[threads_in_banks[bnk]] = 1'b1;
end
thread_track_banks[bnk][threads_in_banks[bnk]] = 1'b0; // Update that this thread does not need to be serviced again
end
end
//banks_to_service_temp = !banks_ready; // These are clean misses
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
assign banks_to_service_temp[bnk] = (banks_ready[bnk] || (bank_has_access[bnk] == 0)) ? 1'b0 : 1'b1;
assign banks_to_wb_temp[bnk] = (banks_wb_needed[bnk]);
assign banks_all_help[bnk] = banks_to_service_temp[bnk] || banks_to_wb_temp[bnk];
end
//bank_has_access = 8'b0; // Oct 23
end
CONTINUED_PROCESSING:begin
//for (i = `NW-1; i >= 0; i = i - 1) begin
// if (thread_done[threads_in_banks[bnk]] == 1'b1) begin // Not sure about this logic
// //index = i[`NW_M1:0];
// banks_to_service_temp[i] = 1'b0;
// banks_to_wb_temp[i] = 1'b0;
// end
//end
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
if(banks_ready[bnk]) begin // FIX to handle hits
thread_done[threads_in_banks[bnk]] = 1'b1;
o_p_readdata[threads_in_banks[bnk]] = data_from_bank[bnk];
if(i_p_read_or_write == 1'b0) begin
o_p_readdata_valid[threads_in_banks[bnk]] = 1'b1;
end
thread_track_banks[bnk][threads_in_banks[bnk]] = 1'b0; // Update that this thread does not need to be serviced again
// Added Oct 21
banks_to_service_temp[bnk] = 1'b0;
banks_to_wb_temp[bnk] = 1'b0;
end
end
bank_has_access = 8'b0; // Oct 23
end
FETCH_FROM_MEM:begin
// NEED TO ADD LOGIC TO SEE IF MISSES GO TO SAME BLOCK
index = 0;
found = 0;
for (i = `NW-1; i >= 0; i = i - 1) begin
if (banks_to_service[i]) begin // Not sure about this logic
//index = i[`NW_M1:0];
index = i;
found = 1;
end
end
if (found == 1) begin
//banks_missed[index] = 0;
//thread_done
//thread_in_memory = threads_in_banks[index];
//o_m_writedata = bank_access_data[index];
banks_to_service_temp[index] = 0;
o_m_addr = bank_access_addr[index];
o_m_valid = 1'b1;
o_m_read_or_write = 1'b0;
end
//bank_states = FETCH_FROM_MEM;
end
FETCH2:begin
o_m_valid = 1'b0;
end
UPDATE_CACHE:begin
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
//if(thread_track_banks[bnk][t_id] == 1'b1 && bank_has_access[bnk] == 1'b0) begin
bank_has_access[bnk] = 1'b1;
//bank_access_data[bnk] = i_m_readdata[(bnk+1)*32 - 1:bnk*32];
bank_access_addr[bnk] = o_m_addr;
threads_in_banks[bnk] = t_id[1:0];
//end
end
//bank_access_data = i_m_readdata;
rd_or_wr = 1'b1;
//thread_done[thread_in_memory] = 1'b1; // Removed, new cache style - Oct 21
//o_p_readdata[thread_in_memory] = i_m_readdata[i_p_addr[thread_in_memory][9:5]]; // Removed, new cache style
end
DIRTY_EVICT_WB:begin // this begininng logic should be added to dirty evict grab block
//thread_done[thread_in_memory] = 1'b1;
bank_has_access = 8'b0;
o_m_valid = 1'b1;
end
DIRTY_EVICT_GRAB_BLOCK:begin
index = 0;
found = 0;
for (i = `NW-1; i >= 0; i = i - 1) begin
if (banks_to_wb_temp[i]) begin
//index = i[`NW_M1:0];
index = i;
found = 1;
end
end
if (found == 1) begin
banks_to_wb_temp[index] = 0;
for (i = `NW-1; i >= 0; i = i - 1) begin
if (banks_to_wb_temp[i] && banks_wb_addr[index][31:7] == banks_wb_addr[i][31:7]) begin
//index = i[`NW_M1:0];
banks_to_wb_temp[i] = 0;
end
end
//thread_done
//thread_in_memory = threads_in_banks[index];
//o_m_writedata[(bnk+1)*32 - 1:bnk*32] = banks_wb_data[index];
o_m_addr = banks_wb_addr[index];
o_m_read_or_write = 1'b1;
end
//for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
//o_m_writedata[(bnk+1)*32 - 1:bnk*32] = banks_wb_data[index];
//end
// NEXT LINE CONTAINS DATA TO WB !!!! Think need to just change this to be read data and can remove banks_wb_data
//o_m_writedata = {banks_wb_data[7],banks_wb_data[6],banks_wb_data[5],banks_wb_data[4],banks_wb_data[3],banks_wb_data[2],banks_wb_data[1],banks_wb_data[0]};
//num_evictions_to_wb = {28'b0, $countones(banks_wb_needed)};
rd_or_wr = 1'b0;
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
//if(thread_track_banks[bnk][t_id] == 1'b1 && bank_has_access[bnk] == 1'b0) begin
bank_has_access[bnk] = 1'b1;
bank_access_addr[bnk] = o_m_addr;
//end
end
end
RE_ACCESS:begin
//bank_states = INITIAL_ACCESS;
o_m_valid = 1'b0;
// Before Access
// if (no_bank_misses) begin
// Dont do anything, next clock cycle it will switch back to (Fetch from mem)
// end else begin // Do logic to send requests to each bank (look through thread_track_bank regs)
//bank_has_access = banks_all_help & !(banks_to_wb) & !(banks_to_service);
for (t_id = 0; t_id <= `NT_M1; t_id = t_id + 1) begin
for (bnk = 0; bnk < NUMBER_BANKS; bnk = bnk + 1) begin
//bank_has_access[bnk] = banks_all_help[bnk] && !thread_done[threads_in_banks[bnk]]; // Not sure
bank_has_access[bnk] = banks_all_help[bnk] && !thread_done[t_id]; // Not sure
if(thread_track_banks[bnk][t_id] == 1'b1 && bank_has_access[bnk] == 1'b1) begin
//bank_has_access[bnk] = 1'b1;
bank_access_data[bnk] = i_p_writedata[t_id];
bank_access_addr[bnk] = i_p_addr[t_id];
threads_in_banks[bnk] = t_id[1:0];
end
end
end
end
RE_ACCESS_PROCESSING:begin
// After Access
end
endcase
end
always @(posedge clk) begin
banks_to_service <= banks_to_service_temp;
banks_to_wb <= banks_to_wb_temp;
end
genvar bank_id;
generate
for (bank_id = 0; bank_id < NUMBER_BANKS; bank_id = bank_id + 1)
begin
VX_Cache_Bank bank_structure (
.clk (clk),
.state (state),
.read_or_write (rd_or_wr),
.valid_in (bank_has_access[bank_id]),
.actual_index (bank_access_addr[bank_id][14:7]), // fix when size changes
.o_tag (bank_access_addr[bank_id][31:15]), // fix when size changes
.block_offset (bank_access_addr[bank_id][6:5]),
.writedata (bank_access_data[bank_id]),
//.fetched_writedata (i_m_readdata[(bank_id+1)*32-1 -: 32]),
.fetched_writedata (i_m_readdata[bank_id[3:0]]),
.readdata (data_from_bank[bank_id]),
.hit (banks_ready[bank_id]),
//.miss (banks_missed[bank_id]),
.eviction_wb (banks_wb_needed[bank_id]),
.eviction_addr (banks_wb_addr[bank_id]),
//.data_evicted (o_m_writedata[(bank_id+1)*32-1 -: 32])
.data_evicted (o_m_writedata[bank_id[3:0]])
);
end
endgenerate
//end
endmodule

View file

@ -8,7 +8,8 @@
interface VX_dram_req_rsp_inter ();
// Req
wire [31:0] o_m_addr;
wire [31:0] o_m_evict_addr;
wire [31:0] o_m_read_addr;
wire o_m_valid;
wire[`NUMBER_BANKS - 1:0][`NUM_WORDS_PER_BLOCK-1:0][31:0] o_m_writedata;
wire o_m_read_or_write;

View file

@ -3,6 +3,8 @@
#define NW 8
#define CACHE_NUM_BANKS 8
#define CACHE_WORDS_PER_BLOCK 4
#define R_INST 51
#define L_INST 3

View file

@ -5,11 +5,12 @@
int main(int argc, char **argv)
{
Verilated::debug(1);
Verilated::commandArgs(argc, argv);
Verilated::traceEverOn(true);
// Verilated::debug(1);
// bool passed = true;

View file

@ -45,6 +45,8 @@ class Vortex
VVortex * vortex;
unsigned start_pc;
bool refill;
unsigned refill_addr;
long int curr_cycle;
bool stop;
bool unit_test;
@ -190,120 +192,196 @@ bool Vortex::ibus_driver()
bool Vortex::dbus_driver()
{
uint32_t data_read;
uint32_t data_write;
uint32_t addr;
// std::cout << "DBUS DRIVER\n" << std::endl;
////////////////////// DBUS //////////////////////
bool did = false;
for (unsigned curr_th = 0; curr_th < NT; curr_th++)
if (this->refill)
{
if ((vortex->out_cache_driver_in_mem_write != NO_MEM_WRITE) && vortex->out_cache_driver_in_valid[curr_th])
this->refill = false;
unsigned unordered_mem[32];
int num_iter = 0;
for (int i = 0; i < CACHE_WORDS_PER_BLOCK; i++)
{
did = true;
data_write = (uint32_t) vortex->out_cache_driver_in_data[curr_th];
addr = (uint32_t) vortex->out_cache_driver_in_address[curr_th];
if (addr == 0x00010000)
{
std::cerr << (char) data_write;
}
// if ((addr >= 0x810002cc) && (addr < 0x810002d0))
// {
// int index = (addr - 0x810002cc) / 4;
// // std::cerr << GREEN << "1done[" << index << "] = " << data_write << DEFAULT << "\n";
// }
// if ((addr >= 0x810059f4) && (addr < 0x810059f4))
// {
// int index = (addr - 0x810059f4) / 4;
// // std::cerr << RED << "2done[" << index << "] = " << data_write << DEFAULT << "\n";
// }
if (vortex->out_cache_driver_in_mem_write == SB_MEM_WRITE)
{
data_write = ( data_write) & 0xFF;
ram.writeByte( addr, &data_write);
} else if (vortex->out_cache_driver_in_mem_write == SH_MEM_WRITE)
{
data_write = ( data_write) & 0xFFFF;
ram.writeHalf( addr, &data_write);
} else if (vortex->out_cache_driver_in_mem_write == SW_MEM_WRITE)
{
// printf("STORING %x in %x \n", data_write, addr);
data_write = data_write;
ram.writeWord( addr, &data_write);
}
}
}
// printf("----\n");
for (unsigned curr_th = 0; curr_th < NT; curr_th++)
{
if ((vortex->out_cache_driver_in_mem_read != NO_MEM_READ) && vortex->out_cache_driver_in_valid[curr_th])
{
did = true;
addr = (uint32_t) vortex->out_cache_driver_in_address[curr_th];
for (int j = 0; j < (CACHE_NUM_BANKS*8); j+=8)
{
unsigned addr = this->refill_addr + (4*num_iter);
unsigned data_read;
ram.getWord(addr, &data_read);
if (vortex->out_cache_driver_in_mem_read == LB_MEM_READ)
{
vortex->in_cache_driver_out_data[curr_th] = (data_read & 0x80) ? (data_read | 0xFFFFFF00) : (data_read & 0xFF);
} else if (vortex->out_cache_driver_in_mem_read == LH_MEM_READ)
{
vortex->in_cache_driver_out_data[curr_th] = (data_read & 0x8000) ? (data_read | 0xFFFF0000) : (data_read & 0xFFFF);
} else if (vortex->out_cache_driver_in_mem_read == LW_MEM_READ)
{
// printf("Reading mem - Addr: %x = %x\n", addr, data_read);
// std::cout << "READING - Addr: " << std::hex << addr << " = " << data_read << "\n";
// std::cout << std::dec;
vortex->in_cache_driver_out_data[curr_th] = data_read;
} else if (vortex->out_cache_driver_in_mem_read == LBU_MEM_READ)
{
vortex->in_cache_driver_out_data[curr_th] = (data_read & 0xFF);
} else if (vortex->out_cache_driver_in_mem_read == LHU_MEM_READ)
{
vortex->in_cache_driver_out_data[curr_th] = (data_read & 0xFFFF);
}
else
{
vortex->in_cache_driver_out_data[curr_th] = 0xbabebabe;
}
unordered_mem[i+j] = data_read;
num_iter++;
}
}
else
vortex->i_m_ready = 1;
for (int i = 0; i < CACHE_NUM_BANKS; i++)
{
vortex->in_cache_driver_out_data[curr_th] = 0xbabebabe;
for (int j = 0; j < CACHE_WORDS_PER_BLOCK; j++)
{
vortex->i_m_readdata[i][j] = unordered_mem[(i*CACHE_WORDS_PER_BLOCK)+j];
}
}
}
if (did && (NW > 1))
else
{
if (NW < NT)
if (vortex->o_m_valid)
{
this->stats_total_cycles += NT % (NW -1);
if (vortex->o_m_read_or_write)
{
unsigned ordered_mem[32];
// Create unordered mem
unsigned unordered_mem[32];
for (int i = 0; i < CACHE_NUM_BANKS; i++)
{
for (int j = 0; j < CACHE_WORDS_PER_BLOCK; j++)
{
unordered_mem[(i*CACHE_WORDS_PER_BLOCK)+j] = vortex->o_m_writedata[i][j];
}
}
// Order the memory
int num_iter = 0;
for (int i = 0; i < CACHE_NUM_BANKS; i++)
{
for (int j = 0; j < (CACHE_NUM_BANKS*CACHE_WORDS_PER_BLOCK); j+=CACHE_WORDS_PER_BLOCK)
{
printf("i: %d, j: %d, num_iter: %d\n", i, j, num_iter);
ordered_mem[i+j] = unordered_mem[num_iter];
num_iter++;
}
}
// Save the memory
for (int i = 0; i < (CACHE_WORDS_PER_BLOCK * CACHE_NUM_BANKS); i++)
{
unsigned addr = (vortex->o_m_evict_addr) + (4*i);
unsigned * data_addr = ordered_mem + i;
ram.writeWord( addr, data_addr);
}
}
// Respond next cycle
this->refill = true;
this->refill_addr = vortex->o_m_read_addr;
}
}
// uint32_t data_read;
// uint32_t data_write;
// uint32_t addr;
// // std::cout << "DBUS DRIVER\n" << std::endl;
// ////////////////////// DBUS //////////////////////
// bool did = false;
// for (unsigned curr_th = 0; curr_th < NT; curr_th++)
// {
// if ((vortex->out_cache_driver_in_mem_write != NO_MEM_WRITE) && vortex->out_cache_driver_in_valid[curr_th])
// {
// did = true;
// data_write = (uint32_t) vortex->out_cache_driver_in_data[curr_th];
// addr = (uint32_t) vortex->out_cache_driver_in_address[curr_th];
// if (addr == 0x00010000)
// {
// std::cerr << (char) data_write;
// }
// // if ((addr >= 0x810002cc) && (addr < 0x810002d0))
// // {
// // int index = (addr - 0x810002cc) / 4;
// // // std::cerr << GREEN << "1done[" << index << "] = " << data_write << DEFAULT << "\n";
// // }
// // if ((addr >= 0x810059f4) && (addr < 0x810059f4))
// // {
// // int index = (addr - 0x810059f4) / 4;
// // // std::cerr << RED << "2done[" << index << "] = " << data_write << DEFAULT << "\n";
// // }
// if (vortex->out_cache_driver_in_mem_write == SB_MEM_WRITE)
// {
// data_write = ( data_write) & 0xFF;
// ram.writeByte( addr, &data_write);
// } else if (vortex->out_cache_driver_in_mem_write == SH_MEM_WRITE)
// {
// data_write = ( data_write) & 0xFFFF;
// ram.writeHalf( addr, &data_write);
// } else if (vortex->out_cache_driver_in_mem_write == SW_MEM_WRITE)
// {
// // printf("STORING %x in %x \n", data_write, addr);
// data_write = data_write;
// ram.writeWord( addr, &data_write);
// }
// }
// }
// // printf("----\n");
// for (unsigned curr_th = 0; curr_th < NT; curr_th++)
// {
// if ((vortex->out_cache_driver_in_mem_read != NO_MEM_READ) && vortex->out_cache_driver_in_valid[curr_th])
// {
// did = true;
// addr = (uint32_t) vortex->out_cache_driver_in_address[curr_th];
// ram.getWord(addr, &data_read);
// if (vortex->out_cache_driver_in_mem_read == LB_MEM_READ)
// {
// vortex->in_cache_driver_out_data[curr_th] = (data_read & 0x80) ? (data_read | 0xFFFFFF00) : (data_read & 0xFF);
// } else if (vortex->out_cache_driver_in_mem_read == LH_MEM_READ)
// {
// vortex->in_cache_driver_out_data[curr_th] = (data_read & 0x8000) ? (data_read | 0xFFFF0000) : (data_read & 0xFFFF);
// } else if (vortex->out_cache_driver_in_mem_read == LW_MEM_READ)
// {
// // printf("Reading mem - Addr: %x = %x\n", addr, data_read);
// // std::cout << "READING - Addr: " << std::hex << addr << " = " << data_read << "\n";
// // std::cout << std::dec;
// vortex->in_cache_driver_out_data[curr_th] = data_read;
// } else if (vortex->out_cache_driver_in_mem_read == LBU_MEM_READ)
// {
// vortex->in_cache_driver_out_data[curr_th] = (data_read & 0xFF);
// } else if (vortex->out_cache_driver_in_mem_read == LHU_MEM_READ)
// {
// vortex->in_cache_driver_out_data[curr_th] = (data_read & 0xFFFF);
// }
// else
// {
// vortex->in_cache_driver_out_data[curr_th] = 0xbabebabe;
// }
// }
// else
// {
// vortex->in_cache_driver_out_data[curr_th] = 0xbabebabe;
// }
// }
// if (did && (NW > 1))
// {
// if (NW < NT)
// {
// this->stats_total_cycles += NT % (NW -1);
// }
// }
// printf("******\n");
@ -376,15 +454,17 @@ bool Vortex::simulate(std::string file_to_simulate)
vortex->reset = 1;
vortex->clk = 0;
vortex->eval();
// m_trace->dump(10);
vortex->reset = 1;
vortex->clk = 1;
vortex->eval();
// m_trace->dump(11);
vortex->reset = 0;
vortex->clk = 0;
// unsigned cycles;
counter = 0;
this->stats_total_cycles = 10;
this->stats_total_cycles = 12;
while (this->stop && ((counter < 2)))
// while (this->stats_total_cycles < 10)
{