From 2d198a32c7955494169deeaff44623114f754fde Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Sun, 29 Mar 2020 23:18:26 -0400 Subject: [PATCH] update --- driver/sw/rtlsim/Makefile | 11 +++---- driver/tests/demo/Makefile | 8 ++--- driver/tests/demo/demo | Bin 40896 -> 45248 bytes driver/tests/demo/demo.cpp | 60 +++++++++++++++++++++++++++++++++++ driver/tests/demo/kernel.bin | Bin 93568 -> 93576 bytes rtl/simulate/Vortex.cpp | 2 +- rtl/simulate/Vortex_SOC.cpp | 2 +- 7 files changed, 71 insertions(+), 12 deletions(-) diff --git a/driver/sw/rtlsim/Makefile b/driver/sw/rtlsim/Makefile index ca3991b4..c64f1b12 100644 --- a/driver/sw/rtlsim/Makefile +++ b/driver/sw/rtlsim/Makefile @@ -1,5 +1,5 @@ -CFLAGS += -std=c++11 -O3 -Wall -Wextra -pedantic -Wfatal-errors -#CFLAGS += -std=c++11 -g -O0 -Wall -Wextra -pedantic -Wfatal-errors +#CFLAGS += -std=c++11 -O3 -Wall -Wextra -pedantic -Wfatal-errors +CFLAGS += -std=c++11 -g -O0 -Wall -Wextra -pedantic -Wfatal-errors USE_MULTICORE=1 @@ -23,10 +23,9 @@ SRCS = vortex.cpp ../vx_utils.cpp ../../../rtl/simulate/$(RTL_TOP).cpp RTL_INCLUDE = -I../../../rtl -I../../../rtl/interfaces -I../../../rtl/cache -I../../../rtl/VX_cache -I../../../rtl/shared_memory -I../../../rtl/pipe_regs -I../../../rtl/compat -THREADS ?= $(shell python3 -c 'import multiprocessing as mp; print(max(1, mp.cpu_count() // 2))') -VL_FLAGS += --threads $(THREADS) - -VL_FLAGS += -Wno-UNOPTFLAT -Wno-WIDTH +# Enable Verilator multithreaded simulation +#THREADS ?= $(shell python3 -c 'import multiprocessing as mp; print(max(1, mp.cpu_count() // 2))') +#VL_FLAGS += --threads $(THREADS) VL_FLAGS += -Wno-UNDRIVEN --Wno-PINMISSING -Wno-STMTDLY -Wno-WIDTH -Wno-UNSIGNED -Wno-UNOPTFLAT -Wno-LITENDIAN diff --git a/driver/tests/demo/Makefile b/driver/tests/demo/Makefile index 9d3049f9..48effb87 100644 --- a/driver/tests/demo/Makefile +++ b/driver/tests/demo/Makefile @@ -43,16 +43,16 @@ $(PROJECT): $(SRCS) $(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -L../../sw/simx -lvortex -o $@ run-fpga: $(PROJECT) - LD_LIBRARY_PATH=../../sw/opae:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin + LD_LIBRARY_PATH=../../sw/opae:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16 run-ase: $(PROJECT) - LD_LIBRARY_PATH=../../sw/opae/ase:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin + LD_LIBRARY_PATH=../../sw/opae/ase:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16 run-rtlsim: $(PROJECT) - LD_LIBRARY_PATH=../../sw/rtlsim:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin + LD_LIBRARY_PATH=../../sw/rtlsim:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16 run-simx: $(PROJECT) - LD_LIBRARY_PATH=../../sw/simx:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin + LD_LIBRARY_PATH=../../sw/simx:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16 .depend: $(SRCS) $(CXX) $(CXXFLAGS) -MM $^ > .depend; diff --git a/driver/tests/demo/demo b/driver/tests/demo/demo index 5821516814d470adde93575f7681e833e67a5bde..72482b2365fe251afa78e95154befc38683e5b9d 100755 GIT binary patch delta 13160 zcmdsed3aPs*7vRMbkbQ!ItigWYjt*FLKYwkfsnPKVS>US`x@4OfGi0zjM894X*Z82#Nxt=KGzxw>u5<`h4%-Up?unI{T?} zPSw4A`=;%%uI;?8*%GlhOp&cj9TerImb-S9pW!O#85PAU5e&UQK5bbN#AuZh&p2JL z;`fMfW{x1Kj z?rWTr|Jf%;EPlk0h>yp+b;oiU^Q#IZTrxhX;w@bvvxuv@9F~RNY#5?blq7MAMY0KE zl>SN9kFbo(J{%acF!@>7ZkjQ>DEG@@0iveSBAk9^mM*#eEx9_twLx;}B(|J-k!#3h zV?>Q%8p|b`V=k9P%Hlk0Hxjea_(UkdN^6hX(8?l>|4u!{z=taq zuYRK@7L0&IC}FY6h1lB_T>yau%5wKE_2(>X`HE?C7Su1Roi?*(X6@`{dz%AZVxl0h z$iWcPL@=8mZ^frBV?C7X6$dO*W0>F2=mhtiHxE7=6qoc=Q8u(}M7j7WPib&{%)CHF z(J8H(yr*tF9xot(3fYO~9yy)`R!JmOJn_H9aSCtkMt_v!9%) zU55|epg6iIXM700(LCpakLzYv+&=gOAN&;`ytc_C^@b1L>ftB*o@5&^PxTNmmT4;^ ze7X-_(G&#$hs=1J(Fdq=?evq>S|7YxR$BfS`w+r? z6s_>VNBH1Z``{ye@auf=J$>-aKKLjf{3eGFp_dP#)dz3(!N25#xA@@q_~4^`@cVu6 zF+TV<4ey}*YNxd%+Z!$$?Jh$}l2x&raJ80)79mGKoB8li*~k31|7jv^qtKT{?Q7U z>a%mTguf-2{O(*V;jaj$dhDDo;eQfLb=Wyl!echdED8wLAZ5Z@6$}jVZ~P>7newdPCy;!*`)6=E4W|KJ%7)s{CED;og1BzF z%kexxYuoC>+_w;}!|3GZ{-$)P-TeX?cNzZZLwZgl#ry=} zDXQ?A%dLu{I1ep=R=e{}D#=-PmtSgcVC_!Zjl4ET``QPA1+3UzPZ5J_t;+ooJf{*l zOuNCIN^7t+9%cksB+z`AHj+D70vis~E^_|@<4)Tqm*L%btI}|zt3JeKYdqrCISu=O zaM_x}UbAh$XOr`&%di6|N7!peowjW*+qNU;bk4PPPE$LnBl|8$FdKMD>t z71c1I<|hecEk75DsVRSlD)&2*JEqDZNO6(53_VL!J$*^fLtZ_5yY;Lfq${eEFfK!q%;-my>%%`%092h}?h?dLRlGt~oUSVV z7;^3u(&2DYrA_SC%z<^uI5>}ha)Q>_G-f{vi`3VE+O7T{2)(L4hSa-k`<=GSKEkfs zg~?#I@N-hwL96}@2bwB<#Yg(?+odnwwzAn?)2&|NYlz%5oPEgLkFi*w4H9ameh*N~ zR2h)%YgfQ5oe_3N(^E9JH>s(2${-$vN|)la?R1UUi5MKG=rl#O%OJ@xe0tM&C1+6) zY8ax(m!|x0Ww1+@lM_e4sycB!#_PmELb?p~aaM=ip@$@st*za*8cv~3R}ZvpTNaPe z-qdp~p%9)nJ3|$&cIp~ztJ$SbVCQAkP8ivl=(W?_ZD$OST0|jw83pVzFf8LOsS^48 zyW@uMN+P@~8G&m~x8xNmc>;F4l3Q;R{1~ZKL(mg~a4l7JtscI(+rX-Z;D=~$2o3=0 zvTblUZRcFrjT(0S)xA$hm%%~m+K-bcd0BMb;p^r`ui8^M&ERIDs6+ZKanfa3rx_r3@3=y*`lYJ+f6+ZZcFTuQ=uYtJzqea|^d0)CfZl~S z-ZH5D!Pmk^s5dn(;i`olvKmU3l7T~DRpauV*}DM8e!{v8OJu0p-ET=ITSvR?5voy_ z?Gf4u1sHK^KjO5#gqhEt=&-X6+Nrx;w%r45FVzJ!$jb?9usy;q9c?)DAOfw_^>;}u zinysH0Uqrq)$T>#!?L5PgahM#19sifUia_Cr3LYSP-eH}P5A3pyzUotyMK#xxD2~x z#M<2t0_=|Wdnh3_8U|Hev8rwkse7FyoktyzzSzqfj@_!hDWtEvOnTj>w$7{eHCzqh zWtWU~iHX!sQq@9hOSjgsK;Bs;KgvbC@1QaaxJ`eQSN}*=|1nkn>rm+a>6&yK`ule4 zzYe6YeyWn^q2F62L%`4-mwhNIH7?)KcP^~Jp;{P87PfjVoQm?sWg{V7hI^#b?e3=~ zkL^smZJk;r>$ECahbmd;wC!=(*7;P)8Ldk8xorCe+V=QV$vOwh1P-LD4s^hxJJ##K zsBQ;(0qOo3C7{(*eJE<_CerGD5R^-)J{5KZShd2!zk}CJB}a*E4A@jAyKBUaS@wP* z@-E0wXK;V=o%qt6k}`!>uaNPksH;7(^rrmb6l0g+LxPZ}e&2~cmWsY%Tqz${K6aS% zborQa+`^^~4wpBmeTHBhUGDsOnDd9~j4$Q4mm@#x-CbArZnr$l?xIkk$!8zdy4u;+ zS+keb&0ADcH}C#M)*1D4=FDDdRUe56YfPq?6cgi^xnOq9qWZa1i`5TY z03GxN!FmO0#MpMVtLq%b4vdtJv)^`g-N2ZK)muqT#QN7m0cA{-*k1gijvsmm@_bp%e=S6VKy0`vscB+ z*aThpw_*#1-QSA0V-pfj!kYx#^(f_`rbl&^J^c02fgu4#g@iuECso{xP1Z(8eUHVJ1u$MeLO<8#8@*;dJ;CR9!{z&-iq?o-tE>%U5_ttL12cl zzk$ofFT~-b(TnEdc%X-Rt@s3fAA=`^Ci+Sn{tDvdKc*e!wHK7PJX9t8b6E8sYfDp< zzX16+FCpShk{CY=7D+=V2;UI#7IZ3+AEtvi{YkMpIhwh}mgKQ1kD<=}mp8$o9YgHwEEO=1UjUOO%|Ey zaYh@W74lnFBJKh34arPor^T}LI#wv$>8U|)f%!X_N?$3=y_c{LgtK@4%u=i;WHY;t zB|e0djE4@BfNr%Tb4seT{}QW&`-E8P;nD2xWo?iop^YAjiTF%S(np&}%t%)Kd5`6Y z>Wrc6d9fiQ3tk<`NDUeW%YOlP`pUgmGTzkLUWMZ=kj))mL zN=FuPL`>1WWd-AJu|>z@6SyG_p7z;Iq^Y{s#aCHF9i!mQJD_F%9&20z7jw2i<9{Op zN`?zo|KXwS1X|Mm2rEj)cqHYPhjxeD7&v2wI;rz^Im-ypdOl8Cb7#(5q=-Fzf^&a^ zXGJ}mUIZ>U#EggOB?0L3pdk1aIHVuE3%vyY0n_@@v*J>pq?+L*^d`9;oPjmyD^t)n zkkDq7vA${pdI|2r381&_Ku=&^9_bh!3%S0Ok5-=?zZ1y&BE&Ki?Nt-We z%Mo<*eNy5Co?Mw1Xl!e9tXcnWHaPkm9Z~^f#i^WLMgJ>-m!-hlNI4ep9+uz#yx_S} zeSXDZm^dIM!r>_-LI6ObCO7K7Uzec7D*;idQsQnYA%ir8!l4F9PJdlPDV2Z08uYLU zd*^ebGJl=>v<2Ksp;bQu$5WxnZ-Yq88`Pr+HltOFI#O1d{~nN_%6!Bt$R^ZX#Bc{vzW0 zrG@q*yK!t1B-fQ@iBbI~R(y@ZO2}t5Kpj&o{ZPU@;58^K)CC+w9?Fa>00fmoSNR%v zXN_YKK+FJaBAZHii}<=gtnvvG<#Gt}@c2T@hn9RW1Dx^0;DP~}!VFB*y-VZDTLz<}g26s_Hi z3Wh!^?*lX=ai!2`ct*?`kb&PWpBRwfh=*fVtIS*x?pI6{A*FmXg+V8=;|c3slWMR0 zW5m$v&z{99R}h^hDwFi5d?&dZEa{v6C%Ql7D-3kFwcpD?!PX2!ipt_Xm9tSc)*aN7 z1AcUCAw7{<8KT4aV||x;LMC~s1SvzJ5ku=M(PD3Le!zE>=bPV&Z;B`QZ-VRP*Tvlf z)7bZ-exN<&uOJpO{|{);8H$onb+k3hjGLih_z`p=@#6fz31)gal9ZYUnq?i%@}x9k zv&<5s2E`=Jf!3r9KLpRR1t(-uCWYQ&LvoU`=y0*bil#y194nwA#j=Ow<{(5V(Z^{@ z5A;)F&eL=#cvE7p({vyfl$u#Y)0x1gW=V6E5KHYtnY7SlF*QdTDkk0n>Dmn9Ei6V1 zEEU9CB%S&*@fM4jC9y16I7%`dLGUE?Ug=sM?z&RP$f*U_@YEWq(oEA?5*v?_OTAx* z{cQOh+ckA@4@?Vnrdt#;KhqvK6L1Wxo}Sk48C(cL2O*;xGp`kcH(u!zq40S>{ zZ7|JEy3nB_b8xaQC`61L+$%2w-lPp9N?GV=)JEEHn%hIiVFRW8hR)iNp_6D{P4iKq zwc_c)$;>4Vpr0lFf&MX}FP&C&6I(HT`w2Kv{TLidZ>2z07s1c;9ki&G?3C%E0*bpPN{la>?!Nni^2blS|Z&;Bs$rYs`tg&vI*=S(ZBpY zwpz57m+?WQW`V92cYErFt*j?Y@5;?Mx=wVJk7S3%$ch9uT-;v~#V&}o6`V~GFI43B z8bu}+A4D}0pSYd>rfp*{1}!O%y;AT3*lWztw^z3 zhaH2xNPYvC%bt7}goK3{@Eqkx;?Lm}@4TSc7ieh2VZQWT|__d`FBPlC^bcz^H@;#YAll<@tS z59T>`th1DVg2AKx2iDYs!a4&@ds($04wUc>lW zV21Ntv2|FogTAPZ;yd8PZ~16AF`75xe)C@b14?`hABB93<>TP)IQ{|bj_2PX`V)9L zFcbM|xHXCQLtZEII27R&J_Gzy`4Y^h@ev5zbiM}j8s3O)FoSPJKa>9f{Ve`A?9S!_ zZ>A`7_|J&eT%Lin*YepAn8y#mzlFE8mH=ZsW07-!uI8qUks0$vdIwIX(+z@I2oRM|bip zn0bM3$GUg%92k3%AA%Dv@fNuCGIv4t5BxY*{|bKvns@Uru&G|Nxhbh_5!s_+c?`^GfJBz|W*A%0Ye;{v6_gMsas_T;6+F$2+_is^J)K#yZ~R z)riD#ZbY=&c`(ZV68{0lF7s-b|C%opTdU*qE+OjQ@l!B%jb}jWdrrsB5B#X2DA)NI zB=?3={X68fFCHM`_J^`av7ps zf`zO`TQMd3Jg9bncrN3Zl#hsf10Zecli)woubY4ct%ZsjM z!HjXx<^^jNyD=CmnRy&e*ibpta3aXYwmk%S@0Z6})27wnWw1|3sjj6K;0%1nRH5n0 z?5!wuR!EnUllV}R4<0eHZM$=^gI`0rsSNs-Pgl)Zj@Yq6I`H)^9joRpon5D}A`;iP zG&^b!BA#r33SM4SOAlsPG44GbAiw0OeTvpJ@F}E4*D|s;!V0L2(y4FxX;p0piiVY| z;A%(hFrrqd;3JM&`fZL?s^B_DZ3@bt4O78JN9})8bcUHJdJF|YN!v3s++h|$ygS7hb*i;wxlWNXBKc2|M=xgt1)!vO&^RqPR+wJ|L8few* zb*bP^8OAarLHG5;GFbL`h&O75Qz9J(cH4q@ssqz0lZrW@Xe72RD$i3=@-9l(GFh!C z6IB$7V(v_Z$!}Pwd1ax2vK+i}Z|JbCiHR}UE*4(f`cbiE_LoVx?P@zuE#p40X2Y5Z>Pgx2Lg{R1H4 zPh6a24b-JX&YiFWy$GG0>d++tf=r}DOW_psGaGyge$dVl@?Rn2}(e}d^U*r4G?1@GzV zlt7&=cJHH;zhOZ&3l`izbK0_bD`)SmoBC?h-mJRI;W3^E)}FJ-GcJr3I}!@TtVbWj zbMo_#n(>@G{IMv#QQ3si%x*|1NWuHNfLg^8&_a|pjAk}n>;M$1EXHVYXlI;OVRF#p zmDel(BR*X5ytjNie}rPf0d!~6E0Nxpq*~MD1sgn4{Bl#`f zm#IDYYN>Mx_0bKUMQH^*TVoPL70piudhQB6;eA00zb=kEX^#G@CVWm4M$}~cO!E9h zy&=$m8lZnVFjzb@)_3oy=ArtK+upw4ApYXV+CRh7rnD!qq2=VMqwK|+XCl`>YYE(6qaufk#Agcwb+sxqU(`HX ts9Ug5Y>g0wg2@Oc*dgAZ%fiuqA8~*=^AQ1Iid< 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 delta 3438 zcmai04Nz3q6~6cFd;8<^rw>pR*<}}G6{-|t*E-ff8d%zK;N*DX#XL==2oA#%$aB5kWeL?RyI z&Q|n9VpsIx=B_fL>(UcvI*~;Ep|_z%nSqen76Wmn0VepmJtSp$orF5Yq@D;Q@FPlC zQ^~o*`}Le}`!5Vjxq%9nX}IQnz0ZE~JVC0itH~x(I&ELEkc7gck9A!o+0Cb$vhPU- z%>UDDy-dV)X#_ab6CMrgx-Mr&`SzS9;B;dLPW19t(t`NCOB;ot-oFs(I>4o8-b zvLTa_QGIb{moTkTMmvxzW+Oa6DF-@ui<#u84H%9qm4Q0ii# z_UGiT#c4WPCigDw&{3CMm1P#7P-m~^{MBsGzK^?FBd^c-9p%biWG9d1%BB^$l=JVA z3-i(`HOMZmZfq7jq)G2@6dr~DLc<|*Ba&ior@^?;axU8cfC=bs=EoD#k<#WEDvK)^MspXzO@zgKtURh>N)c;1*!RK5nvev#eWb2pJCQ@Tkl_B}Q&rj+GA&9pF|*yO11!PKAow5|thB zAhuJ99g5bhcBFgW7>a41EJSF_5esU2e%?#DE%#aR$g^^NYcIdZ-|MWHbNxeXBJoS| zOK)`<;9|@t?!xuUq4o;6de*yih5W-`zr=B_+iZ8%9{J0i$9Q-HSG&FV2FlO8ifz}x=L0@*;GuHYUYs=4(-50+C z{AxB)kSTZmVKqE3d8oHlm*)DLvkG>}U*_$r9uenGhz(|T;Qf4Rl25%qioE6lrxBO- zeXt9%#W&Yb?q-c#{^4&q+R8#7)!Ph{3Z9ftcqsaeBt(Lako8usvl6uiCq?7nBx}6= zFV6A=&StaRGxVm88@fSjYQ<0+TO7%6!0-PlH4cLh0(U-(_K5S|ndUVMBf^;=OfrasdDP+- zNS|qjY|+HXD~I*ygBrZg9@|8`RyfHUDQX8Ow8feuegk%hm_r@Xq3(Pbn%x5NjgUuc zIDi#+ZcWqOYK*uw?o+6=yQrP_rgnhNv4|NpF=FGtjMc_}MWjZxUfE8h^=e!IJ^{G% zS+qx-_s%r02}BwdfbbCz#5`(o3#4HfB#KpPV#K;nL~5N{{7j4=T^IA-NKre$_~}@4 z#M?j&F^4+j1sDu@kGlkGVE}F++55~DB6S8M=Fr55 zHT*eNn;IZerCQ$%{(EX12D|~e^H{V;ocGQ)$HICL>(exiBhTSt?ciTx17iNPKavMQ zC%U%hgIFBJVjeCbmP7^!#tm>5#1QLI@#Cs^H=IBV3{V4kw1xw81Fu`tG~s5X2jc(# z5(2|7P`5WVOr-t?5i@FH#5PaFY9sI;>J2c&gWx4Keg*syz~-}Pk2vq0ZH|T1N%;Oh zj5UoT&*5S%2z)JPP#u_8hr`;1&*yTq{Qd{^bBj2@#yHUeI2FX&RPjdjl#0PypTO-w zvuF(mXaP$FJle>i#x2TGH_fBo)FdkL$yCZweOQxY4Gl4@Pb9{y0PZ;+PL=4Ds&V87q=HA*fW%;h?iQ#)xBmo5mc<_rFaoG_B?A^z<`4nfau^&jPS+ zrF|>4q$Hg9E^G?^b#4F)oZCu|D>Zv*i_SO