From 05c48c2cd99cd5b7b19405aa09cb90f868f18353 Mon Sep 17 00:00:00 2001 From: tilk Date: Wed, 22 Nov 2023 23:47:38 +0000 Subject: [PATCH] Transaction graph and docs cleanup (#521) --- .doctrees/api.doctree | Bin 34284 -> 20945 bytes .doctrees/assumptions.doctree | Bin 0 -> 5029 bytes .doctrees/auto_graph.doctree | Bin 24894 -> 24896 bytes .doctrees/current-graph.doctree | Bin 0 -> 26117 bytes .doctrees/development-environment.doctree | Bin 0 -> 22994 bytes .doctrees/environment.pickle | Bin 330814 -> 331107 bytes .doctrees/home.doctree | Bin 0 -> 5853 bytes .doctrees/index.doctree | Bin 3293 -> 3294 bytes .../miscellany/exceptions-summary.doctree | Bin 0 -> 36919 bytes .doctrees/problem-checklist.doctree | Bin 0 -> 6578 bytes .doctrees/scheduler/overview.doctree | Bin 0 -> 8260 bytes .../implementation/rs-impl.doctree | Bin 0 -> 30568 bytes .doctrees/shared-structs/rs.doctree | Bin 0 -> 20610 bytes .doctrees/synthesis/synthesis.doctree | Bin 0 -> 11720 bytes .doctrees/transactions.doctree | Bin 0 -> 56692 bytes _sources/assumptions.md.txt | 8 + _sources/auto_graph.rst.txt | 90 +-- _sources/current-graph.md.txt | 12 + _sources/development-environment.md.txt | 78 +++ _sources/home.md.txt | 36 ++ _sources/index.md.txt | 22 +- _sources/miscellany/exceptions-summary.md.txt | 153 +++++ _sources/problem-checklist.md.txt | 15 + _sources/scheduler/overview.md.txt | 46 ++ .../implementation/rs-impl.md.txt | 110 ++++ _sources/shared-structs/rs.md.txt | 91 +++ _sources/synthesis/synthesis.md.txt | 49 ++ _sources/transactions.md.txt | 336 ++++++++++ api.html | 28 +- assumptions.html | 125 ++++ auto_graph.html | 114 ++-- components/icache.html | 32 +- coreblocks.frontend.html | 24 +- coreblocks.fu.html | 24 +- coreblocks.fu.unsigned_multiplication.html | 24 +- coreblocks.html | 24 +- coreblocks.params.html | 24 +- coreblocks.peripherals.html | 24 +- coreblocks.scheduler.html | 24 +- coreblocks.stages.html | 24 +- coreblocks.structs_common.html | 24 +- coreblocks.utils.html | 24 +- current-graph.html | 581 ++++++++++++++++++ development-environment.html | 199 ++++++ genindex.html | 24 +- home.html | 150 +++++ index.html | 172 +++--- miscellany/exceptions-summary.html | 292 +++++++++ modules-coreblocks.html | 24 +- modules-transactron.html | 24 +- objects.inv | Bin 8112 -> 8084 bytes problem-checklist.html | 126 ++++ py-modindex.html | 24 +- scheduler/overview.html | 167 +++++ search.html | 24 +- searchindex.js | 2 +- shared-structs/implementation/rs-impl.html | 273 ++++++++ shared-structs/rs.html | 243 ++++++++ synthesis/synthesis.html | 172 ++++++ transactions.html | 430 +++++++++++++ transactron.html | 24 +- transactron.lib.html | 24 +- transactron.utils.html | 24 +- 63 files changed, 4138 insertions(+), 446 deletions(-) create mode 100644 .doctrees/assumptions.doctree create mode 100644 .doctrees/current-graph.doctree create mode 100644 .doctrees/development-environment.doctree create mode 100644 .doctrees/home.doctree create mode 100644 .doctrees/miscellany/exceptions-summary.doctree create mode 100644 .doctrees/problem-checklist.doctree create mode 100644 .doctrees/scheduler/overview.doctree create mode 100644 .doctrees/shared-structs/implementation/rs-impl.doctree create mode 100644 .doctrees/shared-structs/rs.doctree create mode 100644 .doctrees/synthesis/synthesis.doctree create mode 100644 .doctrees/transactions.doctree create mode 100644 _sources/assumptions.md.txt create mode 100644 _sources/current-graph.md.txt create mode 100644 _sources/development-environment.md.txt create mode 100644 _sources/home.md.txt create mode 100644 _sources/miscellany/exceptions-summary.md.txt create mode 100644 _sources/problem-checklist.md.txt create mode 100644 _sources/scheduler/overview.md.txt create mode 100644 _sources/shared-structs/implementation/rs-impl.md.txt create mode 100644 _sources/shared-structs/rs.md.txt create mode 100644 _sources/synthesis/synthesis.md.txt create mode 100644 _sources/transactions.md.txt create mode 100644 assumptions.html create mode 100644 current-graph.html create mode 100644 development-environment.html create mode 100644 home.html create mode 100644 miscellany/exceptions-summary.html create mode 100644 problem-checklist.html create mode 100644 scheduler/overview.html create mode 100644 shared-structs/implementation/rs-impl.html create mode 100644 shared-structs/rs.html create mode 100644 synthesis/synthesis.html create mode 100644 transactions.html diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree index 0c3f7224695dc9d7596cd5e3f72126030047e0d1..69badc9083b35c14df4967bf73017b57885fd43a 100644 GIT binary patch delta 6007 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 G`TqkGdF5dM diff --git a/.doctrees/assumptions.doctree b/.doctrees/assumptions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..baead9953488b827f95d063cf539b8fefe34f634 GIT binary patch literal 5029 zcmcIoTW=gm74{`#d+f0tC&Y`iHfk-f@?ypl?#n(Pflywu@=75K?8B;4(_P~#Pj^>S zRUMCkNbrEP5%os%!Vln=An_xR_z_6F^PRp;_pEPGgr%|Sc21r1olBk5f9U=7Zx5G> zKeuaAA(Pn&3&TW(+~jT}R6!Q=#O8m=Klo$*DnD|4%`S|}bii}BgcE^~QK)&6f1bM? zI&NiTPAd9!!viZ-(vXXuSQG1?=SQONdRE$qx3=8z$I@6&O+02y7NHGH;^v1=AtfWTI8psL@SPUHNrmWlOW&`ZSNy1+y93QxNFMuQ_V~r<#j_`mUwE3^Ov7;> z7kVFweYa7c%DZ}e($)jOuSYP6W>FjVm08ILY-reJ@L8L|&3gR`dflslDDH))?7QXB z0>`dMzit#=g=)1Oi*Z+w>Dvmj*@CUhx+4+4)!4O;AD6bf85A;hO>n!h4=*(A<5|_V zwlp5|5~b3{+WqF(0=BLVl9*$Aqlxo2(aqYBiF=iai@UBi@pWR{V&cEQtstA;9ILL0 zI}+V);#$YocQtWMaJz}$F`SYgto-a3l;k|l0^vRRw08Y#_qz)H^X^ztf?BJL_K&+N zR1@5;&}WpH3x}j<$TN6;xM$c)UL|rkGo3(gXGvHNKlzz=#3o2Y-Wj)+QoPD+n%OGz zQ@VfhsrjIW7u0{h8K~JEm$;23flxYkAGPj8HT3m25rwLRO=yN%tf&%J zZv(Qa5XCXkF1wu|(^NtFP31VKSIP>~ZJ08WP*U$TH8KjP#PTG}-P$i%l%aI2i)^ub z>iTCK^&qoQ50k>XEQ?c2w#sWz-6c~@H>+u;Bh0p~3VaH6+QoG}$fYlH_h6!wO_b%W z&8N$5n+o(Ki~SjrU7TZO$Dq(nee!OQ8nAq~T;Wks&>8dj539Z3-4O)1KSoGYPCLvze(6^;|FHer6}b4~Ir#e9+zWxzHL$tcEi+n+ORwOPyTgT@ z1s3N&SzcOlJ0;(_3^nyZcVmIr-6tIkfD(Wxf=;>Hj#zS*At?j#5c3suQtqMVXaPb$ zvM23EfoEa(yDXofLN< zYDdDx5iaXnHbxMHR^(4N+#y^l_M7Nx6!1+-27c}K3%O)sxF+4QSU{He0*SHhKTx2h5$C8d|1rOsgFjHRTv%y0@X_Z3zvZfn^6Yx zK|Re<2tyru(RNn>{~B(h0+~!;>^cKHpqyZ`@xnP7lb1${m0?HC@id2X#A6;JRxcrf z;N0SpM*&VveI7Fz`S_TidC?+&;r6P}0r1LbQs%GMZcuV4*c(u<^5i8o-PAQv9zo#3 z2W1jUM1}P&(^>Z!T6Wlj2Ll`R}mZv{=i{^%!+; zch}v11=DNp&)kC!2IcpOEAcwN#C2E7`)87a3^S?8-5RAKfcy#{Luj!apYP-3`9u6O zu20MMGKJ^9%8QLtBRmXgTMUfbZbwhSX*-aJL9!~imn)Rx>T{*_+biWcWD&$rJXTQ? zkj2rjEG#ys`yGz``qqNzL5Dw{D{bk0e6+}`+F5cN$iU699kdZhT=*bl5H=;lCee15 Ux0>a`(>FuP{Z*PQOOccR0kA$s*8l(j literal 0 HcmV?d00001 diff --git a/.doctrees/auto_graph.doctree b/.doctrees/auto_graph.doctree index a6a70322e81592c85ef12aa902d02fd4a0c3ee90..523b3015a90a0c6d52080922990c08d23f260f95 100644 GIT binary patch delta 700 zcmYLHOK4L;6lGptUi$KRFKx-o&%~tP_nM|{5<_FuVk4wr+QcNH6janwtfj@^2a1Tz zqToUh^jH@bY;fboV01tzh?crg+$18|2(8_Tu3RXHx^NPyUChiq=iWKz&ShS%leKli z7j#RJ+x$E7>S-lIaG&c!wMoJxHv}&if!8Wxvt6X`xfTK&Kf{tcB>1x&Qu?d-Bus2q z;-mftZixc+i8)l7XX#z>H9^5Rj1$IAx@uH71f)LvHuq!UunwmrCkAB!Yvx`QLT)Tc zB|MgWjGJlTuksZvTU;oxRU8*ERgXh%`oU7<;Z!t8iV2sj%go-0lrn*zN*^9687$f~ zblL_{vb7_x=y8JHRfr)B#FX@CXi-o{&w==eLX2&P?r zSPVSMVIE-?*EPJ6T};P8w_G9zk4O7o@R^C#3%>1cp?S{(4u^a@Nt5qilHI07-x&dO z>NLV?3})>-YHAcKYBR2D-I&uv5LMfrD1ELe1kL^)oL2Q%>y0!l24g`w?_U=%$)>j5 zU^L{Th0rk$&w?Edvbv`S<)L<(h%D+c)uG`@zY%Zu?~I}}V5G+nyx}n)ml23t;fV{_ z8nNPJ+{I#<-iTM4xR3#ssEve>Pt1`ZHWT-7A)!ZRw1Wic%4n@g7xo4M!>Br(SWP;x z;V`qahMsgQR>m&kaKkvPn_lsmq%wh3!>0iCekV56h;k2t&z zHzHqc#)jJL-2|DM7QCkg+|V?f^7nxF&%vz4@Weli!&+$TRq0#JK_CP+`_J#*t6R73 z57V*0qM%!E*v29aG#@#}!4UQ8gDmgSFxT#*iRdlkbZ3)Zdl@oesiSFg`xX}+?EJ`M zEG{D$S5O}p^j{r{t1Or4WV~qL!d0-woFt6V#6=Q8IdLB&2_rJSjU+-J_m&K>r|kG% zW5K(=n*Xr`f7*sZ@-nXW*^%s*(ULUNgQ=f{ImpRo+(}o{vuSYnn+foqV6Y2Cg9|-b fJI1r!7|BXFnss9#>u3D6Y>=HwZWrsjO*od)gm diff --git a/.doctrees/current-graph.doctree b/.doctrees/current-graph.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0a7e92ac99af1363efdc9f0d33782190eaec24a3 GIT binary patch literal 26117 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 literal 0 HcmV?d00001 diff --git a/.doctrees/development-environment.doctree b/.doctrees/development-environment.doctree new file mode 100644 index 0000000000000000000000000000000000000000..38bf38064fee49e0643e6266c7971ffdd2716778 GIT binary patch literal 22994 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 F`yW757(oC4 literal 0 HcmV?d00001 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 689ae2d75357b9c0b810dbfd1208bde91a0b44a7..6337cb0e3aac86f6e494768403bc3a0faa186c11 100644 GIT binary patch literal 331107 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 literal 330814 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⪼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 literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree index 78aaf453f957a3f64328ca0f0cf8cdfb9a41a62d..641c7e3ede0d530013e080713e84ef9770a94fef 100644 GIT binary patch delta 216 zcmcaBc~6q1fpzNTjVzxSEi>|SQ>U~|@$2DEEG{n1Ehx#%&npHCh^M5MrRL-pOwuX&WvNAFnW^PqG1cOX#G=#`-Qtp>(&Un2{mk5goK%pG zM3ABSMa8-x5wKE0G^IrlD|wSki;6(jr57a@WI$9FOkT&Nz*s!_Jd=uqY;I<8a%xUa WVqT?wYDID?#I?G`o4J@Ta{>UMGgj09 delta 215 zcmca7c~_F9fpzMojVzxSEj{vcQ>U~|@$2DsEG{n1Ehx#%&npHCh`XegrRL-pw92F)1(xPd?A2A}*7gS)81j WlarWNsh?VroCFwM*b9ZKU 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 literal 0 HcmV?d00001 diff --git a/.doctrees/problem-checklist.doctree b/.doctrees/problem-checklist.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2b27969946902b3c9769c8b39656ba510aaa4d81 GIT binary patch literal 6578 zcmcgx&2Jn@6_4W`+vCqTAz5}eh7uoHhpfjNl*1|@Bv=V)H^Lif7j8?tr@LmV?C!2k zS9R=JX{AL1lt?8mGzacTd*r}h!I#7l2~HgO8#wTL)gRM6c48Z^h%`x8)vNbjz3=z( zS?@QWzjnp_u^T!SGC3ajVVJ0p>%uODD#&A=nBv#P-Jcbo7TdO;`A1siS-=Z>1rULd zQJC?h__(m^1a4%c2i5&W%>yG<(p(oku^<*dF1AJA_KY+UZynjq$C(;NJZ6F5!C@q| zDF_&_uYAOhiHXxdeo;8i2(?{Eeei;7n_^DP+l7kLJ^M-|6JG4)L*Fj@#$O3^RLf-+hqqE{|AOz z1_2=sNQmP0p4cMoi?2ZCg2AZ1hTk{vyMy00)G59t-hvtdD(-b;zrhpuK;|1Bdd? zpY~Q4;o~;Kmn#rTe$=ZJ==gy1+_K-kxJY06rVko@uCydyKcutQeaY~$FZt>j+C3-R z>!tW>9oL-CZg-hCmt}snZENS`^v2Xs8k4NqJ@u^1^Di&U^W5E+G0M-3CbcoXON^Wq ze!kzb-tUzc#1Cp)I}uBUh_^n|5-BKR0>Rx+Sf23X6e$Ao$TCYj{?z~#BFPyFQC(|HI$s<&h@k7P-2mHxCQ&9Jj zVi`x(5o&fMjbNc1jW`uWEb?*1=mGmNr5w~cupQ(JBptRtEmH=rf@>1P)CgWXLE7ba z5TDWV-`a|4X?Y$z*3Rp`yF&hZ``X$1>{t49)SN!wy2$&_$@4-frkd?~+2#D-m*sq+ z)WSJ=x;Cq*4QsQPly-gadUf+W z;;HV4v&Hk%cd50a^1iI#(dRXdgYch1FsS+i6%S?NQ^knf5-F9sT2mvnNC*`TKy_Wq zIFB40GEg$sjRf~!M8<`TFM?24%nvRs=Cw-9_b(vk>P{`@7u&gAqMpG_QZ&g6Fu}uk}3u|Jd3gp$pr&6_>CmQ3zulu&ut*H3IZRV+glXysiGIDb}nY6cAA9`%oNc0I^5%C%lI zcv!7>$^nF3(rCS)Axu{`n{f$pa6-C;k^F?}Ha%^YHuh}4X#xu@Lc}pBGfuHsDaoKM zO%AbKu9kTgVYOyd;L*T>PC>2*zOqSSuaA^6XbpMm@X?%Iqgf5C);mTW7#G-C*O-%} z9-@JZn?U(Sxx+D|p-Adcf#KC-6Hu%!RCAO)yPEM-WyXv6QyvwMuG(ecN6oTlH~F!I ztPq-WT?6%OFXY2~407v7ewIL1fIvwaW2bL2Kj8GJ;+b8SNtzoEjjy7@wy^!&jCS7H zL0wbW+ucKtXPL@8M5!?1Fo^|XH86$UKuOfa(sNh}yESt%gW}*;q&ZjAPF(1S%QfnUIJK zy=h=s_j9AX>6X1JVN`2j9;aSoco3}Hz(j{kFcGAOln?0|NOKAM zJKuc!0mQMMje;5Uv@=D2r$!H7^U2~4c{Y&Tj2sPk?XEC!1Y&*6SKtJp5yhh=y9JYq zy~ewm2Y5Oq1wXg99AB8Y@QiXRESIDd!jxAqRc)4Vy=!`s82{K4Xw4#O&k9U171{Wz zMnz-1CpjEg+}2ymTZg3gCCa55$7iiP@nqO{3&jXF+8m>DDyl_U!!qw;$9+wfpYoxWB;jPbP?QDHHq)xsHlw~n8_%9rY BbtC`) literal 0 HcmV?d00001 diff --git a/.doctrees/scheduler/overview.doctree b/.doctrees/scheduler/overview.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9797a8081356b2f9f05f8dfa119ec1f4ae1686ed GIT binary patch literal 8260 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 K-p$*ZjsFA3pQX?M literal 0 HcmV?d00001 diff --git a/.doctrees/shared-structs/implementation/rs-impl.doctree b/.doctrees/shared-structs/implementation/rs-impl.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3d05c40b63e1593ef364e44ada799f6944139b5d GIT binary patch literal 30568 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 z zQ*vk3X?D-wkW9IDQ(lfHyPeA(a0x`-iRh)#WVGfib(W#K85}qRm*5Ss))w5EgtN@5 z4w3^y>lqJs;;A@3976(c!I-@h*GnHNMIQVbYSnoF+{ZrWBZ-( zoq*oTC~Kvg9Lzk)G|_k+9C9+l+f_Ia^a1@r1~}P;G(^BCSL|`oO{SZ0SX#$kc7Wq> ztV(hNoZXk~g>BY@uvV!#SfPP#JWz{rG6o-^)PYRk2&~L+L&?Fr+=XNEW^l{+in^8D z;DI_#*E+3sMXDSymffHlAvU;^-C-xiq4?FUcI0$wLFIA_m1!3gHiF2hq#>D>RO8C3 z2j>Ga<=k0;9cXc1Mj%9BIZmeF-j(bCVqhaDpKn14S|eVoz;^LK93EHLcG?vzqks`% zNf8tY?<~QFa23?*m|u+tbA0Xsfw zA~^^u)v8GAk_1#>!+Y4SiKmLHhF+O=o8?Z-pqSm3$?Tv*xc;!2*#BzC`W6_se!Ft z0Tf&Z3TM}no2u~EO2vWNShE7hSAzS+gBY(SyTt*Npq0%!_gvSK9lQnBd<4*29e)*% zcEr`}=tsbCK?gmkRN~9AG}I(}TjU*P^Glbf@z zdOkbXGFA0Vww^liLCWjcZ$0Jz9$0?fl7-&>WY~tl(D*K9a1c{~pxp|wmgln*D;xg= zkExcIjL0v@;FsR}d;NOPX|zxOon(*31%3`@F2@@G2;Jr4`y<2yMN=nmR%OLQH$MT{ zJKp5K=NhlTtBn`&&mZ76GQW?1Zoxk{;h*2aKfjKDj>CYkaTNbN4qu%$9>YJMgEiHS z*YVG*utulx%lPM`Fm=>;7XKW^mo5Br1)E>RKcC0T&*Go=@Xx#Wr;QI<@TZeZB4${< zWjexeD>J;x45u=~r_69EGd#)+hcfHG%=#{~e#@-SGV8C*`YN-2${p7NUNVB+9gJG{ zK}M?k45t%!FywUN91*7zKd$F=;s+g^PF#D*>BQA1oKBqe;&ftq%IU=NBBv8e6^zaX z=GUEMI_-{_V5Xri&0H_KKz;{<2EE74DSd~(2W}ahQfnz_N)N|gy)koBzCEe6I7z)S zpgmgq5dXs%6ONm*ZHXsak_iZD^0gV*u?`{uoZ}jSAL0$l$fe!hE^jl}F;&B0D&h{$ H>gN9kCSD*8 literal 0 HcmV?d00001 diff --git a/.doctrees/shared-structs/rs.doctree b/.doctrees/shared-structs/rs.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bb602432c0bdf8dc6e28857278dcbd748a04597c GIT binary patch literal 20610 zcmc&cYm6kvS+{q$kJ;PXy*>NZ_W3S!{5Y@gJiGQ0%a;o#a7Qj&PMJ&ge1w;o?U||B z?%AI1p&$E@u;gGN$EYL_nLrZ$A|OHn5dltk1R+E$KtaHNq(~qhLb3z`MT&&P_f^$b zUEMp=(>=b(mTo=WUEf#VyT1DB@%ro+_CIw@{Kr?Kf#doI8+NDT2OSm-`9ddXCw=C} z!_N<&{p|3y;X1E{_I?y3VVe#4F=)|tT(1){fB5Q;}FDcV?YA zXa3dUx>Mt`u^W5L_{1ODVi61XYy`3H#p3@%Y!0nYzQPWWjM0sLVJN6W^n7k$13mH3 zS#@Td6MRll+u$cX*Jr~<(z5xY9mk>DN@Cy=xjNx?BIIDc?b%TTFX8vBZ};V|g-$X^ zA6j;MH)LIGlkoZ2-oZ~pXT`aAXU4g}Ke6cqeYP1UzR$wV{UF@kYzHB0c|m(OGJm!b zkld!EF4~M7pt@6!;xK8)(PkKJ^gBc6ac2pcNLtP*DgRV}XXpiAxVr~ZbJ@O>)td3b zkPG12L|o2=hI0{x;Cui$cPx6v=FP^Ioz z;0&`l^C__4bLjZ7wQ1e<-PpA~Fc&)ppF-DP<72*NiTiO=T9a*iK@oRf+4c`=Z+iZ= z4_0Q7VcDK%g~5JgfrnasJKP29u_I`-XM1i(nhlUy9Wcv5w>$?Z-o-2jsXq8a=! zg@8g;N{{(Yk>LCszc{j64NhHAj4BZ(&wuP7W}y$(<@)fWYqvq0EOr72{mRmcnq-yr zi{+Jt1H);htT&ap75Ktq9|uo}ydV|<3(XCU4dWhW5Lf>#fF5wGz)`anp07G~u8D4^n^{erUQe>l>qw%qJX!*2_Mi zxh!d|@def&ICkVl1`I!mO^6%$kmco_^1S>N@N!o1@)uHa#o-5;CxCC10r*n`;OmnB z_?(pDkk8b`NdC3~eN?macazvut$xnR<3GyF1KE2xr`xYlbXD5=v)ps4y$@~=f(U|d z;BQ-XE9hFb)eRYw4&nON);*y%%pd1HFon?eOvNq`G$}WIkzuHJV&>Sf(meHMu=T|| z=M-E2CzSv(|B-P-W_oi303}{&IHZtFkr#s+ijVsF?j&U+09pqDd}k7X^KZ_-BM=$| z0Ub4p)A!sCvskwaiBY7zKKC}mVegqL@)S%yGQEx5!{`W81jAO+VOd8?%;XlRX*PB0 zeI!S2?>M|5qvWa4sBs~Ek>&bk4o#uslNCKG8P_yGa=*q`jKo54knJc>?_?XIUalz; zCnfx7Mg;R>2^iCo6r7_hDJ70SwgZU>4rY)}bn2+2x*gR8gJ}YQjmC_4Iw^sSU}I!P zFunsy5olN|G4`(A_F)1VTRz)|Btg$rD42}v3ff11)!RJS#Ew_C8yw zPmD1akM^01((BInF#XhaFla-K0E4t4D44$CTQQ%zbzes6tZU8579>%6%u4V}Rk$Iy z`ha5S3#ky-_=Q6Hvb_>u`8Z8o{)+ChFaU^9O)$TtVG6|j(ze@ahS3W`%pDvKw{BTo zm%&VT-(fHt*^a_Cd`)M+VxBEC#r2%zB`Pg>^_Z2xH>Q#N_bJK$amvyfe-tG@isW1* zCLoe}mgtknACW8{vIPJA10#6#s1&nZC1uFZ z5=D5)oF*%YD0*5`G+9XmQ%XrUP)S>NZx~9td&7bXb_fMbQ6q)A9@L!Cs#XfG z4CaL*M#Ou-YU&6dv*P&lG&*`h>FASMBH+*0Qyo>NK1&m!Ew3UX=o6Zt$toh4QYyM` z%rr3J5vAy@dsw7aRcx4{$_n&;2(wc74hj+~9Hp9cIx%5>u{Vu+o>b}ywKPCI&x=H; z3f)KmlT=5TT&4?J0O_fDG7tKM}qn75-_In2+j~=S`W$< z9h3@lZ?lU0$4U}HZr9(7BJbR@_n6hOW2{sKeTWWFPs7N7t4pGeE6P?@G+=EPa(7sy zIuzfGm|}-Ja+wwR!@9+_X_4mQ`@iO7k5OgOM1j26dPAIf?3|U zGP1le1~t_-ROP^-+D45p#;|@WE2u_cRMlMzR(yMppAa?9D^hD3W5G(r8CiSvis?t()UD?tl1qrs4#t2%DP{Dy7vwgl)sZWdwn@9Wn-iPxM<$+D1Qa z3fsoCyahW9q>1BNoEP{z`2VeYvDe$UmTneEHUc`hwqOfi$Yn6I)%`(_osDeiv1 zV*L%RC>T&Km**lkgb*4E%u@~_UwUAy%)zQH3O6gNJeg^H9#@?qIlZ3BDd*os70?Zt zQR`@rn_VK<`{aooEiPCHZfc>yPOmUm1ECPydiIhCk3u7Dos4bb|SP4O5WE zKJ|i_S!CoO#{}e`9WdAtrgw6bYn>Zm7}T=RHvQsES;>9E#Q!NO_8~vASbPT;ebIf zvn65BQ3&RE2^dq61eYo@H5z^fSG0r&)m2uN=8^ai9E zen>I&t6Kb!Q&w4ACBX7lLS24dcRATg2}ETCJddR>xK~|^Ku*V zDF2*SP!s_5bJi{Xd>S$TuoCm1r1Y=x$G|(skeBU}pvudb`um#hZ?cRDrj(4IR5FG& zNP`JD6%fE??8!pbOM6Pl`PIFDnMTMrl#suznFd=vUqD}0$^=$k%GBXM=?*7LnP5su z`F&mHtIbwO&nTYUR63Ydzz=$vkMNdP5>a$qQ#4sg1XD^$@8>e##xy$m5v8NcS|Z>l z4{n){(3V#b5%i2EXtIh3CRNe+{KU)~Xe1e#H%u|t+Nz=fkwe^4;x{NLpO9Wsxm>O& zl|Q>6$2U;xV%k1eSLx;mpR)Yp=g<^tj-tfJl?aFi5hczVJ0;Z-j0q%<*EmjvF!`sB z+7&E|V75!Zn3hFwsa{k1_*tAGh`o|xqE*Lp9fFn@S6i`jH zXbRZ702KjRiY&ima9gU0uoN9tJAX6i`%g{SWPK4#s;@L)=1UA_pd~$zboP={ z|FyXa$*mYlK0VRh3#@J066r=IGOn93u#k;J#;C60n(D>s~Vws&?Qc8ic9eQP<)&;{kKDvzU#(#+HO)o~Mqqza_kabdSIW#nko}MY=4X(H2n6MTh&;TT$v!)3ttfU<`_gvU~Dok{x z3AgRoEe{z{RL+w_I9K=*FazZuU*7TrR->9VyRIj%U0NQn0qnu+!sy|*1;0!9re#Cd zXxsczCyocv_03Iq9c>H_;VutMS30FpdbYUM79PMU<`qR&U2*j}* zcH24h_$EbviO}QbZnU^v7H+sK?utIZYd4*^??Gp^*lvLnbYf?CXMtY?lj=9McWDNi zaP<%<_$|IB=#o2oAxeSGp_Dpc%BSFRE&T|tcP2XYWBZ`#xI2yq|G-dB;_kyCUy9%` zb=>^f1ROX5$cMzUd~D)TAtl3$ZMav;ZbOnI9Sd}Z5vYkrv6BH1gLig`i@21-zXfIz zv|Yao%BBc#7GnZrd%1RQAFb32Z0UA*z1Hp!jHBOT9q`pdAi-fQhEC44q1A4a^=;Q{ z!u4WsdkkK(^*O$(E(imw^tv*By~UR#27x{T=o8G}!)v?vf{Y{JxL|{rW8lqA%@{V> zF^EfWW!I`sNl~sHyrc_n_gaBlxH|11@#8xFg1oB6AIUcrx8Y>2D&r@veps(Sir?AM z-T}`am5CqiPv?{{JoLH%h9e6ww3-sucYSdiS#JkEQw^5S=)HMNu^xl&M$)^Fbf9Xw1kUF$5P_IqgA3L0rTo3#I{{65$Ka3ihV!~}=U9XLttzOYz={_kvJB@3i6hKyyu)f=f0rLc~cPP zd{I(`X8 zvAbi*1Qa3JQRTZsqDaXl5{F2Ua)^`z$|;xp13}6m#~eB4O7eTvUH!GQvonc_C9kHd z>bS?|4i?@#~y&&>n!pEw%&+;(?bhGn^)#ll3)TAmsAnHwcPOU{3g+(}kNBQUl@ zFAhwWhyz$*a@(;2<|gkXVu_YVwiC88_#+`RBinOxa6Zjv_>p&#Ro)QOksUd#G$k6Z z58Q~e&<+z?gf)k6vK`vIJoRBBPeQ1~jBjA?DB;KX6h9=j%RL$<)57xTxzGM3)`V0v-s8OTM0kS7l@3w1Iinq z%-9GFpO-oG;bowIL88|bmfI}U)@giQGwr~P?MRC}4b(;&_qMgZ;SRKbWqWIwH9a?k zR71@OHLzRr1Fr`;&20qUHU?cw>jRtCja?}`!?7cqR$~mR!K{{)&MIFP5AJcCq$DFy z)gr3+${Ifdfq=Fnz{mo_DN}ZsP^DsD7U@S7$#Z2S27d&i3>Gg=iEWF0vjqQMuyUFZ-SyTtBM{y=Q%4~KN zJ3C4*k-?EnW@9(1-s7Q8hGI# zd}ozMksn@aw>RvF$DNkx_1kaL%(q`{%N6I97jM9YGWcoS8R{P4(_&gKQcTOfswDq% zJd(u>Hi!c|5!!xdlK$Z%uxCDF&refz80}Dqp9sh>ndGDv+X zLX+5V5RdeI+mUyW)(yPA1~DLF@x9QFykPJYf)oQ$i{WaKvB|U$A(s}}eU`={xY@rT z>=m*04on?5FrH+|7>N5vYaY08p>Mv8JB0{}!4w3|o49-IzOjKQOVY}XEvBv++&OgF z1nKQa7ZC0mx`uY$RQUz;MWL@UWNBiC9Ir9tp7LIqN8H;(-ng|D$02VUeMH5`5t=gi zy;L=9x`a|@%DX6N4})nVh!1xe`NPAOO7zO&N35u_<%zM`0{8kg|rL7bp7n}y%hn4C)kOU!hc!IpzHo_VQM zY|W+*e=Xx=w*Cqj8*r|(<}eS@kZvp%wI7Hl!H)ZPYZ1Er#8uAf3Wni)eO9I=pj z_B8J?R6e_FJj-vze18x|O~W<07bN1Gssfa%3aBNVs~{zT&*1oC60?*r z`>Jy4?nHV{+2F&Oo`0A@LeGmk@#^blVEd6q6&6cdS9INGEq}1C*&*4#Ouy8Ge)R$NP~Z9FCxc3{C-80 z-XHGIQRj>FxV6ve3QbpI6WxUfA%({|a$UA^!CdSMXXQvpS;IbMh5qM>DB{k6afy9n^oI z^lj)|^|+7LcrjYn$hCbXJMJSH5>eV_ z5gDF*El!`4itTnyRJMI=k8P{i)b{E{X^iKsxffJyk-sOEhpGbp{X_z$Y^IqB_;%9n}P7XOo?Rx#BMtLbfnn_Qr+_?Iza_%oR_|fi{>K*Nj zb82T9{#?B;Y#E=n2Zk|FQ969GO84LH58bo5%&O=WbHWEmmt(O7+MvK z2udVN?GeRRy&XK+vf}2ymCK|R1^4THKFk0h3rUncqQZfyUO=})iCU>&ZyshQ`K)L z=0je_eL6D+b@Ji4fSMg&8x-C`8%nNvE*D5xx)!RV6({{@?w_i6LkW-a(3xLUy)30& z8#$8Frj^0Uo<%ZQ-Lt@=wnQ(EZ1y;`-#b^{A;d2b?37qCttK7J+?@*$hU}Pyo zqm!@GjU$^V*2L*_ggI$jg}w~~)m7gUcFX{>MyNF^I{IFK76G=!oaFjJF~ZHzszzcMa8o$F(=$xUWnkcm%P4m?fmT8G45oc;MH59$ehY;i}rFe@o zDCm{yL=9LRBN{?5ii1UtEc7m_N-#KXq40YUU2x)Lz)Uog=oa&#AJ_)1Q{cl4ny$Ja z6CANE9TnoPy_2AUZOMouPcMeVK^sc7XvKYB&lL}hl>;_(E^rNp5FV8y;I12z_=_Pw zWU=MxC`e<~F}8zeREFA00V%b_jPxyAzONE4-LgaS_aG!Y5N{DN2jF(FJK4eOva z*)p9TXk`1`lFxiSZ}OnCEYL{Dz}BSO;vwZHF&v`E6LHUNdBH|I5vOP+VWO2fdQYfg zCd=r|Z$AFjXTXl7pljC9(@23ne@KU|8KiM|J!;u3>dHM}wQU~t9cU2!B@Paq`jF((L-sOUhGCq`h~c?As(zRwOuqMR+>u1p{FliRQJ04 zUA@ykfaMRXdx%~88KvrU@4En_n*{_NFAmnnix-Kq_dcfc3h~s_YJdEy?*5a#b{~Rt zkNsnDqQZr=LzTK&cTv!L58Dkr?~mymB$}=QmyJ`@4tocWSu~jbUhS=5Y42hB^D)Aq z-f!v8`^XV{cj(Wr>GN0g=OisTCh;~1J{tJo49+DntV!rK3ArYr)+EGQ%r#m=8}J2* zoxdefb34ULX{^NCqwpmbi)AB~$6YjSm^vvB=t)P&m8x~Al9fl&bx=K+YQN(-x!ud9 z57Y+p)r|_qhT2sEov7f)tr$df4WFvx%4QCTSvdN9*;1N-pb?jzHd2JSKiA8{^ZBqe Ps5y(Sn9Lie5l`zsiQ7y@ literal 0 HcmV?d00001 diff --git a/.doctrees/transactions.doctree b/.doctrees/transactions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ea7f7b3cca01cdbde40de15f54a84d3c5ed9e1f1 GIT binary patch literal 56692 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 literal 0 HcmV?d00001 diff --git a/_sources/assumptions.md.txt b/_sources/assumptions.md.txt new file mode 100644 index 000000000..0213502e3 --- /dev/null +++ b/_sources/assumptions.md.txt @@ -0,0 +1,8 @@ +# List of assumptions made during development + +- RF has data forwarding from the Tomasulo announcement bus +- read of `x0`/`RF0` returns 0 +- write to `x0`/`RF0` is a noop +- separate RS for each FU +- the writeback stage saves data to the RF and the ROB (after getting output data from FUs) +- the commit stage updates the R-RAT diff --git a/_sources/auto_graph.rst.txt b/_sources/auto_graph.rst.txt index ba5e34071..8120dbad2 100644 --- a/_sources/auto_graph.rst.txt +++ b/_sources/auto_graph.rst.txt @@ -6,18 +6,18 @@ subgraph Core["core Core"] Core_InitFreeRFFifo["InitFreeRFFifo"] subgraph WishboneMaster["wb_master_instr WishboneMaster"] - WishboneMaster_WishboneMaster["WishboneMaster"] - WishboneMaster_request["request"] WishboneMaster_result["result"] + WishboneMaster_request["request"] + WishboneMaster_WishboneMaster["WishboneMaster"] subgraph Forwarder["result Forwarder"] Forwarder_read["read"] Forwarder_write["write"] end end subgraph WishboneMaster1["wb_master_data WishboneMaster"] - WishboneMaster1_result["result"] WishboneMaster1_request["request"] WishboneMaster1_WishboneMaster["WishboneMaster"] + WishboneMaster1_result["result"] subgraph Forwarder1["result Forwarder"] Forwarder1_read["read"] Forwarder1_write["write"] @@ -32,19 +32,19 @@ BasicFifo_read["read"] end subgraph SimpleWBCacheRefiller["icache_refiller SimpleWBCacheRefiller"] - SimpleWBCacheRefiller_SimpleWBCacheRefiller["SimpleWBCacheRefiller"] SimpleWBCacheRefiller_start_refill["start_refill"] SimpleWBCacheRefiller_accept_refill["accept_refill"] + SimpleWBCacheRefiller_SimpleWBCacheRefiller["SimpleWBCacheRefiller"] subgraph Forwarder2["address_fwd Forwarder"] Forwarder2_write["write"] Forwarder2_read["read"] end end subgraph ICache["icache ICache"] - ICache_accept_res["accept_res"] - ICache_issue_req["issue_req"] ICache_ICache["ICache"] ICache_ICache1["ICache"] + ICache_accept_res["accept_res"] + ICache_issue_req["issue_req"] ICache_ICache2["ICache"] subgraph FIFO1["req_fifo FIFO"] FIFO1_read["read"] @@ -56,8 +56,8 @@ end end subgraph Fetch["fetch Fetch"] - Fetch_Fetch["Fetch"] Fetch_verify_branch["verify_branch"] + Fetch_Fetch["Fetch"] Fetch_Fetch1["Fetch"] subgraph BasicFifo1["fetch_target_queue BasicFifo"] BasicFifo1_write["write"] @@ -71,21 +71,21 @@ RRAT_commit["commit"] end subgraph RegisterFile["RF RegisterFile"] - RegisterFile_read1["read1"] - RegisterFile_free["free"] RegisterFile_read2["read2"] + RegisterFile_free["free"] RegisterFile_write["write"] + RegisterFile_read1["read1"] end subgraph ReorderBuffer["ROB ReorderBuffer"] ReorderBuffer_mark_done["mark_done"] ReorderBuffer_peek["peek"] + ReorderBuffer_retire["retire"] ReorderBuffer_get_indices["get_indices"] ReorderBuffer_put["put"] - ReorderBuffer_retire["retire"] end subgraph ExceptionCauseRegister["exception_cause_register ExceptionCauseRegister"] - ExceptionCauseRegister_report["report"] ExceptionCauseRegister_get["get"] + ExceptionCauseRegister_report["report"] end subgraph FuncBlocksUnifier["func_blocks_unifier FuncBlocksUnifier"] subgraph Collector["result_collector Collector"] @@ -107,23 +107,23 @@ MethodProduct_method["method"] end subgraph RSFuncBlock["rs_block_0 RSFuncBlock"] + RSFuncBlock_insert["insert"] RSFuncBlock_update["update"] RSFuncBlock_select["select"] RSFuncBlock_get_result["get_result"] - RSFuncBlock_insert["insert"] subgraph RS["rs RS"] RS_update["update"] + RS_take["take"] RS_RS["RS"] RS_RS1["RS"] - RS_take["take"] - RS_insert["insert"] - RS_select["select"] RS_RS2["RS"] + RS_insert["insert"] RS_RS3["RS"] + RS_select["select"] end subgraph AluFuncUnit["func_unit_0 AluFuncUnit"] - AluFuncUnit_accept["accept"] AluFuncUnit_issue["issue"] + AluFuncUnit_accept["accept"] subgraph FIFO2["fifo FIFO"] FIFO2_read["read"] FIFO2_write["write"] @@ -133,11 +133,11 @@ WakeupSelect_WakeupSelect["WakeupSelect"] end subgraph ShiftFuncUnit["func_unit_1 ShiftFuncUnit"] - ShiftFuncUnit_issue["issue"] ShiftFuncUnit_accept["accept"] + ShiftFuncUnit_issue["issue"] subgraph FIFO3["fifo FIFO"] - FIFO3_read["read"] FIFO3_write["write"] + FIFO3_read["read"] end end subgraph WakeupSelect1["wakeup_select_1 WakeupSelect"] @@ -148,8 +148,8 @@ JumpBranchFuncUnit_accept["accept"] JumpBranchFuncUnit_issue["issue"] subgraph FIFO4["fifo_res FIFO"] - FIFO4_write["write"] FIFO4_read["read"] + FIFO4_write["write"] end subgraph FIFO5["fifo_branch FIFO"] FIFO5_read["read"] @@ -163,8 +163,8 @@ ExceptionFuncUnit_issue["issue"] ExceptionFuncUnit_accept["accept"] subgraph FIFO6["fifo FIFO"] - FIFO6_write["write"] FIFO6_read["read"] + FIFO6_write["write"] end end subgraph WakeupSelect3["wakeup_select_3 WakeupSelect"] @@ -193,21 +193,21 @@ end end subgraph LSUDummy["rs_block_1 LSUDummy"] - LSUDummy_update["update"] - LSUDummy_get_result["get_result"] LSUDummy_insert["insert"] LSUDummy_LSUDummy["LSUDummy"] - LSUDummy_precommit["precommit"] + LSUDummy_get_result["get_result"] LSUDummy_select["select"] LSUDummy_LSUDummy1["LSUDummy"] + LSUDummy_precommit["precommit"] LSUDummy_LSUDummy2["LSUDummy"] + LSUDummy_update["update"] subgraph Forwarder6["forwarder Forwarder"] Forwarder6_write["write"] Forwarder6_read["read"] end subgraph LSURequesterWB["requester LSURequesterWB"] - LSURequesterWB_accept["accept"] LSURequesterWB_issue["issue"] + LSURequesterWB_accept["accept"] end end end @@ -243,8 +243,8 @@ end end subgraph FIFO7["fifo_decode FIFO"] - FIFO7_write["write"] FIFO7_read["read"] + FIFO7_write["write"] end subgraph Decode["decode Decode"] Decode_Decode["Decode"] @@ -258,8 +258,8 @@ RegAllocation_RegAllocation["RegAllocation"] end subgraph FIFO9["rename_out_buf FIFO"] - FIFO9_read["read"] FIFO9_write["write"] + FIFO9_read["read"] end subgraph Renaming["renaming Renaming"] Renaming_Renaming["Renaming"] @@ -298,8 +298,8 @@ subgraph DoubleCounterCSR2["instret_csr DoubleCounterCSR"] DoubleCounterCSR2_increment["increment"] subgraph CSRRegister5["register_low CSRRegister"] - CSRRegister5_write["write"] CSRRegister5_read["read"] + CSRRegister5_write["write"] end subgraph CSRRegister6["register_high CSRRegister"] CSRRegister6_read["read"] @@ -330,9 +330,9 @@ WishboneMaster1_WishboneMaster --> Forwarder1_write Forwarder2_read --> SimpleWBCacheRefiller_SimpleWBCacheRefiller SimpleWBCacheRefiller_SimpleWBCacheRefiller --> WishboneMaster_request - ICache_ICache1 --> Forwarder3_write - ICache_ICache2 --> SimpleWBCacheRefiller_start_refill - ICache_ICache2 --> Forwarder2_write + ICache_ICache2 --> Forwarder3_write + ICache_ICache1 --> SimpleWBCacheRefiller_start_refill + ICache_ICache1 --> Forwarder2_write ICache_ICache --> Forwarder2_write SimpleWBCacheRefiller_accept_refill --> ICache_ICache WishboneMaster_result --> ICache_ICache @@ -358,15 +358,15 @@ FIFO9_read --> ROBAllocation_ROBAllocation ROBAllocation_ROBAllocation --> ReorderBuffer_put ROBAllocation_ROBAllocation --> FIFO10_write - FIFO10_read --> RSSelection_RSSelection1 - RSSelection_RSSelection1 --> Forwarder7_write + FIFO10_read --> RSSelection_RSSelection2 + RSSelection_RSSelection2 --> Forwarder7_write Forwarder7_read --> RSSelection_RSSelection - Forwarder7_read --> RSSelection_RSSelection2 + Forwarder7_read --> RSSelection_RSSelection1 RSFuncBlock_select --> RSSelection_RSSelection RS_select --> RSSelection_RSSelection RSSelection_RSSelection --> FIFO11_write - RSSelection_RSSelection2 --> FIFO11_write - RSSelection_RSSelection2 <--> LSUDummy_select + RSSelection_RSSelection1 --> FIFO11_write + RSSelection_RSSelection1 <--> LSUDummy_select FIFO11_read --> RSInsertion_RSInsertion RegisterFile_read1 --> RSInsertion_RSInsertion RegisterFile_read2 --> RSInsertion_RSInsertion @@ -385,17 +385,17 @@ ResultAnnouncement_ResultAnnouncement --> RSFuncBlock_update ResultAnnouncement_ResultAnnouncement --> RS_update ResultAnnouncement_ResultAnnouncement --> LSUDummy_update - RS_RS1 --> WakeupSelect_WakeupSelect + RS_RS3 --> WakeupSelect_WakeupSelect RS_take --> WakeupSelect_WakeupSelect RS_take --> WakeupSelect1_WakeupSelect RS_take --> WakeupSelect2_WakeupSelect RS_take --> WakeupSelect3_WakeupSelect WakeupSelect_WakeupSelect --> AluFuncUnit_issue WakeupSelect_WakeupSelect --> FIFO2_write - RS_RS --> WakeupSelect1_WakeupSelect + RS_RS2 --> WakeupSelect1_WakeupSelect WakeupSelect1_WakeupSelect --> ShiftFuncUnit_issue WakeupSelect1_WakeupSelect --> FIFO3_write - RS_RS3 --> WakeupSelect2_WakeupSelect + RS_RS1 --> WakeupSelect2_WakeupSelect WakeupSelect2_WakeupSelect --> JumpBranchFuncUnit_issue WakeupSelect2_WakeupSelect --> ExceptionCauseRegister_report WakeupSelect3_WakeupSelect --> ExceptionCauseRegister_report @@ -405,7 +405,7 @@ ReorderBuffer_get_indices --> ConnectTrans1_ConnectTrans WakeupSelect2_WakeupSelect --> FIFO4_write WakeupSelect2_WakeupSelect --> FIFO5_write - RS_RS2 --> WakeupSelect3_WakeupSelect + RS_RS --> WakeupSelect3_WakeupSelect WakeupSelect3_WakeupSelect --> ExceptionFuncUnit_issue WakeupSelect3_WakeupSelect --> FIFO6_write ConnectTrans2_ConnectTrans --> Forwarder5_write @@ -420,14 +420,14 @@ FIFO4_read --> ConnectTrans4_ConnectTrans ExceptionFuncUnit_accept --> ConnectTrans5_ConnectTrans FIFO6_read --> ConnectTrans5_ConnectTrans - LSUDummy_LSUDummy --> LSURequesterWB_issue - LSUDummy_LSUDummy --> WishboneMaster1_request + LSUDummy_LSUDummy2 --> LSURequesterWB_issue + LSUDummy_LSUDummy2 --> WishboneMaster1_request + LSUDummy_LSUDummy2 --> Forwarder6_write LSUDummy_LSUDummy --> Forwarder6_write LSUDummy_LSUDummy1 --> Forwarder6_write - LSUDummy_LSUDummy2 --> Forwarder6_write - LSURequesterWB_accept --> LSUDummy_LSUDummy2 - WishboneMaster1_result --> LSUDummy_LSUDummy2 - Forwarder1_read --> LSUDummy_LSUDummy2 + LSURequesterWB_accept --> LSUDummy_LSUDummy1 + WishboneMaster1_result --> LSUDummy_LSUDummy1 + Forwarder1_read --> LSUDummy_LSUDummy1 ConnectTrans_ConnectTrans --> Forwarder4_write ConnectTrans1_ConnectTrans --> Forwarder4_write RSFuncBlock_get_result --> ConnectTrans_ConnectTrans diff --git a/_sources/current-graph.md.txt b/_sources/current-graph.md.txt new file mode 100644 index 000000000..c176682f2 --- /dev/null +++ b/_sources/current-graph.md.txt @@ -0,0 +1,12 @@ +# Full transaction-method graph + +
+
+ + ```{eval-rst} + .. include:: auto_graph.rst + + ``` + +
+
diff --git a/_sources/development-environment.md.txt b/_sources/development-environment.md.txt new file mode 100644 index 000000000..cfdb58cad --- /dev/null +++ b/_sources/development-environment.md.txt @@ -0,0 +1,78 @@ +# Development environment + +## Setting up + +In order to prepare the development environment, please follow the steps below: + +1. Install the Python 3.11 interpreter and pip package manager. + * Optionally create a Python virtual environment with `python3 -m venv venv` in the project directory and activate it using generated script: `. venv/bin/activate`. +2. Install all required libraries with `pip3 install -r requirements-dev.txt`. +3. Install `riscv64-unknown-elf` binutils using your favourite package manager. On Debian-based distros the package is called `binutils-riscv64-unknown-elf`, on Arch-based - `riscv64-unknown-elf-binutils`. +4. Optionally, install all precommit hooks with `pre-commit install`. This will automatically run the linter before commits. + +## Using scripts + +The development environment contains a number of scripts which are run in CI, but are also intended for local use. They are: + +### run\_tests.py + +Runs the unit tests. By default, every available test is run. Tests from a specific file can be run using the following call (`test_transactions` is used as an example): + +``` +scripts/run_tests.py test_transactions +``` + +One can even run a specific test class from a file: + +``` +scripts/run_tests.py test_transactions.TestScheduler +``` + +Or a specific test method: + +``` +scripts/run_tests.py test_transactions.TestScheduler.test_single +``` + +The argument to `run_tests.py` is actually used to search within the full names of tests. The script runs all the tests which match the query. Thanks to this, if a given test class name is unique, just the class name can be used as an argument. + +The `run_tests.py` script has the following options: + +* `-l`, `--list` -- lists available tests. This option is helpful, e.g., to find a name of a test generated using the `parameterized` package. +* `-t`, `--trace` -- generates waveforms in the `vcd` format and `gtkw` files for the `gtkwave` tool. The files are saved in the `test/__traces__/` directory. Useful for debugging and test-driven development. +* `-v`, `--verbose` -- makes the test runner more verbose. It will, for example, print the names of all the tests being run. + +### lint.sh + +Checks the code formatting and typing. It should be run as follows: + +``` +scripts/lint.sh subcommand [filename...] +``` + +The following main subcommands are available: + +* `format` -- reformats the code using `black`. +* `check_format` -- verifies code formatting using `black` and `flake8`. +* `check_types` -- verifies typing using `pyright`. +* `verify` -- runs all checks. The same set of checks is run in CI. + +When confronted with `would reformat [filename]` message from `black` you may run: + +``` +black --diff [filename] +``` +This way you may display the changes `black` would apply to `[filename]` if you chose the `format` option for `lint.sh` script. This may help you locate the formatting issues. + +### core\_graph.py + +Visualizes the core architecture as a graph. The script outputs a file in one of supported graph formats, which need to be passed to an appropriate tool to get a graph. + +The `core_graph.py` script has the following options: + +* `-p`, `--prune` -- removes disconnected nodes from the output graph. +* `-f FORMAT`, `--format FORMAT` -- selects the output format. Supported formats are `elk` (for [Eclipse Layout Kernel](https://www.eclipse.org/elk/)), `dot` (for [Graphviz](https://graphviz.org/)), `mermaid` (for [Mermaid](https://mermaid.js.org/)). + +### build\_docs.sh + +Generates local documentation using [Sphinx](https://www.sphinx-doc.org/). The generated HTML files are located in `build/html`. diff --git a/_sources/home.md.txt b/_sources/home.md.txt new file mode 100644 index 000000000..79c4df96a --- /dev/null +++ b/_sources/home.md.txt @@ -0,0 +1,36 @@ +# Introduction + +CoreBlocks is going to be an out-of-order processor which will implement a RISC-V microarchitecture. +The project will focus on flexibility, which should allow to easily make experiments with different +component implementations. + +## Documentation + +Documentation located in the `docs/` directory collects description of the whole processor. +In `Overview` a high level overview of CoreBlocks can be found. + +Html versions of these pages and API documentation generated from code are available at [kuznia-rdzeni.github.io/coreblocks/](https://kuznia-rdzeni.github.io/coreblocks/) + + +```{mermaid} +graph + F[FRONTEND
-get instruction
-decode] + F -->|FIFO| S + S[SCHEDULER
-allocate register
-rename
-allocate ROB
-send to RS] + S --RS--> E + E[EXEC
-listen to incoming operands
-select instruction to execute
-send to FU
-deallocate RS] + E --FU--> B + B[BACKEND
-listen for results from FU
-announce results to RF and RS
-mark done in ROB] + B --> R + R[RETIREMENT
-check rediness of instruction from the end of ROB
-update RAT
-deallocate old register
-deallocate ROB] + + ROB((ROB)) + RF((RF)) + FREE_RF((FREE RF)) + RAT((RAT)) + + R --> FREE_RF --> S + S & R & B <--> ROB + B --> RF --> S + S <--> RAT <--> R +``` diff --git a/_sources/index.md.txt b/_sources/index.md.txt index 85d7b3e2c..0e16a25ec 100644 --- a/_sources/index.md.txt +++ b/_sources/index.md.txt @@ -5,17 +5,17 @@ maxdepth: 3 --- -Home.md -Assumptions.md -Development_environment.md -Transactions.md -scheduler/Overview.md -shared_structs/Implementation/RS_impl.md -shared_structs/RS.md -Current_graph.md -Problem-checklist.md -synthesis/Synthesis.md +home.md +assumptions.md +development-environment.md +transactions.md +scheduler/overview.md +shared-structs/implementation/rs-impl.md +shared-structs/rs.md +current-graph.md +problem-checklist.md +synthesis/synthesis.md components/icache.md -miscellany/exceptionsSummary.md +miscellany/exceptions-summary.md api.md ``` diff --git a/_sources/miscellany/exceptions-summary.md.txt b/_sources/miscellany/exceptions-summary.md.txt new file mode 100644 index 000000000..cde39753d --- /dev/null +++ b/_sources/miscellany/exceptions-summary.md.txt @@ -0,0 +1,153 @@ +# Summary of papers about interrupts + +## Introduction + +This summary is a result of analysis of journal articles which I made as a preparation to implement support for +interrupts, exceptions and speculation to core blocks. It looks like the choice of primary interrupts related to +structure determines the interrupt handling procedure. We have chosen a ROB, so there is a one classical implementation +of the ROB interrupt handling procedure. This procedure is used as a basis for the improvements, but most of the papers +are pretty old (1993-2001). Currently there is no much research going on about CPU interrupt handling and it is +considered that this problem is solved. Instead of that, there are some works, which try to implement precise interrupts +on GPUs, but due to different characteristics of the CPU and GPU, this research can not be applied in an easy way to our +project. + +When I have prepared this overview, I have decided to look at articles from different times to check on what people were +working at that time. So there is probably a lot of other works which can be worth checking out. Specifically: +- W. Walker and H. G. Cragon. “Interrupt processing in concurrent processors.” IEEE Computer, vol. 28, no. 6, June 1995 +- M. Moudgill and S. Vassiliadis. “Precise interrupts.” IEEE Micro, vol. 16, no. 1, pp. 58–67, February 1996 +These two works present a survey of the topic of interrupts as a time of writing. + +## Interrupt handling in old PCs + +- CDC 6600 - interrupt handling is done by inserting a jump instruction into the interrupt handler +- IBM360 - stop fetching and wait for all fetched instructions to be committed, then jump to interrupt handler +- CRAY-1 - similar to IBM360, but here latency can be even bigger due to vector instructions + +## Interrupt Handling for Out-of-Order Execution Processors + +> Interrupt Handling for Out-of-Order Execution Processors +> H. C. Torng and Martin Day, 1993 + +This article describes one of the first probes for the implementation of exceptions in out-of-order processes. In that +time, ROB was a very new idea. The authors of this paper introduced Instruction Window (IW) as their proposition for the +implementation of interrupts in out-of-order processors. IW will store all dispatched instructions, which didn't +complete. In the case of an interrupt it will be a part of the context and will be copied to memory by the interrupt handler. +After restoring the context, all instructions from IW will be restarted so that the state of the CPU will be precise. + +The idea of IW is similar to that of ROB, but there are few differences: +- ROB is not a part of the context +- ROB removes instructions in-order, IW allows to remove instructions out-of-order +- Tags in IW are one-hot-encoded, which will in current implementation cause big overhead. + +So in its original form, IW is unfeasible for our processor, because it would require to double a job. Additionally, +this context of the ROB size will have to be stored on each entry to the interrupt handler, which can be costly +operations. But: +- maybe it is possible to reduce cost of IW saving by cooperation of CPU and OS? +- maybe cost of restoring IW is smaller than cost of re-fetching and scheduling one more time for old instructions? + +Some interesting ideas from the paper: +- they propose NRP (No Return Point) implementation - a point in the pipeline after which an instruction can be removed, + it should allow instructions which are ending to save its results and remove itself from IW, to don't waste cycles on + context restore for executing this instruction one more time, NRP can be implemented for different interrupts and + instructions in different places to allow different interrupt latency +- for vector instructions IW remember how many elements are left to be processed, so after this context restore allows + to restore vector operation in the middle of the vector + + +## In-Line Interrupt Handling for Software-Managed TLBs + +> In-Line Interrupt Handling for Software-Managed TLBs +> Aamer Jaleel and Bruce Jacob, 2001 + +In that time, ROB was already a standard, so there was "classic" interrupt handling procedure. But in that time +there is still a lot of software managed TLBs, which cause an interrupt on each page miss. This of course causes a big +context switch overhead, so the authors of this paper try to reduce this penalty. As a base architecture they use Alpha and MIPS. They +concentrate on improving TLB miss efficiency and this has a property that interrupt handlers are very short (10-30 +instructions). + +The main idea is to not flush the whole pipeline on an interrupt, but instead to inline a handler code between +instructions of the user space program. They observed that the most important problem is that there can not be enough +resources to execute the interrupt handler without flushing the pipeline (e.g. in case when ROB is full there can be +live-lock). +- they assume that interrupt handler has known length +- they check if ROB, RS and RF have enough free resources to inline handler +- if the handler can be inlined, they do that, else they flush the pipeline +- in fly instruction return instruction is swapped to NOP and excepted instruction is reexecuted +- each executed instruction has one connected bit indicating the privilege level + +They use some properties of the Alpha and MIPS architectures where they have interrupts vectors so the OS can insert +short, specific, handlers to correct the interrupt vector addresses. In contrast to that in current design it is a +tendency to have one interrupt handler in OS, which next decides which handling functions should be invoked. This makes +the handler longer, so it can be hard to make inlining (e.g. for risk V in Linux the first step is to save +each of general purpose registers, so on the start we have already 32 instructions in handler) + +Ideas from the paper: +- Pipelines don't have to be flushed +- Additional HW resources reserved for only privileged mode can allow to execute privileged instruction without boring + with stopping user space program +- Interrupts and exceptions can be treated as branches and can be speculated + + +## Hardware/software cost analysis of interrupt processing strategies: + +> Hardware/software cost analysis of interrupt processing strategies +> Mansur H. Samadzadeh, Loai E. Garalnabi, 2001 + +Present overview for all main structures to handle exceptions, so: +- Instruction Window +- Checkpoint repair +- History file +- Reorder buffer +- Future file + +## iGPU: Exception Support and Speculative Execution on GPUs + +> iGPU: Exception Support and Speculative Execution on GPUs Jaikrishnan Menon, Marc de Kruijf, Karthikeyan +> Sankaralingam, 2012 + +They try to introduce exceptions to GPU. To do that, they observe that: +- it is possible to find points where it is low number of live registers (e.g., boundaries of kernels) +- GPU execution has no side effects, so it can be safely rewritten +- GPU program can be recompiled in runtime + +They introduce to the GPU program regions and subregions. Regions are parts of code which start at the beginning and end +with a small number of live registers. Subregion is a part of a region which has short length (not more than 32 +instructions). In each subregion there is no instruction which overrides the output of the instruction from the previous +subregion. Each subregion end is an instruction barrier. + +Exceptions and interrupts are handled by restarting execution of warp from the beginning of region. Wrong speculation is +handled by restarting execution of current subregion. In case when there are two exceptions in region, code is +dynamically recompiled and split into two regions to prevent live-locks. + + +## Efficient Exception Handling Support for GPUs + +> Efficient Exception Handling Support for GPUs +> Ivan Tanasic, Isaac Gelado, Marc Jorda, Eduard Ayguade, Nacho Navarro, 2017 + +One more time it is analysed the problem of precise interrupts for GPU. They observe that the only problematic +instructions are those related to memory access. All other instructions are guaranteed to end successfully or they kill +the program. This time there is more hardware modification and there are presented three propositions: +- stall warp until previous global load is solved - on GPU it is not so problematic because usually there is a lot of + other warp which wait to be executed. +- save instructions which can fail (global loads) to next reply them, input registers are not allowed to be + modified until this instruction don't claim that it doesn't fail +- operand logging - replay queue + storing operations + + +## Others + +> Reducing Exception Management Overhead with Software Restart Markers +> Mark Jerome Hampton, 2008 + +Mention a paper of Alli and Bailey [AB04] where there is no ROB. Instead of that in RAT there are FIFO-s which store +mapping between physical and logical registers and the age of instruction. If there is a need to raise an exception it +is checked if all younger instruction have already ended if not an exception wait for some cycles and repeat the check. + + +## Summary + +GPU research don't help us much, because the main assumption is that operations don't cause side effects +except of communication with main memory by load/store instructions. From research about CPUs, it looks like, +there is a "canonical" implementation of ROB that can be eventually introduced some small improvements, but +there aren't any very different procedures. diff --git a/_sources/problem-checklist.md.txt b/_sources/problem-checklist.md.txt new file mode 100644 index 000000000..122632544 --- /dev/null +++ b/_sources/problem-checklist.md.txt @@ -0,0 +1,15 @@ +# Problem checklist + +If something doesn't work and you're puzzled as to why - go through this checklist to see if any of these points apply in your case: + +1. Make sure that you use `yield from` when calling generator functions in tests - e.g. `TestbenchIO` functions (notable exception: `yield Settle()` instead of `yield from Settle()`) + +2. If a signal has an unexpected value in tests try adding `yield Settle()` right before you read it. + +3. Make sure you don't do `.eq` on two records with different layouts. Use `assign` from `coreblocks.utils` instead. + +4. Make sure all amaranth statements are added to some domain. + +5. Check if your code doesn't have any combinational loops - especially if your simulation hangs. + +Please extend this list if you spot yourself doing an easy-to-fix mistake. diff --git a/_sources/scheduler/overview.md.txt b/_sources/scheduler/overview.md.txt new file mode 100644 index 000000000..10e587547 --- /dev/null +++ b/_sources/scheduler/overview.md.txt @@ -0,0 +1,46 @@ +# Scheduler overview + +## Description + +The scheduler is the middle part of our processor. +It is located after the frontend and before execution units. +Its main tasks are: + +- register allocation +- renaming +- ROB entry allocation +- dispatching instructions to RSs + + +## Schema + +```{mermaid} +graph + Reg; + Reg[REGISTER ALLOCATION
-get free register from FREE RF list] + Reg --> Rename; + Rename[RENAMING
-rename source registers using F-RAT
-save mapping to allocated output register in F-RAT] + Rename --> AlocRob; + AlocRob[ROB ALLOCATION
-get ID of free entry in ROB
-save instruction in ROB entry] + AlocRob --> Select; + Select[RS SELECTION
-choose RS to which instruction should be send
-reserve entry in that RS] + Select --> Insert; + Insert[RS INSERTION
-insert instruction to selected RS
-get operands from RF
-save them in RS field of new instruction] +``` + +## Structure + +We decided to split the scheduler into 5 phases: +- register allocation +- renaming +- ROB entry allocation +- choosing the RS to which instruction should be dispatched +- inserting instruction to RS + +Each phase can potentially take one clock cycle, but they can be merged as a potential future optimization. +During implementation each phase should be treated as a separate hardware block for future flexibility. + + +## More detailed description of each block + +TODO diff --git a/_sources/shared-structs/implementation/rs-impl.md.txt b/_sources/shared-structs/implementation/rs-impl.md.txt new file mode 100644 index 000000000..80e29b0e6 --- /dev/null +++ b/_sources/shared-structs/implementation/rs-impl.md.txt @@ -0,0 +1,110 @@ +# Proposition of Reservation Station implementation + +Here is an example proposition how to implement RS using transaction framework for internal communication. If you want +you can follow this proposition, if you don't, feel free to change anything you want. + + +## Internal data + +### Actual Reservation Station + +This is a buffer which has `R` rows. Each row has the following structure: + +|v|opcode|`id_out`|`id_ROB`|`id_rs1`|`val_rs1`|`id_rs2`|`val_rs2`| +|-|------|--------|--------|--------|---------|--------|---------| + +- `v` - "valid" - it is 1 if entry is a correct instruction which waits to be filled with operands/dispatched +- `id_rsX` - is 0 when the source value is ready (and is stored in the appropriate `val_rsX`) or not needed. It is + non-zero when we wait for an operand to be ready. +- When the operand is ready we insert it to the appropriate `val_rsX` field and we put zero to `id_rsX` +- The instruction is ready to be dispatched if `v` is `1` and both `id_rs1`, `id_rs2` are `0` + +### Used slots table + +It is a table with `R` one-bit fields. Each field is `1` if this slot is used or is reserved to be used in the near +future (there is instruction in pipeline which will be saved to this slot). + +When an entry in the RS is released, the corresponding entry in this table is switched from `1` to `0`. + + +## Internal methods + +### Compare and substitute + +Input: +- `tag` - identifier of field in RF which should be compared with `id_rsX` to check if there is need to store `value` +- `value` - value which should be stored in RS field if tag matches +- `position` - position in RS on which comparison and replacement should take place + +Output: +- *null* + +Side effects: +- When `tag` matches one of `id_rsX` saved in RS on `position` then `id_rsX` is cleared (set to 0) and `value` is saved + in `val_rsX` + +### Read row + +Input: +- `position` - which RS row should be read + +Output: +- `opcode` - instruction opcode for FU +- `val_rs1` - value of first operand +- `val_rs2` - value of second operand +- `id_out` - id of RF field where instruction output should be stored +- `id_ROB` - id of ROB entry which is allocated for this instruction + +Side effects: +- *null* + +### Clean row + +Input: +- `position` - RS row which should be cleaned + +Output: +- *null* + +Side effects: +- `v` bit for entry on `position` set to `0` + +### Get free slot + +Input: +- *null* + +Output: +- `position` - of the free slot in the RS + +Side effects: +- *null* + +### Mark slot as used + +Input: +- `position` - of slot which should be marked as used + +Output: +- *null* + +Side effects: +- `position` slot in RS marked as used + + + +## Proposition of implementation of external interfaces + +### Get slot and mark as used + +["Get free slot"](#get-free-slot) position and call ["Mark slot as used"](#mark-slot-as-used) with it. + + +### Compare and substitute all + +Invokes ["Compare and substitute"](#compare-and-substitute) for each row of RS. + + +### Read and clean row + +For given row `r` atomically ["Read row"](#read-row) and ["Clean row"](#clean-row) diff --git a/_sources/shared-structs/rs.md.txt b/_sources/shared-structs/rs.md.txt new file mode 100644 index 000000000..e264a962b --- /dev/null +++ b/_sources/shared-structs/rs.md.txt @@ -0,0 +1,91 @@ +# Reservation Station + +## Overview + +The reservation station is used to store instructions which wait for their operands to be ready. When the instruction +is ready it should be woken up by wakeup logic and dispatched to the correct FU. + +### Reset / Initial state + +In initial state all rows are marked as invalid. + + +## External interface methods + +### Get slot and mark as used + +Input: +- *null* + +Output: +- `position` - of a free slot in RS + +Side effects: +- Slot on `position` marked as used + + +### Insert new instruction + +Input: +- `opcode` - instruction opcode for FU +- `id_rs1` - id of RF field where `src1` should be stored +- `id_rs2` - id of RF field where `src2` should be stored +- `id_out` - id of RF field where instruction output should be stored +- `id_ROB` - id of ROB entry which is allocated for this instruction +- `position` - in the RS to which we should write this entry + +Output: +- *null* + +Side effects: +- Save data from input to the slot in RS specified by the `position` argument + +---- + +### Get ready vector + +Input: +- *null* + +Output: +- `inst_ready` - bit vector as long as RS, where bit on `position` mean: + - 0 - instruction is still waiting for arguments + - 1 - instruction is ready for execute + +Side effects: +- *null* + +### Read and clean row + +Input: +- `position` - of RS row which should be read and cleared + +Output: +- `opcode` - instruction opcode for FU +- `val_rs1` - value of first operand +- `val_rs2` - value of second operand +- `id_out` - id of RF field where instruction output should be stored +- `id_ROB` - id of ROB entry which is allocated for this instruction + +Side effects: +- RS row on `position` marked as invalid + +---- + +### Compare and substitute all + +Input: +- `tag` - from RF for which RS should be checked for +- `value` - value which should be written to fields of RS with matching tag + +Output: +- *null* + +Side effects: +- For each row of RS if in this row are fields tagged with `tag` store + `value` in these fields. + + +## External interface signals + +- `free`: one-bit signal indicating if there is a free slot in the RS diff --git a/_sources/synthesis/synthesis.md.txt b/_sources/synthesis/synthesis.md.txt new file mode 100644 index 000000000..7f3112be1 --- /dev/null +++ b/_sources/synthesis/synthesis.md.txt @@ -0,0 +1,49 @@ +# Synthesis + +CoreBlocks synthesizes `Core` circuit to test how many resources it consumes as the project +grows and more functionalities are added. + +## Documentation + +### Requirements + +In order to perform synthesis you will need to install following tools: + * [yosys](https://github.com/YosysHQ/yosys) + * [prjtrellis](https://github.com/YosysHQ/prjtrellis) + * [nextpnr-ecp5](https://github.com/YosysHQ/nextpnr.git) + +These tools may need manual compilation from git repository, that can take some time. + +You can use docker images that have installed all required tools to perform synthesis: + * [vuush/amaranth-synth:ecp5](https://hub.docker.com/r/vuush/amaranth-synth/tags) + +To build the `AmaranthSynthECP5.Dockerfile` yourself use following command: +``` +docker build --platform linux/amd64 -t "amaranth-synth:ecp5" -f ./docker/AmaranthSynthECP5.Dockerfile . +``` + +### Usage + +Script named `synthesize.py` is used to perform the `Core` synthesis. + +Example usage: +``` +./scripts/synthesize.py --help +./scripts/synthesize.py --platform ecp5 --verbose +``` + +To collect synthesis information we use script named `parse_benchmark_info.py`. + +This script parses the output of the synthesis tool and extracts the +following information: + - Max clock frequency + - Number of logic cells used + - Number of carry cells used + - Number of RAM cells used + - Number of DFF cells used + +## Benchmarks + +For each commit on `master` branch, CI runs the synthesis and saves the parameters collected by `parse_benchmark_info` script. + +Graphs generated from this information are available on a dedicated [subpage](https://kuznia-rdzeni.github.io/coreblocks/dev/benchmark/). diff --git a/_sources/transactions.md.txt b/_sources/transactions.md.txt new file mode 100644 index 000000000..41b5d5528 --- /dev/null +++ b/_sources/transactions.md.txt @@ -0,0 +1,336 @@ +# Documentation for Coreblocks transaction framework + +## Introduction + +Coreblocks utilizes a transaction framework for modularizing the design. +It is inspired by the [Bluespec](http://bluespec.com/) programming language (see: [Bluespec wiki](http://wiki.bluespec.com/), [Bluespec compiler](https://github.com/B-Lang-org/bsc)). + +The basic idea is to interface hardware modules using _transactions_ and _methods_. +A transaction is a state-changing operation performed by the hardware in a single clock cycle. +Transactions are atomic: in a given clock cycle, a transaction either executes in its entriety, or not at all. +A transaction is executed only if it is ready for execution and it does not _conflict_ with another transaction scheduled for execution in the same clock cycle. + +A transaction defined in a given hardware module can depend on other hardware modules via the use of methods. +A method can be _called_ by a transaction or by other methods. +Execution of methods is directly linked to the execution of transactions: a method only executes if some transaction which calls the method (directly or indirectly, via other methods) is executed. +If multiple transactions try to call the same method in the same clock cycle, the transactions conflict, and only one of them is executed. +In this way, access to methods is coordinated via the transaction system to avoid conflicts. + +Methods can communicate with their callers in both directions: from caller to method and back. +The communication is structured using Amaranth records. + +## Basic usage + +### Implementing transactions + +The simplest way to implement a transaction as a part of Amaranth `Elaboratable` is by using a `with` block: + +```python +class MyThing(Elaboratable): + ... + + def elaborate(self, platform): + m = TModule() + + ... + + with Transaction().body(m): + # Operations conditioned on the transaction executing. + # Including Amaranth assignments, like: + + m.d.comb += sig1.eq(expr1) + m.d.sync += sig2.eq(expr2) + + # Method calls can also be used, like: + + result = self.method(m, arg_expr) + + ... + + return m +``` + +The transaction body `with` block works analogously to Amaranth's `with m.If():` blocks: the Amaranth assignments and method calls only "work" in clock cycles when the transaction is executed. +This is implemented in hardware via multiplexers. +Please remember that this is not a Python `if` statement -- the *Python code* inside the `with` block is always executed once. + +### Implementing methods + +As methods are used as a way to communicate with other `Elaboratable`s, they are typically declared in the `Elaboratable`'s constructor, and then defined in the `elaborate` method: + +```python +class MyOtherThing(Elaboratable): + def __init__(self): + ... + + # Declaration of the method. + # The i/o parameters pass the format of method argument/result as Amaranth layouts. + # Both parameters are optional. + + self.my_method = Method(i=input_layout, o=output_layout) + + ... + + def elaborate(self, platform): + # A TModule needs to be used instead of an Amaranth module + + m = TModule() + + ... + + @def_method(m, self.my_method) + def _(arg): + # Operations conditioned on the method executing. + # Including Amaranth assignments, like: + + m.d.comb += sig1.eq(expr1) + m.d.sync += sig2.eq(expr2) + + # Method calls can also be used, like: + + result = self.other_method(m, arg_expr) + + # Method result should be returned: + + return ret_expr + + ... + + return m +``` + +The `def_method` technique presented above is a convenience syntax, but it works just like other Amaranth `with` blocks. +In particular, the *Python code* inside the unnamed `def` function is always executed once. + +A method defined in one `Elaboratable` is usually passed to other `Elaboratable`s via constructor parameters. +For example, the `MyThing` constructor could be defined as follows. +Only methods should be passed around, not entire `Elaboratable`s! + +```python +class MyThing(Elaboratable): + def __init__(self, method: Method): + self.method = method + + ... + + ... +``` + +### Method or transaction? + +Sometimes, there might be two alternative ways to implement some functionality: + +* Using a transaction, which calls methods on other `Elaboratable`s. +* Using a method, which is called from other `Elaboratable`s. + +Deciding on a best method is not always easy. +An important question to ask yourself is -- is this functionality something that runs independently from other things (not in lock-step)? +If so, maybe it should be a transaction. +Or is it something that is dependent on some external condition? +If so, maybe it should be a method. + +If in doubt, methods are preferred. +This is because if a functionality is implemented as a method, and a transaction is needed, one can use a transaction which calls this method and does nothing else. +Such a transaction is included in the library -- it's named `AdapterTrans`. + +### Method argument passing conventions + +Even though method arguments are Amaranth records, their use can be avoided in many cases, which results in cleaner code. +Suppose we have the following layout, which is an input layout for a method called `method`: + +```python +layout = [("foo", 1), ("bar", 32)] +method = Method(input_layout=layout) +``` + +The method can be called in multiple ways. +The cleanest and recommended way is to pass each record field using a keyword argument: + +```python +method(m, foo=foo_expr, bar=bar_expr) +``` + +Another way is to pass the arguments using a `dict`: + +```python +method(m, {'foo': foo_expr, 'bar': bar_expr}) +``` + +Finally, one can directly pass an Amaranth record: + +```python +rec = Record(layout) +m.d.comb += rec.foo.eq(foo_expr) +m.d.comb += rec.bar.eq(bar_expr) +method(m, rec) +``` + +The `dict` convention can be used recursively when layouts are nested. +Take the following definitions: + +```python +layout2 = [("foobar", layout), ("baz", 42)] +method2 = Method(input_layout=layout2) +``` + +One can then pass the arguments using `dict`s in following ways: + +```python +# the preferred way +method2(m, foobar={'foo': foo_expr, 'bar': bar_expr}, baz=baz_expr) + +# the alternative way +method2(m, {'foobar': {'foo': foo_expr, 'bar': bar_expr}, 'baz': baz_expr}) +``` + +### Method definition conventions + +When defining methods, two conventions can be used. +The cleanest and recommended way is to create an argument for each record field: + +```python +@def_method(m, method) +def _(foo: Value, bar: Value): + ... +``` + +The other is to receive the argument record directly. The `arg` name is required: + +```python +def_method(m, method) +def _(arg: Record): + ... +``` + +### Method return value conventions + +The `dict` syntax can be used for returning values from methods. +Take the following method declaration: + +```python +method3 = Method(input_layout=layout, output_layout=layout2) +``` + +One can then define this method as follows: + +```python +@def_method(m, method3) +def _(foo: Value, bar: Value): + return {{'foo': foo, 'bar': foo + bar}, 'baz': foo - bar} +``` + +### Readiness signals + +If a transaction is not always ready for execution (for example, because of the dependence on some resource), a `request` parameter should be used. +An Amaranth single-bit expression should be passed. +When the `request` parameter is not passed, the transaction is always requesting execution. + +```python + with Transaction().body(m, request=expr): +``` + +Methods have a similar mechanism, which uses the `ready` parameter on `def_method`: + +```python + @def_method(m, self.my_method, ready=expr) + def _(arg): + ... +``` + +The `request` signal typically should only depend on the internal state of an `Elaboratable`. +Other dependencies risk introducing combinational loops. +In certain occasions, it is possible to relax this requirement; see e.g. [Scheduling order](#scheduling-order). + +## The library + +The transaction framework is designed to facilitate code re-use. +It includes a library, which contains `Elaboratable`s providing useful methods and transactions. +The most useful ones are: + +* `ConnectTrans`, for connecting two methods together with a transaction. +* `FIFO`, for queues accessed with two methods, `read` and `write`. +* `Adapter` and `AdapterTrans`, for communicating with transactions and methods from plain Amaranth code. + These are very useful in testbenches. + +## Advanced concepts + +### Special combinational domains + +Transactron defines its own variant of Amaranth modules, called `TModule`. +Its role is to allow to improve circuit performance by omitting unneeded multiplexers in combinational circuits. +This is done by adding two additional, special combinatorial domains, `av_comb` and `top_comb`. + +Statements added to the `av_comb` domain (the "avoiding" domain) are not executed when under a false `m.If`, but are executed when under a false `m.AvoidedIf`. +Transaction and method bodies are internally guarded by an `m.AvoidedIf` with the transaction `grant` or method `run` signal. +Therefore combinational assignments added to `av_comb` work even if the transaction or method definition containing the assignments are not running. +Because combinational signals usually don't induce state changes, this is often safe to do and improves performance. + +Statements added to the `top_comb` domain are always executed, even if the statement is under false conditions (including `m.If`, `m.Switch` etc.). +This allows for cleaner code, as combinational assignments which logically belong to some case, but aren't actually required to be there, can be as performant as if they were manually moved to the top level. + +An important caveat of the special domains is that, just like with normal domains, a signal assigned in one of them cannot be assigned in others. + +### Scheduling order + +When writing multiple methods and transactions in the same `Elaboratable`, sometimes some dependency between them needs to exist. +For example, in the `Forwarder` module in the library, forwarding can take place only if both `read` and `write` are executed simultaneously. +This requirement is handled by making the the `read` method's readiness depend on the execution of the `write` method. +If the `read` method was considered for execution before `write`, this would introduce a combinational loop into the circuit. +In order to avoid such issues, one can require a certain scheduling order between methods and transactions. + +`Method` and `Transaction` objects include a `schedule_before` method. +Its only argument is another `Method` or `Transaction`, which will be scheduled after the first one: + +```python +first_t_or_m.schedule_before(other_t_or_m) +``` + +Internally, scheduling orders exist only on transactions. +If a scheduling order is added to a `Method`, it is lifted to the transaction level. +For example, if `first_m` is scheduled before `other_t`, and is called by `t1` and `t2`, the added scheduling orderings will be the same as if the following calls were made: + +```python +t1.schedule_before(other_t) +t2.schedule_before(other_t) +``` + +### Conflicts + +In some situations it might be useful to make some methods or transactions mutually exclusive with others. +Two conflicting transactions or methods can't execute simultaneously: only one or the other runs in a given clock cycle. + +Conflicts are defined similarly to scheduling orders: + +```python +first_t_or_m.add_conflict(other_t_or_m) +``` + +Conflicts are lifted to the transaction level, just like scheduling orders. + +The `add_conflict` method has an optional argument `priority`, which allows to define a scheduling order between conflicting transactions or methods. +Possible values are `Priority.LEFT`, `Priority.RIGHT` and `Priority.UNDEFINED` (the default). +For example, the following code adds a conflict with a scheduling order, where `first_m` is scheduled before `other_m`: + +```python +first_m.add_conflict(other_m, priority = Priority.LEFT) +``` + +Scheduling conflicts come with a possible cost. +The conflicting transactions have a dependency in the transaction scheduler, which can increase the size and combinational delay of the scheduling circuit. +Therefore, use of this feature requires consideration. + +### Transaction and method nesting + +Transaction and method bodies can be nested. For example: + +```python +with Transaction().body(m): + # Transaction body. + + with Transaction().body(m): + # Nested transaction body. +``` + +Nested transactions and methods can only run if the parent also runs. +The converse is not true: it is possible that only the parent runs, but the nested transaction or method doesn't (because of other limitations). +Nesting implies scheduling order: the nested transaction or method is considered for execution after the parent. diff --git a/api.html b/api.html index 56e87f9a2..296615a53 100644 --- a/api.html +++ b/api.html @@ -21,7 +21,7 @@ - + @@ -41,18 +41,18 @@
@@ -240,7 +240,7 @@

transactron

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 18:08 2023-11-20. + Last updated on 23:47 2023-11-22.

diff --git a/assumptions.html b/assumptions.html new file mode 100644 index 000000000..a4da8e92b --- /dev/null +++ b/assumptions.html @@ -0,0 +1,125 @@ + + + + + + List of assumptions made during development — Coreblocks documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

List of assumptions made during development

+
    +
  • RF has data forwarding from the Tomasulo announcement bus

  • +
  • read of x0/RF0 returns 0

  • +
  • write to x0/RF0 is a noop

  • +
  • separate RS for each FU

  • +
  • the writeback stage saves data to the RF and the ROB (after getting output data from FUs)

  • +
  • the commit stage updates the R-RAT

  • +
+
+ + +
+
+
+ +
+ +
+

© Copyright Kuźnia Rdzeni, 2023. + Last updated on 23:47 2023-11-22. +

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/auto_graph.html b/auto_graph.html index 022b659e8..04e75ed13 100644 --- a/auto_graph.html +++ b/auto_graph.html @@ -39,18 +39,18 @@

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 18:08 2023-11-20. + Last updated on 23:47 2023-11-22.

diff --git a/coreblocks.frontend.html b/coreblocks.frontend.html index 60da9728a..7d0cd18a0 100644 --- a/coreblocks.frontend.html +++ b/coreblocks.frontend.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.fu.html b/coreblocks.fu.html index 8aac060c0..b135fe7b2 100644 --- a/coreblocks.fu.html +++ b/coreblocks.fu.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.fu.unsigned_multiplication.html b/coreblocks.fu.unsigned_multiplication.html index f6fd23ec7..9cbda1a97 100644 --- a/coreblocks.fu.unsigned_multiplication.html +++ b/coreblocks.fu.unsigned_multiplication.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.html b/coreblocks.html index e7d592b2d..059943597 100644 --- a/coreblocks.html +++ b/coreblocks.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.params.html b/coreblocks.params.html index 6b22a2534..113183d81 100644 --- a/coreblocks.params.html +++ b/coreblocks.params.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.peripherals.html b/coreblocks.peripherals.html index bab4bf049..338006510 100644 --- a/coreblocks.peripherals.html +++ b/coreblocks.peripherals.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.scheduler.html b/coreblocks.scheduler.html index f770359d7..f8324a0e2 100644 --- a/coreblocks.scheduler.html +++ b/coreblocks.scheduler.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.stages.html b/coreblocks.stages.html index 0b880e3de..4c0c0dffa 100644 --- a/coreblocks.stages.html +++ b/coreblocks.stages.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.structs_common.html b/coreblocks.structs_common.html index 1a7a15bcc..beebc695c 100644 --- a/coreblocks.structs_common.html +++ b/coreblocks.structs_common.html @@ -41,18 +41,18 @@ diff --git a/coreblocks.utils.html b/coreblocks.utils.html index a56017589..abfe6f911 100644 --- a/coreblocks.utils.html +++ b/coreblocks.utils.html @@ -41,18 +41,18 @@ diff --git a/current-graph.html b/current-graph.html new file mode 100644 index 000000000..c8d0cf492 --- /dev/null +++ b/current-graph.html @@ -0,0 +1,581 @@ + + + + + + Full transaction-method graph — Coreblocks documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Full transaction-method graph

+
+
+
+ flowchart TB + subgraph TransactionModule["TransactionModule"] + subgraph TestElaboratable["elaboratable TestElaboratable"] + subgraph Core["core Core"] + Core_InitFreeRFFifo["InitFreeRFFifo"] + subgraph WishboneMaster["wb_master_instr WishboneMaster"] + WishboneMaster_result["result"] + WishboneMaster_request["request"] + WishboneMaster_WishboneMaster["WishboneMaster"] + subgraph Forwarder["result Forwarder"] + Forwarder_read["read"] + Forwarder_write["write"] + end + end + subgraph WishboneMaster1["wb_master_data WishboneMaster"] + WishboneMaster1_request["request"] + WishboneMaster1_WishboneMaster["WishboneMaster"] + WishboneMaster1_result["result"] + subgraph Forwarder1["result Forwarder"] + Forwarder1_read["read"] + Forwarder1_write["write"] + end + end + subgraph FIFO["fifo_fetch FIFO"] + FIFO_read["read"] + FIFO_write["write"] + end + subgraph BasicFifo["free_rf_fifo BasicFifo"] + BasicFifo_write["write"] + BasicFifo_read["read"] + end + subgraph SimpleWBCacheRefiller["icache_refiller SimpleWBCacheRefiller"] + SimpleWBCacheRefiller_start_refill["start_refill"] + SimpleWBCacheRefiller_accept_refill["accept_refill"] + SimpleWBCacheRefiller_SimpleWBCacheRefiller["SimpleWBCacheRefiller"] + subgraph Forwarder2["address_fwd Forwarder"] + Forwarder2_write["write"] + Forwarder2_read["read"] + end + end + subgraph ICache["icache ICache"] + ICache_ICache["ICache"] + ICache_ICache1["ICache"] + ICache_accept_res["accept_res"] + ICache_issue_req["issue_req"] + ICache_ICache2["ICache"] + subgraph FIFO1["req_fifo FIFO"] + FIFO1_read["read"] + FIFO1_write["write"] + end + subgraph Forwarder3["res_fwd Forwarder"] + Forwarder3_write["write"] + Forwarder3_read["read"] + end + end + subgraph Fetch["fetch Fetch"] + Fetch_verify_branch["verify_branch"] + Fetch_Fetch["Fetch"] + Fetch_Fetch1["Fetch"] + subgraph BasicFifo1["fetch_target_queue BasicFifo"] + BasicFifo1_write["write"] + BasicFifo1_read["read"] + end + end + subgraph FRAT["FRAT FRAT"] + FRAT_rename["rename"] + end + subgraph RRAT["RRAT RRAT"] + RRAT_commit["commit"] + end + subgraph RegisterFile["RF RegisterFile"] + RegisterFile_read2["read2"] + RegisterFile_free["free"] + RegisterFile_write["write"] + RegisterFile_read1["read1"] + end + subgraph ReorderBuffer["ROB ReorderBuffer"] + ReorderBuffer_mark_done["mark_done"] + ReorderBuffer_peek["peek"] + ReorderBuffer_retire["retire"] + ReorderBuffer_get_indices["get_indices"] + ReorderBuffer_put["put"] + end + subgraph ExceptionCauseRegister["exception_cause_register ExceptionCauseRegister"] + ExceptionCauseRegister_get["get"] + ExceptionCauseRegister_report["report"] + end + subgraph FuncBlocksUnifier["func_blocks_unifier FuncBlocksUnifier"] + subgraph Collector["result_collector Collector"] + Collector_method["method"] + subgraph Forwarder4["forwarder Forwarder"] + Forwarder4_read["read"] + Forwarder4_write["write"] + end + subgraph ManyToOneConnectTrans["connect ManyToOneConnectTrans"] + subgraph ConnectTrans["ManyToOneConnectTrans_input_0 ConnectTrans"] + ConnectTrans_ConnectTrans["ConnectTrans"] + end + subgraph ConnectTrans1["ManyToOneConnectTrans_input_1 ConnectTrans"] + ConnectTrans1_ConnectTrans["ConnectTrans"] + end + end + end + subgraph MethodProduct["update_combiner MethodProduct"] + MethodProduct_method["method"] + end + subgraph RSFuncBlock["rs_block_0 RSFuncBlock"] + RSFuncBlock_insert["insert"] + RSFuncBlock_update["update"] + RSFuncBlock_select["select"] + RSFuncBlock_get_result["get_result"] + subgraph RS["rs RS"] + RS_update["update"] + RS_take["take"] + RS_RS["RS"] + RS_RS1["RS"] + RS_RS2["RS"] + RS_insert["insert"] + RS_RS3["RS"] + RS_select["select"] + end + subgraph AluFuncUnit["func_unit_0 AluFuncUnit"] + AluFuncUnit_issue["issue"] + AluFuncUnit_accept["accept"] + subgraph FIFO2["fifo FIFO"] + FIFO2_read["read"] + FIFO2_write["write"] + end + end + subgraph WakeupSelect["wakeup_select_0 WakeupSelect"] + WakeupSelect_WakeupSelect["WakeupSelect"] + end + subgraph ShiftFuncUnit["func_unit_1 ShiftFuncUnit"] + ShiftFuncUnit_accept["accept"] + ShiftFuncUnit_issue["issue"] + subgraph FIFO3["fifo FIFO"] + FIFO3_write["write"] + FIFO3_read["read"] + end + end + subgraph WakeupSelect1["wakeup_select_1 WakeupSelect"] + WakeupSelect1_WakeupSelect["WakeupSelect"] + end + subgraph JumpBranchFuncUnit["func_unit_2 JumpBranchFuncUnit"] + JumpBranchFuncUnit_branch_result["branch_result"] + JumpBranchFuncUnit_accept["accept"] + JumpBranchFuncUnit_issue["issue"] + subgraph FIFO4["fifo_res FIFO"] + FIFO4_read["read"] + FIFO4_write["write"] + end + subgraph FIFO5["fifo_branch FIFO"] + FIFO5_read["read"] + FIFO5_write["write"] + end + end + subgraph WakeupSelect2["wakeup_select_2 WakeupSelect"] + WakeupSelect2_WakeupSelect["WakeupSelect"] + end + subgraph ExceptionFuncUnit["func_unit_3 ExceptionFuncUnit"] + ExceptionFuncUnit_issue["issue"] + ExceptionFuncUnit_accept["accept"] + subgraph FIFO6["fifo FIFO"] + FIFO6_read["read"] + FIFO6_write["write"] + end + end + subgraph WakeupSelect3["wakeup_select_3 WakeupSelect"] + WakeupSelect3_WakeupSelect["WakeupSelect"] + end + subgraph Collector1["collector Collector"] + Collector1_method["method"] + subgraph Forwarder5["forwarder Forwarder"] + Forwarder5_write["write"] + Forwarder5_read["read"] + end + subgraph ManyToOneConnectTrans1["connect ManyToOneConnectTrans"] + subgraph ConnectTrans2["ManyToOneConnectTrans_input_0 ConnectTrans"] + ConnectTrans2_ConnectTrans["ConnectTrans"] + end + subgraph ConnectTrans3["ManyToOneConnectTrans_input_1 ConnectTrans"] + ConnectTrans3_ConnectTrans["ConnectTrans"] + end + subgraph ConnectTrans4["ManyToOneConnectTrans_input_2 ConnectTrans"] + ConnectTrans4_ConnectTrans["ConnectTrans"] + end + subgraph ConnectTrans5["ManyToOneConnectTrans_input_3 ConnectTrans"] + ConnectTrans5_ConnectTrans["ConnectTrans"] + end + end + end + end + subgraph LSUDummy["rs_block_1 LSUDummy"] + LSUDummy_insert["insert"] + LSUDummy_LSUDummy["LSUDummy"] + LSUDummy_get_result["get_result"] + LSUDummy_select["select"] + LSUDummy_LSUDummy1["LSUDummy"] + LSUDummy_precommit["precommit"] + LSUDummy_LSUDummy2["LSUDummy"] + LSUDummy_update["update"] + subgraph Forwarder6["forwarder Forwarder"] + Forwarder6_write["write"] + Forwarder6_read["read"] + end + subgraph LSURequesterWB["requester LSURequesterWB"] + LSURequesterWB_issue["issue"] + LSURequesterWB_accept["accept"] + end + end + end + subgraph ResultAnnouncement["announcement ResultAnnouncement"] + ResultAnnouncement_ResultAnnouncement["ResultAnnouncement"] + end + subgraph GenericCSRRegisters["csr_generic GenericCSRRegisters"] + GenericCSRRegisters_GenericCSRRegisters["GenericCSRRegisters"] + subgraph DoubleCounterCSR["csr_cycle DoubleCounterCSR"] + DoubleCounterCSR_increment["increment"] + subgraph CSRRegister["register_low CSRRegister"] + CSRRegister_read["read"] + CSRRegister_write["write"] + end + subgraph CSRRegister1["register_high CSRRegister"] + CSRRegister1_read["read"] + CSRRegister1_write["write"] + end + end + subgraph DoubleCounterCSR1["csr_time DoubleCounterCSR"] + DoubleCounterCSR1_increment["increment"] + subgraph CSRRegister2["register_low CSRRegister"] + CSRRegister2_write["write"] + CSRRegister2_read["read"] + end + subgraph CSRRegister3["register_high CSRRegister"] + CSRRegister3_write["write"] + CSRRegister3_read["read"] + end + end + subgraph CSRRegister4["mcause CSRRegister"] + CSRRegister4_write["write"] + end + end + subgraph FIFO7["fifo_decode FIFO"] + FIFO7_read["read"] + FIFO7_write["write"] + end + subgraph Decode["decode Decode"] + Decode_Decode["Decode"] + end + subgraph Scheduler["scheduler Scheduler"] + subgraph FIFO8["alloc_rename_buf FIFO"] + FIFO8_write["write"] + FIFO8_read["read"] + end + subgraph RegAllocation["reg_alloc RegAllocation"] + RegAllocation_RegAllocation["RegAllocation"] + end + subgraph FIFO9["rename_out_buf FIFO"] + FIFO9_write["write"] + FIFO9_read["read"] + end + subgraph Renaming["renaming Renaming"] + Renaming_Renaming["Renaming"] + end + subgraph FIFO10["reg_alloc_out_buf FIFO"] + FIFO10_write["write"] + FIFO10_read["read"] + end + subgraph ROBAllocation["rob_alloc ROBAllocation"] + ROBAllocation_ROBAllocation["ROBAllocation"] + end + subgraph FIFO11["rs_select_out_buf FIFO"] + FIFO11_read["read"] + FIFO11_write["write"] + end + subgraph RSSelection["rs_selector RSSelection"] + RSSelection_RSSelection["RSSelection"] + RSSelection_RSSelection1["RSSelection"] + RSSelection_RSSelection2["RSSelection"] + subgraph Forwarder7["forwarder Forwarder"] + Forwarder7_write["write"] + Forwarder7_read["read"] + end + end + subgraph RSInsertion["rs_insertion RSInsertion"] + RSInsertion_RSInsertion["RSInsertion"] + end + end + subgraph ConnectTrans6["verify_branch ConnectTrans"] + ConnectTrans6_ConnectTrans["ConnectTrans"] + end + subgraph Retirement["retirement Retirement"] + Retirement_Retirement["Retirement"] + Retirement_Retirement1["Retirement"] + Retirement_Retirement2["Retirement"] + subgraph DoubleCounterCSR2["instret_csr DoubleCounterCSR"] + DoubleCounterCSR2_increment["increment"] + subgraph CSRRegister5["register_low CSRRegister"] + CSRRegister5_read["read"] + CSRRegister5_write["write"] + end + subgraph CSRRegister6["register_high CSRRegister"] + CSRRegister6_read["read"] + CSRRegister6_write["write"] + end + end + subgraph Forwarder8["frat_fix Forwarder"] + Forwarder8_write["write"] + Forwarder8_read["read"] + end + end + end + subgraph TestbenchIO["io_in TestbenchIO"] + subgraph AdapterTrans["adapter AdapterTrans"] + AdapterTrans_AdapterTrans_write["AdapterTrans_write"] + end + end + subgraph TestbenchIO1["rf_write TestbenchIO"] + subgraph AdapterTrans1["adapter AdapterTrans"] + AdapterTrans1_AdapterTrans_write["AdapterTrans_write"] + end + end + end + end +Core_InitFreeRFFifo --> BasicFifo_write +Retirement_Retirement --> BasicFifo_write +WishboneMaster_WishboneMaster --> Forwarder_write +WishboneMaster1_WishboneMaster --> Forwarder1_write +Forwarder2_read --> SimpleWBCacheRefiller_SimpleWBCacheRefiller +SimpleWBCacheRefiller_SimpleWBCacheRefiller --> WishboneMaster_request +ICache_ICache2 --> Forwarder3_write +ICache_ICache1 --> SimpleWBCacheRefiller_start_refill +ICache_ICache1 --> Forwarder2_write +ICache_ICache --> Forwarder2_write +SimpleWBCacheRefiller_accept_refill --> ICache_ICache +WishboneMaster_result --> ICache_ICache +Forwarder_read --> ICache_ICache +Fetch_Fetch1 --> ICache_issue_req +Fetch_Fetch1 --> FIFO1_write +Fetch_Fetch1 --> BasicFifo1_write +BasicFifo1_read --> Fetch_Fetch +ICache_accept_res --> Fetch_Fetch +FIFO1_read --> Fetch_Fetch +Forwarder3_read --> Fetch_Fetch +Fetch_Fetch --> FIFO_write +AdapterTrans_AdapterTrans_write --> FIFO_write +FIFO_read --> Decode_Decode +Decode_Decode --> FIFO7_write +FIFO7_read --> RegAllocation_RegAllocation +BasicFifo_read --> RegAllocation_RegAllocation +RegAllocation_RegAllocation --> FIFO8_write +FIFO8_read --> Renaming_Renaming +Renaming_Renaming --> FRAT_rename +Retirement_Retirement2 --> FRAT_rename +Renaming_Renaming --> FIFO9_write +FIFO9_read --> ROBAllocation_ROBAllocation +ROBAllocation_ROBAllocation --> ReorderBuffer_put +ROBAllocation_ROBAllocation --> FIFO10_write +FIFO10_read --> RSSelection_RSSelection2 +RSSelection_RSSelection2 --> Forwarder7_write +Forwarder7_read --> RSSelection_RSSelection +Forwarder7_read --> RSSelection_RSSelection1 +RSFuncBlock_select --> RSSelection_RSSelection +RS_select --> RSSelection_RSSelection +RSSelection_RSSelection --> FIFO11_write +RSSelection_RSSelection1 --> FIFO11_write +RSSelection_RSSelection1 <--> LSUDummy_select +FIFO11_read --> RSInsertion_RSInsertion +RegisterFile_read1 --> RSInsertion_RSInsertion +RegisterFile_read2 --> RSInsertion_RSInsertion +RSInsertion_RSInsertion --> RSFuncBlock_insert +RSInsertion_RSInsertion --> RS_insert +RSInsertion_RSInsertion --> LSUDummy_insert +JumpBranchFuncUnit_branch_result --> ConnectTrans6_ConnectTrans +FIFO5_read --> ConnectTrans6_ConnectTrans +ConnectTrans6_ConnectTrans --> Fetch_verify_branch +Collector_method --> ResultAnnouncement_ResultAnnouncement +Forwarder4_read --> ResultAnnouncement_ResultAnnouncement +ResultAnnouncement_ResultAnnouncement --> ReorderBuffer_mark_done +ResultAnnouncement_ResultAnnouncement --> RegisterFile_write +AdapterTrans1_AdapterTrans_write --> RegisterFile_write +ResultAnnouncement_ResultAnnouncement --> MethodProduct_method +ResultAnnouncement_ResultAnnouncement --> RSFuncBlock_update +ResultAnnouncement_ResultAnnouncement --> RS_update +ResultAnnouncement_ResultAnnouncement --> LSUDummy_update +RS_RS3 --> WakeupSelect_WakeupSelect +RS_take --> WakeupSelect_WakeupSelect +RS_take --> WakeupSelect1_WakeupSelect +RS_take --> WakeupSelect2_WakeupSelect +RS_take --> WakeupSelect3_WakeupSelect +WakeupSelect_WakeupSelect --> AluFuncUnit_issue +WakeupSelect_WakeupSelect --> FIFO2_write +RS_RS2 --> WakeupSelect1_WakeupSelect +WakeupSelect1_WakeupSelect --> ShiftFuncUnit_issue +WakeupSelect1_WakeupSelect --> FIFO3_write +RS_RS1 --> WakeupSelect2_WakeupSelect +WakeupSelect2_WakeupSelect --> JumpBranchFuncUnit_issue +WakeupSelect2_WakeupSelect --> ExceptionCauseRegister_report +WakeupSelect3_WakeupSelect --> ExceptionCauseRegister_report +ConnectTrans1_ConnectTrans --> ExceptionCauseRegister_report +ReorderBuffer_get_indices --> WakeupSelect2_WakeupSelect +ReorderBuffer_get_indices --> WakeupSelect3_WakeupSelect +ReorderBuffer_get_indices --> ConnectTrans1_ConnectTrans +WakeupSelect2_WakeupSelect --> FIFO4_write +WakeupSelect2_WakeupSelect --> FIFO5_write +RS_RS --> WakeupSelect3_WakeupSelect +WakeupSelect3_WakeupSelect --> ExceptionFuncUnit_issue +WakeupSelect3_WakeupSelect --> FIFO6_write +ConnectTrans2_ConnectTrans --> Forwarder5_write +ConnectTrans3_ConnectTrans --> Forwarder5_write +ConnectTrans4_ConnectTrans --> Forwarder5_write +ConnectTrans5_ConnectTrans --> Forwarder5_write +AluFuncUnit_accept --> ConnectTrans2_ConnectTrans +FIFO2_read --> ConnectTrans2_ConnectTrans +ShiftFuncUnit_accept --> ConnectTrans3_ConnectTrans +FIFO3_read --> ConnectTrans3_ConnectTrans +JumpBranchFuncUnit_accept --> ConnectTrans4_ConnectTrans +FIFO4_read --> ConnectTrans4_ConnectTrans +ExceptionFuncUnit_accept --> ConnectTrans5_ConnectTrans +FIFO6_read --> ConnectTrans5_ConnectTrans +LSUDummy_LSUDummy2 --> LSURequesterWB_issue +LSUDummy_LSUDummy2 --> WishboneMaster1_request +LSUDummy_LSUDummy2 --> Forwarder6_write +LSUDummy_LSUDummy --> Forwarder6_write +LSUDummy_LSUDummy1 --> Forwarder6_write +LSURequesterWB_accept --> LSUDummy_LSUDummy1 +WishboneMaster1_result --> LSUDummy_LSUDummy1 +Forwarder1_read --> LSUDummy_LSUDummy1 +ConnectTrans_ConnectTrans --> Forwarder4_write +ConnectTrans1_ConnectTrans --> Forwarder4_write +RSFuncBlock_get_result --> ConnectTrans_ConnectTrans +Collector1_method --> ConnectTrans_ConnectTrans +Forwarder5_read --> ConnectTrans_ConnectTrans +LSUDummy_get_result --> ConnectTrans1_ConnectTrans +Forwarder6_read --> ConnectTrans1_ConnectTrans +ReorderBuffer_peek --> Retirement_Retirement1 +Retirement_Retirement1 --> LSUDummy_precommit +ReorderBuffer_retire --> Retirement_Retirement +ExceptionCauseRegister_get --> Retirement_Retirement +Retirement_Retirement --> CSRRegister4_write +Retirement_Retirement --> RRAT_commit +Retirement_Retirement <--> DoubleCounterCSR2_increment +CSRRegister5_read --> Retirement_Retirement +Retirement_Retirement --> CSRRegister5_write +CSRRegister6_read --> Retirement_Retirement +Retirement_Retirement --> CSRRegister6_write +Retirement_Retirement --> Forwarder8_write +Retirement_Retirement --> RegisterFile_free +Forwarder8_read --> Retirement_Retirement2 +GenericCSRRegisters_GenericCSRRegisters <--> DoubleCounterCSR_increment +CSRRegister_read --> GenericCSRRegisters_GenericCSRRegisters +GenericCSRRegisters_GenericCSRRegisters --> CSRRegister_write +CSRRegister1_read --> GenericCSRRegisters_GenericCSRRegisters +GenericCSRRegisters_GenericCSRRegisters --> CSRRegister1_write +GenericCSRRegisters_GenericCSRRegisters <--> DoubleCounterCSR1_increment +CSRRegister2_read --> GenericCSRRegisters_GenericCSRRegisters +GenericCSRRegisters_GenericCSRRegisters --> CSRRegister2_write +CSRRegister3_read --> GenericCSRRegisters_GenericCSRRegisters +GenericCSRRegisters_GenericCSRRegisters --> CSRRegister3_write +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright Kuźnia Rdzeni, 2023. + Last updated on 23:47 2023-11-22. +

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/development-environment.html b/development-environment.html new file mode 100644 index 000000000..668ef39ac --- /dev/null +++ b/development-environment.html @@ -0,0 +1,199 @@ + + + + + + Development environment — Coreblocks documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Development environment

+
+

Setting up

+

In order to prepare the development environment, please follow the steps below:

+
    +
  1. Install the Python 3.11 interpreter and pip package manager.

    +
      +
    • Optionally create a Python virtual environment with python3 -m venv venv in the project directory and activate it using generated script: . venv/bin/activate.

    • +
    +
  2. +
  3. Install all required libraries with pip3 install -r requirements-dev.txt.

  4. +
  5. Install riscv64-unknown-elf binutils using your favourite package manager. On Debian-based distros the package is called binutils-riscv64-unknown-elf, on Arch-based - riscv64-unknown-elf-binutils.

  6. +
  7. Optionally, install all precommit hooks with pre-commit install. This will automatically run the linter before commits.

  8. +
+
+
+

Using scripts

+

The development environment contains a number of scripts which are run in CI, but are also intended for local use. They are:

+
+

run_tests.py

+

Runs the unit tests. By default, every available test is run. Tests from a specific file can be run using the following call (test_transactions is used as an example):

+
scripts/run_tests.py test_transactions
+
+
+

One can even run a specific test class from a file:

+
scripts/run_tests.py test_transactions.TestScheduler
+
+
+

Or a specific test method:

+
scripts/run_tests.py test_transactions.TestScheduler.test_single
+
+
+

The argument to run_tests.py is actually used to search within the full names of tests. The script runs all the tests which match the query. Thanks to this, if a given test class name is unique, just the class name can be used as an argument.

+

The run_tests.py script has the following options:

+
    +
  • -l, --list – lists available tests. This option is helpful, e.g., to find a name of a test generated using the parameterized package.

  • +
  • -t, --trace – generates waveforms in the vcd format and gtkw files for the gtkwave tool. The files are saved in the test/__traces__/ directory. Useful for debugging and test-driven development.

  • +
  • -v, --verbose – makes the test runner more verbose. It will, for example, print the names of all the tests being run.

  • +
+
+
+

lint.sh

+

Checks the code formatting and typing. It should be run as follows:

+
scripts/lint.sh subcommand [filename...]
+
+
+

The following main subcommands are available:

+
    +
  • format – reformats the code using black.

  • +
  • check_format – verifies code formatting using black and flake8.

  • +
  • check_types – verifies typing using pyright.

  • +
  • verify – runs all checks. The same set of checks is run in CI.

  • +
+

When confronted with would reformat [filename] message from black you may run:

+
black --diff [filename]
+
+
+

This way you may display the changes black would apply to [filename] if you chose the format option for lint.sh script. This may help you locate the formatting issues.

+
+
+

core_graph.py

+

Visualizes the core architecture as a graph. The script outputs a file in one of supported graph formats, which need to be passed to an appropriate tool to get a graph.

+

The core_graph.py script has the following options:

+
    +
  • -p, --prune – removes disconnected nodes from the output graph.

  • +
  • -f FORMAT, --format FORMAT – selects the output format. Supported formats are elk (for Eclipse Layout Kernel), dot (for Graphviz), mermaid (for Mermaid).

  • +
+
+
+

build_docs.sh

+

Generates local documentation using Sphinx. The generated HTML files are located in build/html.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright Kuźnia Rdzeni, 2023. + Last updated on 23:47 2023-11-22. +

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html index 95038629d..5dac87ca5 100644 --- a/genindex.html +++ b/genindex.html @@ -39,18 +39,18 @@ diff --git a/modules-transactron.html b/modules-transactron.html index f21642aa9..a9f6c0574 100644 --- a/modules-transactron.html +++ b/modules-transactron.html @@ -39,18 +39,18 @@ diff --git a/objects.inv b/objects.inv index 9123468a717a8baf845a641f291edae4f27bfcfb..789ab66e03e775dc6293fd6ca1f02bb284caf936 100644 GIT binary patch delta 8015 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 tSJ1K)*tG + + + + + Problem checklist — Coreblocks documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Problem checklist

+

If something doesn’t work and you’re puzzled as to why - go through this checklist to see if any of these points apply in your case:

+
    +
  1. Make sure that you use yield from when calling generator functions in tests - e.g. TestbenchIO functions (notable exception: yield Settle() instead of yield from Settle())

  2. +
  3. If a signal has an unexpected value in tests try adding yield Settle() right before you read it.

  4. +
  5. Make sure you don’t do .eq on two records with different layouts. Use assign from coreblocks.utils instead.

  6. +
  7. Make sure all amaranth statements are added to some domain.

  8. +
  9. Check if your code doesn’t have any combinational loops - especially if your simulation hangs.

  10. +
+

Please extend this list if you spot yourself doing an easy-to-fix mistake.

+
+ + +
+
+
+ +
+ +
+

© Copyright Kuźnia Rdzeni, 2023. + Last updated on 23:47 2023-11-22. +

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/py-modindex.html b/py-modindex.html index a1bca4a57..7353c746e 100644 --- a/py-modindex.html +++ b/py-modindex.html @@ -42,18 +42,18 @@ diff --git a/transactron.lib.html b/transactron.lib.html index 920792a22..8141a2d98 100644 --- a/transactron.lib.html +++ b/transactron.lib.html @@ -41,18 +41,18 @@ diff --git a/transactron.utils.html b/transactron.utils.html index 669175af5..a1659d6c6 100644 --- a/transactron.utils.html +++ b/transactron.utils.html @@ -40,18 +40,18 @@