From 46f197c287fbbaec2d1887e04a793ba6717a4a33 Mon Sep 17 00:00:00 2001 From: Johannes Wirth Date: Fri, 11 Mar 2022 14:21:25 +0100 Subject: [PATCH] Add additional registers for input to FW (number of XSPNs, batch size, iterations) --- fpga_spn/raven_spn | Bin 271928 -> 272560 bytes fpga_spn/src/raven_spn.cpp | 33 ++++++++++--------- fpga_spn/src/spn_checker_regs.h | 21 ++++++++++++ raven_spn/raven_spn | Bin 124348 -> 125220 bytes raven_spn/src/raven_spn.cpp | 54 ++++++++++++++++++++----------- raven_spn/src/spn_checker_regs.h | 21 ++++++++++++ 6 files changed, 95 insertions(+), 34 deletions(-) diff --git a/fpga_spn/raven_spn b/fpga_spn/raven_spn index 1f1f998cb83a50221684fef8c7a645a1ae7916c7..db4b234afc3eefd25d074a835325e59d095c36db 100755 GIT binary patch delta 13669 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 PBt@d1I?NAztbhI&3Rx}V diff --git a/fpga_spn/src/raven_spn.cpp b/fpga_spn/src/raven_spn.cpp index a3756da..5399d85 100644 --- a/fpga_spn/src/raven_spn.cpp +++ b/fpga_spn/src/raven_spn.cpp @@ -68,8 +68,11 @@ int main() { - uint32_t step = 100000; - uint32_t iterations = 10; + uint32_t batch_size = spn_checker::batch_size_reg(); + uint32_t iterations = spn_checker::num_iterations_reg(); + + printf("BATCH SIZE: %d\n", batch_size); + printf("ITERATIONS: %d\n", iterations); @@ -102,8 +105,8 @@ int main() { printf("Result Bytes: %d\n", result_bytes); - uint32_t in_bytes = step * sample_bytes; - uint32_t out_bytes = step * result_bytes; + uint32_t in_bytes = batch_size * sample_bytes; + uint32_t out_bytes = batch_size * result_bytes; uint32_t total_in = in_bytes * iterations; @@ -118,33 +121,33 @@ int main() { uint32_t in_beats = in_bytes / axi_bytes; - if (in_beats * axi_bytes < step * sample_bytes) in_beats++; + if (in_beats * axi_bytes < batch_size * sample_bytes) in_beats++; uint32_t out_beats = out_bytes / axi_bytes; - if (out_beats * axi_bytes < step * result_bytes) out_beats++; + if (out_beats * axi_bytes < batch_size * result_bytes) out_beats++; uint32_t current_in_addr = in_addr; - int fpga_address_in = fpga_alloc(step * sample_bytes + 64); - int fpga_address_out = fpga_alloc(step * result_bytes + 64); + int fpga_address_in = fpga_alloc(batch_size * sample_bytes + 64); + int fpga_address_out = fpga_alloc(batch_size * result_bytes + 64); // inject SPN input data spn_checker::input_addr_reg() = current_in_addr; - spn_checker::num_input_samples_reg() = sample_bytes * step * iterations; + spn_checker::num_input_samples_reg() = sample_bytes * batch_size * iterations; spn_checker::start_data_trans_reg() = 1; spn_checker::output_addr_reg() = out_addr; //run_xspn(in_addr, out_addr); - for (int k = 0; k < iterations*step; k+=step) { - fpga_dma(1, fpga_address_in, current_in_addr, step * sample_bytes); - run_xspn(fpga_address_in, fpga_address_out, step, in_beats, out_beats); + for (int k = 0; k < iterations*batch_size; k+=batch_size) { + fpga_dma(1, fpga_address_in, current_in_addr, batch_size * sample_bytes); + run_xspn(fpga_address_in, fpga_address_out, batch_size, in_beats, out_beats); wait_for_spn_interrupt(); spn::interrupt_reg() = 1; printf("XSPN finished\n"); - fpga_dma(0, fpga_address_out, out_addr, step * result_bytes); + fpga_dma(0, fpga_address_out, out_addr, batch_size * result_bytes); spn_checker::offset_reg() = k; - spn_checker::length_reg() = step; + spn_checker::length_reg() = batch_size; spn_checker::start_result_check_reg() = 1; - current_in_addr += step * sample_bytes; // 5 bytes in each sample + current_in_addr += batch_size * sample_bytes; // 5 bytes in each sample } fpga_free(fpga_address_in); diff --git a/fpga_spn/src/spn_checker_regs.h b/fpga_spn/src/spn_checker_regs.h index ddcdb03..ff9e250 100644 --- a/fpga_spn/src/spn_checker_regs.h +++ b/fpga_spn/src/spn_checker_regs.h @@ -45,6 +45,9 @@ #define SPN_CNTL_REG_NUM_INPUT_SAMPLES 0x50 #define SPN_CNTL_REG_START_DATA_TRANS 0x60 #define SPN_CNTL_REG_OUTPUT_ADDR2 0x70 +#define SPN_CNTL_REG_XSPN_COUNT 0x80 +#define SPN_CNTL_REG_BATCH_SIZE 0x90 +#define SPN_CNTL_REG_NUM_ITERATIONS 0xA0 template class spn_checker_regs { @@ -69,6 +72,12 @@ public: uint32_t r_start_data_trans; + uint32_t r_xspn_count; + + uint32_t r_batch_size; + + uint32_t r_num_iterations; + static inline uint32_t& start_result_check_reg(){ return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_RESULT_CHECK); } @@ -101,4 +110,16 @@ public: return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_DATA_TRANS); } + static inline uint32_t& xspn_count_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_XSPN_COUNT); + } + + static inline uint32_t& batch_size_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_BATCH_SIZE); + } + + static inline uint32_t& num_iterations_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_ITERATIONS); + } + }; diff --git a/raven_spn/raven_spn b/raven_spn/raven_spn index b88c3e1aa21d48e2c0071b3c9168d05c86a6c152..b4735349fa177c9a8e0d53b1f37168e6a59e90ff 100755 GIT binary patch delta 19525 zcmb_^33wF6)^=CV^h}bO?8{_AGSiuvtRw+K*pd)KGLT4+9Rw5-AYl`bO)rW%EMZgh z5?g65B7$;NTv!Ym+*mX!BFc^%7jWUC2m}R1k>z_&b$1fH_j~^Tf1V$oo~ie2b?Vfq z)78}z-}%J4{-AZaELNYY^LSimD+GZqNx;7dL16SX6oO&9tpbJCOJ%I13IOV>>)=IdL$-qiKHwa}})mhKTxA5)H|_wF0q z_NB$%wN^p$W-eZk=D(i!eka~)L@T8&(Q47E<1{l`^Ej>XTH^a#&{|lQ_`V~Bd|LQm zlQ1n^nVOMW9;=&N+HCU8W|JG5O+MXh^3i6KnyC+FHwl}QA8o4~%W!3$9_O8F72eeQ zV!~_19)Axue=cV7Lrqz zbLnalyh1DM($%FJE%VY<%-J=)&%4oQ947u+-A5*TE-f2-<+PyjB=9c8EG%>JS zisoj@*d}4_gA2=gK8uc^*Lc;?Yt;2xQK8p(C7>z(6N6ws?IY!4`g&FI`uLB7UaPBUL0 z`^V`ZvTh>xQyVqsQW~!oE!@>Ppc{$6=>9{b79zpjlJg?h_Q=;0Zb*}`cKi_^xj>8i z8gJENai7c5QVs)Xo?$q0{VkOSh^S(;wby`9UKTdYD=S*~Tk$ymQKdB7%|Q_(XAWxZ>$BSUeT1%gPL7!10p$n1aW6f9nfpM_GrCjkzSu^$%~*bgcuFobI#4 z7b=wX-HW1LxK-os(z!4A>o0ZB6vfkCMJ`T^viin8@vC6>e`+YZmA=KY_`=Ke(~8ep z#9pr}qsq#~e{WGi!v^*5E0^{g(syvaoKhVk^c*;_-@tr%;?#Rb zPo7vUx3FxiD3?5%@)4(u`b)_#2laa>>D|7TGwe_MHeP^#GXfb!WO zk63g-`2}dk0VQFuC-cq&H*O51n|Dc=?4QS$h$Z$QLGs(ml!x*4+5u%FzOEin4i3%~e>%GxQ3>(W6FWs-QreJ`RsO& z^aZ4L5<$9()@#&K_763)^_=E63Bn3$Stg*h1p2po*u7k+>UJ}mz=aNjHG;Q(N2?ES zC7K1H2rVybPuNlo>>+iRv;@rvW%Mw&^a@%6T3+$O5#_O=F3TklzSWxXxaA!_qI@>Y zBYt>9DH`UoRDtq_)~rSIc}?y`G*=!`Mh*9f4{MYQpgf>8V=RI&Rcm%dvr5yx6V3h_ zbuOAEN4Q(-(QL1r8}62Nqm`pXj_^ts&`MRhjc{9Htb(xr=lW42QqA_n(qg#~*VU3@ zxvs9iQdMOaU-8vXt!ju5x+h8yOu}6j<(r42>x=LE)54p}J`RmZzH8#~M$kec zg+oO|n}(Il+X$KR%)(n(nsQ>HqfG}+o2iAGw*{IE$!>~JA{RN?UZw4#EOtp5w#X+& zxs-<%wPktAtBZYNZ1!;!*x|L-Rsd6h@ z@HLCRk|Hd;k0m630Uh^6$Br=Sb`6m(-9*|-q~8tqxc7S$_fnVg*%Avoj+QUv7ZUki z*J@)4k^z5ErY?1dxTtv+oWba#O-LTWV}Sh#T6z;asr+lHyKNOU4};SiQ$usA&pGB# zV9achT<~rd34Ng?FL5fx4_iVWCb%E6LzTM4u|Z}DyLNH4tW0^>BW{clJSGFQ6V`iB^ZHoJ6YG0zTWS?2I+X)E z>Lbp;lIaV_67a+bGkSkwXCAwve7y5MbX>ZNI(~7N)^XSOwT>-&k`k$78+B~io79Us zwo%8HeW8=6V;ed?^}g1zMeo>#j&E!9N;J|LAAc&QU%>O1S-1m}WM_g>?y(s}- z4A_g3I*_O<3GF2=KeaC;qrKKemc(b;p#7|yOo(mc(0;@9Ahn+hM|+!lIkn%#{oK0S z^&GYLk?tP%8`M7GLi?zb)8ojM;|ZMZM;*5Q+o?S8sV{|s8}x-^ID9iva1o(v*yUJf z&Z-vDgzdOt20fBm|G}sGS)UxZ$ZXy0dvGJOuR<(s1=*cJ6EhHGTVZxPv_t<)MY||+ zsU0^L$UTm0C9bdnFojT-2ySU&uQ27CeK}bF5&PqFTWd?9T>AvRexP1(%ZtJl)}yud z4rRptcIlb15dC{_Xyh9hvF%^Mp|*Y)7PI#WnM+y(?0wo!_9|QU$FNn(hx?NQ0Vf2u zkiE%dPmmO}WA4N(gpN$O9bemkV-I^EkQcfcSrT^?ZF5*Z+p_?UMhq=%K;L+oG4xJQDOMeKCq3kijYLD*3HLAM|jgWSu|6hhqz z;0z0$sXTTdF2FmevPPgEb{}K{&2nuxYmD_37-vs_{EWeJK14le{2FT}Qip8?Z$~r# zGmJy$PqfA%h1g;6PBimtNk8!;~TQnbFF$gO1>lH27NUuw-TVK}XOMOlH{fh=8&Qtb;W8e^_rzQuZCp$lib$g!K&i z9-$}CoL?gTg7_=^3jZZ(CQ?%N_%KahftP$&eafK@Vi@IX`1u6NS5aUPyvAs2{FO+Q3{F>OuWu$*^VQ#nYq3F0|4I=tX*>#>uvDi(@a5l1T^O% zG@Nl*PJ;L)?3i;CzXZj10f}QSu*NATj;01iA@TN`N7*-GZ8&~O1!rnkQWg^0!n}Ew z^#v@`iy&Ob71jiO=M{Wt%fwujd<#Y^5ifz_WS(uc$b#TSb;-e{$qQ{seiG>Bnk)-I z=w8Il{E+nlSxDz{10g#M7nc{rycDp|3s8X!j6?5g-f#; z8cR`KVO;|**~tW_eHpR2A&tGtx*PdI%H`nnZBhQ50=UMSkDMoW$AL4sg}X(0^^2sm zGvw&=)psjaaf2vl>EeM3-GD`4e%<;jbg9Utf|J$E72BW&n8)VDw?!|1r~cox9>rHy zsIu_OxR_YtR_9R)Xxw+PW;T79%pO(_e3=~h4vX{-*m@t=XNFBD`5=UbBazIXTQ>nv zcmKw9mPE8ra_-mG@#u;SnBiOqF5TrJuxmbHeGZ4Er0W4Eow%AV=YD6M=T@eF6mvpR#9&>cD4~0Zp9+JtC-=-W(IPGO*rlUY>kHyS7ZgJ8rCC%ed z=6^lNISG0F709nbkKf1mhhQ78oc}sLfh$bX6t1H;$6fKnW zwE6JLF<#^U?|P7#%w^Kwg8T}2B4ie#e=_s`Y9fr=pqoAxkRw&ubu7-=fQlL~M^_N( z5Vd_Vqp1C@a^aXGup2oY-!)n#$|mT=7sk9q?Qc+u;!9(aKoa9gt2{P?+P!cmioY$U z6Sa3(&>k3j8?{qWVVtq??~<;JF*xI#A5;66WVG8jk5GFZ^23>!@C~)IG1<;!XW$%x ze^RJD34c&~2NsSq%_))51Eidu5J~N)5E5rcR}X5hqIRB}7vx=7W6thwPTxuGBAL^R zkb%xJjozKwLbMwXD?=4%YLtvL_*mvscUpr9JYH!9*4 zrQPu~wn4f5_z-LXUp-D+z^D`27Vz1V+7>YJlZ@3^8nT17fQg@ZJ^}DKXbYIQFTV*O z-GMD&zi+fHVB!fYdELi>Envep9i?7V;lAs<QdLe;RXL<5E)uV{GG(755fPj^66<`pbHt;#RU%BB%m9}k-`5r@BC+@bLWH5 z=e-F2{>k8<;e0z*DA#gQ3t{*th2c%4nCq;CRMHIr!T$%1=?kexB3vzMCilF7o4D&s zZmrZ8r!4y+Eq({MuHQImDG6%M7e^?c{NQZ+I?A@|oaK#X3#DG7yl45;pzw$Y{s%lt z_>bPOS*Y5sxAETqr}H)q0o?PQG;H0SWANF1j2CS^qguPqbH%g7qrq!7D=sV9XJz(-(ifjQl)KNSus4(^&&v6KkUg(vuMVDT z_Vz(hs5pmp@9wPeUcH&;5ArBYXI)~)7$y9iv&)YNqk9gIl?j>K;*{WDNroY9&!!`L5`W2V7VO!c1Io} zFSq9)!m*7Ebl@Py@gy0@unajZq+$=x|<=Xi>Aia2QR z2q&FeIOyP5O=86ylF&);Z&eC@NeDDy*~o*! zlcAMo-U_SjRd}5X*jMQHI=W2Wn3x76zJWE%+@W+M$PV)OSR;l%0}RJS6hKc3zk>-K zXVgp)JgFR*1@QyOc+yP0AqJgHwiUPc=bLrf20bV!hkuDmcpYRGQ?`foWbJZUIg{Hv6%zq-4fr@&9=Ugu&P zuHEWs$q5y=pfGssESTn@FY#!fq-}sJ(q(1&ud%FAdHz>fw5KY&e|0C$$0pnJ9Irv| zkvNYHA4tVJis`ppv4>CT@|y>zTgn~3JrULqNh8`KXyOK}bSc+<8y$TD>qHFeK##|g zX*EjOfQ`!Z%ig5J2%0Q)vd+#Dgn@nxM=A(=8?pi$n4PL@xt!p71~HO)aH5?Jyn#VU zr5r`DfiVsx^pAvqgG6rS#6&hoM(fv##KfJV52Wg!i9eTqG( zMtF>F&m&yJu|hOL63Ue{%2kVr*9b3yC5>^>sg*|f4wXw{~mfZ0Q@3 zHWT!rKaCh^68g~Xm=%qn5B&^`1~iI3^brW7M$m_DHH@?#`c5J4Zsc8-rIVF}2hPMa zSej?O3{kXn=W}Uh13$q8SZ?7ch^8B;ITc(m60kJq0%eA!Cl`%j1IuNgGLGWeKr>vm z7zr{k4<*7n00#48)Ro3XJU#!=ym$MW8#w z(a*2C%<#!Dvl@JO0{&OZsz1Gf(i|KSf(Ac98(9NLuQ9ZqMh*t70;GEbxQhYlrHIbG z7cj2{z6D4xRCMkJKzh}p!4CW<0VtpuGil1Ed#QdQa(q zCtIKca8C<7fH7-tyj#M(2J>ab7c9)f-ymRGhTWv#S`b^b~TE5dr36A_5JPPW$KDAYlN@^9SuA6?h-&o^Ophtnawi1t2Xz*w zevWQxc=%#tG<%b44p9JNlQlS@W@a?Ob{ee4sSCkkz4IDAn%KSs1DGhGx`Mh1vAl+E zEY00?&ojCSxw)H=o4X0Qxtoxiy9wdl@Lp!2{D^}r0l0e7fgz%M7FccVguH(!zF0=w zgjwjbl1_WYDrq?|C0x}qFfpG(T{CmE&a4)yR)X0V%>7`FnIMQ`BIsR!ST}6k3lu{v z8?mlx+=rNNI-SQ{jtfCBwDz4sRq(%|9|Xa3Pflmifzju6M>HqK>HYKcm>pf zoLYzB*L;GIh-q!A0tg9QthtMlC#~ZqK9UJF|DwR9_4Y$StQ#+k_s~eZmXC2yTmwTC zIJSC19hr}hECJ>R_Wh{_PFK(nS91noP-{K-y=uA&Sb`j0QUni%jvqUzKy{vvD zG92ou?b|SS1Kw5NO|O;Jorx?#J!)o?!u6NSc$F^5_L?-cpTy$DXEW4^61(|bvb{X9 z;ef<)C2W3G$;Q&L`&HZ7Sbk_F+!XD>3y>{A$?Cl}Rxaiwt2=GXXYTJDW?@w;ID##A~g(xAd0fr8n57d|EQvc`^H7LqB8G!nEIlhspp zmJ#)oZtE~?O#^*Ljw*+;k$A1H20~dZIk+N}<)_t?s?}nMvDH=tJ!l7~#*sm>u1~O% zrd|$Zc~M7oqkd1ZydJ#g+o|2d*fcV_DNHl^VHnE~-m4k)d(_}?R^n_VXbW1(txdK~ zhV~e=LoTY-;Ve0dVa{kO_Y@S%<@jFPL9Oty1hP8b$8yze?OAx}71%K6giQip`a@+A z46o(YIT18}4JRWQKb2LdMKSGIR@#$9uN<{E^U~fVdabCvnV0s3rUB5Kc{M3opGWBg z?M{V0cs1X!FdFli)dP8Ijg2L$^e4IwdOC{Yo=kHP91%Va^BHb_4_zc9kl)3#e7h5) z5QD9K!8xvGI9Y))!DM5PI?c)2My2W_jVdgb-vYU&qq>o?2h*e{08IZ^xl6{!56_G;BMDJtgVCr0Sdv`Yl%ArtM{CnmOZrs5O7yPbR4b$&uqPG9kEQlVqTiymQ;A-owf|1^5i!$A z<_|SFh20nNGD@lRl8N3~*v-=P4E3cHHX2!DPu0V>I*rxxwT|C&^r7(K_Z(`wbZxEQ znyv>6Ki_E1kuB*6R)BIONY9a<(Qj}%&k<=A+99K3RPy08wa3LiN9}a@8S+Tf32IYL zg*+W~ncAC3W?j_V)Gj5Ne@1;o?Mk9=h&n{=I%>Zg^%J#clFWP2>X;nnpmjVahvf%; zhk$)m9IcP!8frhqlQ$?I1KNtY3Z{EM6OtDbZ;fL;NTDau9v0dr=w%z;THg&2niL{} zA=qr_BGeUfCK!`!yOn@DBo!R9O(Y=Oash&DACpdUNLYvv5JGJC67qy3fMvH$BsniP z7iQZ}9AC(9Fc)FVAx>_{hXC=m*NM|HcoI65ZF7i|$2sY?9mMIxIqhvp#OcgAU2V@1 zrwiv4+oFimH8l1(%=v8(604j2AV9gTONP3;9ZR%-0iqZz(d?a6FSKJFjASLs-a>V{ zlR4G0_AD~07RIO&#dj~3+v7W;TkDL~DiMB>w7Wg8J|!La-2>If-SA-t{qBJhl%Nji z$R_chCZP`PmRi-J%K*)Fs0}Shszcv*{4aH=Pabltq*WdAtcG`@m5(C}4kp4uw)!p% z)jO^lj5rz&J!bjzwMaO=yEeQpyRk^eMtykY(5?pa`FtqIZB&-elFR8wInq8zFpG5^ zn1&ErO~|r=bCUEvta}Isg;QQzKcIFnZwGyyp-#$YT^zmIA_*qINa#mg&p^zEY(`T!Vu250v^ug1-z>LTA(k>h28b4W^Nrs^WLPEAe#4uHU}}cNDm_3 zM`Q1)74ua^dR6b(AHDK7`L5y9?E5=(CEr4PT7={xux-hSB~bGwfvp?zS~i2?3nXw$ z5%^@ja%hM`^5dkD?xJ6Zcui>Q8f`6Klg1FP(1#R+DF=r^R$@MkYsH*vPh7ssl8CkLG2Zm7-Y&p z7h;f^-fQ7q*Cm8YluemH&YhX+pFMGp@0P7Pda-umwoJ9W7fVT}2j9@EEbgEU?*Klg zzC@9Ov>X~is>JfZd8NDhB(x+-taSC`UJUmv^;|DDh4okOC}VDRRh?7D`m+h@-ZJK5 zbJd^9SRb}o?OKj)-xum5<;*Q^EK*-7XZ_d(^=dimlN5m)d$t*mOwYi6b|f0Fp+WyT zjLcGNZe<6>%51e;Z{{jZfmmk!nW%AKCC2s147(f za&me#SMJE$@E~zT9dsM7GN0bYt4wZRy~@1TPp>kjJxM!JowY5aX>U>!fL5wa`$D6Q zQhj%Sy~>zQSn;^7RhiHG>s7`!RI4&whiX-3=uo}N1g(l20%@u;YlgCf09BcwH4Zv; z=2a#*GY*>xsxqiP_=A=Z+Fn}m8T}(f;?Rg0jD{dl`3deEo)5swPw?AOzfzmZPw@5# zlGMu&*$auc{0)@W{62w|V`s&xtFB|FM@LsJ{_6Y30PEl@pUzPE1-k2{K_R z7T^k|u5SpjZP9j9EwQ7P5QEneJ8B7m6#H%X41G-umrN^58+r_5@nMw=rxBxVERscG zuE*pFrl5RVfvubE)@TvWonvzZQa5j5CkcX|PC=BzU_QPH68F!7f<$TLH3^NYSj59UksLeQmyH`JJGY;&Gb3EgC z&p7on4g>Ww!a(!cp>d>W95oszkjBBJab9U0V;ZNM#-XQi7K$@c{*Z1Qof;>q#zCub z{;D0z;yBAVt~E|^jl*5z;MX`HKCU0l@-X3p_B^7{XP6N=oWVDqS#Rc7;E7waZ#?O><_ARK$NLQdB(CUV4I!G;<@dU8mkNrE=n|ni->KO}u;ROx=*>AMAh>cC-D4qifg| z7WJR<>b|wCuR8KkY}k9OW1}KwRNgG3u35*X!+{oa4Pno+>lQV43yW)zH?Z9j{*FOC zzKOXkjVSOqlL_0zI^*vd)LxrdF3y7P+k_I1gNx@uW_#3sZNlE-xXL!OE-Xs@c{9`g z4hav#qc%feFDFUUuy{|ZZ$b!v=)kS35nGs9%<8VjZGrjn?rPsH%oU&mY`SQH(?tuM zE?VGp(E_K77C2qB!0Dm|P8Th3x@dvZMGKrRTHtii0;h}K4bVmFn=V@4xB@aQaJp!L z(?tuME?VGp(E_K77C2qB!0Dm|P8Th3x@dvZMGKrRTHtii0;h}CH(j*8>7w=hu#6LE zTHthT*RSLFrt4C}l-F>|lWXr$EK{nQ@E`qK={K;po_?q>FlG<`&Q>&R+`)RYsAwE8 zu8As^OL%P+h1g&+i8q3<)u^5qn3Ra6HtAjpbhTX@Z#Z?Tu_y;H>T(EwM+ipKOiS z`~`3N3x5AEm=2m+>z@UF0|#VSzd{uGi})-9#*LF>yGa-$Ov=}e=}Eu|0i(=%fGdD$ zs_4}X;l;oSdBt*$ZeTgEaRVWKBXBBCZl2fq`+|(jI zF3}N@%ug+rC+WBVxEJ{E>9{BG83fp`!M=Ppbby_u`lW^*YqWH?q{6k62E?sP|+h3>jh^cN1<4Y#ekGE(aclZYdyy z`vD(=d)RVtJObFbK~g{-1vcCu{1otU%s?LG32%^u=;nwK;SC6E_p0YV!iGA^rH1W> zgS5De87Ra?gI2eJ?*cY%<)ps`*f@hH2OEHmqjbUtfctbPmOn#k5IzoUycHzg57p+MjHd$|Zz!pAKk(I(Vp)cKB+A(k zU@Cir!4C+tKsbpNMjevEd|Ie-CgG5;{T0 z2Y^=suh;RHzz<-0wCD$dg&#n8#aAph>H>cNBgf~`C(ZAD;nXUY=`%`T0v&WzH5&-R z+c^A+4Eiw29dH0sF*hRC8+dXn`QgCE*3uKe2o`~`9U-SBL?f&N4nYx5*YP@FV~0i~ z-U!^kT}wtc0Ml*C=%E=CPT zY2XgfU(09_#Zn}JJ){5!4(kGkfsGMT$iD@igpiHV`9A{xVk(xgf#v!afcqeV^nQ=* zT>+-8i!mkX@XUBjAbW#=WxUf1L;qai7cz((DAMt82&_a%k#9mI?sDHC>3;CEl;yGD z$6&<9eT)8d=P}d}yFTZSqee_q4SEJL>=@HX%Zb?50FwQ*0NXbc1X%7SR=^IrvQJmXL_o&YY#O&AX} z6pVnd4g}iK86E5fZkxKKny~1bo28;~^Q`fF<<{rXy454+DQAiWKc{ zNWKPmFCsWu=g$D1getjT5C3vtpe&?ri81Jjid=zW~?a2 z#OeRc`ga<>5q|iBTPSw?_5rxHs!P9R?hdr!UpW|M9*J)JGt|0)V5reH;)gr%l&cQ- zjzz0yzh!n24+B@e#kQQCRGr^5ujQ4OuoK^;mVD1V;+Em+xbJa({QG@O=&#lhyZk{W zbk9-WBKDG()#JqezMcu`YVaxM742`RIj2B6wu=dC)!`sX4;*5`1$7=ZCx6d`%PK?P F{{vfWb?g8D delta 18390 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 G+x#!Mzhc7x diff --git a/raven_spn/src/raven_spn.cpp b/raven_spn/src/raven_spn.cpp index c23fc50..a9891a7 100644 --- a/raven_spn/src/raven_spn.cpp +++ b/raven_spn/src/raven_spn.cpp @@ -49,9 +49,17 @@ int main() { configure_irq(22, spn2_interrupt_handler); + uint32_t xspn_count = spn_checker::xspn_count_reg(); + uint32_t batch_size = spn_checker::batch_size_reg(); + uint32_t iterations = spn_checker::num_iterations_reg(); - uint32_t step = 100000; - uint32_t iterations = 10; + printf("XSPN COUNT: %d\n", xspn_count); + if (xspn_count < 1 || xspn_count > 2) { + printf("ERROR: invalid XSPN COUNT"); + return 1; + } + printf("BATCH SIZE: %d\n", batch_size); + printf("ITERATIONS: %d\n", iterations); @@ -65,11 +73,13 @@ int main() { uint32_t readout = spn_1::readout_reg(); printf("READOUT first HW instance:0x%x\n", readout); - spn_2::mode_reg() = 1; - spn_2::start_reg() = 1; - wait_for_spn2_interrupt(); - uint32_t readout2 = spn_2::readout_reg(); - printf("READOUT second HW instance:0x%x\n", readout2); + if (xspn_count == 2) { + spn_2::mode_reg() = 1; + spn_2::start_reg() = 1; + wait_for_spn2_interrupt(); + uint32_t readout2 = spn_2::readout_reg(); + printf("READOUT second HW instance:0x%x\n", readout2); + } uint32_t axi_bytes = readout; axi_bytes = axi_bytes & 0xff; @@ -85,8 +95,8 @@ int main() { uint32_t result_bytes = 8; printf("Result Bytes: %d\n", result_bytes); - uint32_t in_bytes = step * sample_bytes; - uint32_t out_bytes = step * result_bytes; + uint32_t in_bytes = batch_size * sample_bytes; + uint32_t out_bytes = batch_size * result_bytes; uint32_t total_in = in_bytes * iterations; @@ -101,28 +111,34 @@ int main() { uint32_t in_beats = in_bytes / axi_bytes; - if (in_beats * axi_bytes < step * sample_bytes) in_beats++; + if (in_beats * axi_bytes < batch_size * sample_bytes) in_beats++; uint32_t out_beats = out_bytes / axi_bytes; - if (out_beats * axi_bytes < step * result_bytes) out_beats++; + if (out_beats * axi_bytes < batch_size * result_bytes) out_beats++; uint32_t current_in_addr = in_addr; // inject SPN input data spn_checker::input_addr_reg() = current_in_addr; - spn_checker::num_input_samples_reg() = sample_bytes * step * iterations; + spn_checker::num_input_samples_reg() = sample_bytes * batch_size * iterations; spn_checker::start_data_trans_reg() = 1; spn_checker::output_addr_reg() = out_addr1; - spn_checker::output_addr2_reg() = out_addr2; - for (int k = 0; k < iterations*step; k+=step) { - run_xspn1(current_in_addr, out_addr1, step, in_beats, out_beats); - run_xspn2(current_in_addr, out_addr2, step, in_beats, out_beats); - wait_for_spn_interrupts(); + if (xspn_count == 2) { + spn_checker::output_addr2_reg() = out_addr2; + } + for (int k = 0; k < iterations*batch_size; k+=batch_size) { + run_xspn1(current_in_addr, out_addr1, batch_size, in_beats, out_beats); + if (xspn_count == 2) { + run_xspn2(current_in_addr, out_addr2, batch_size, in_beats, out_beats); + wait_for_spn_interrupts(); + } else { + wait_for_spn1_interrupt(); + } printf("XSPN finished\n"); spn_checker::offset_reg() = k; - spn_checker::length_reg() = step; + spn_checker::length_reg() = batch_size; spn_checker::start_result_check_reg() = 1; - current_in_addr += step * sample_bytes; // 5 bytes in each sample (NIPS5) + current_in_addr += batch_size * sample_bytes; // 5 bytes in each sample (NIPS5) } return 0; diff --git a/raven_spn/src/spn_checker_regs.h b/raven_spn/src/spn_checker_regs.h index ddcdb03..ff9e250 100644 --- a/raven_spn/src/spn_checker_regs.h +++ b/raven_spn/src/spn_checker_regs.h @@ -45,6 +45,9 @@ #define SPN_CNTL_REG_NUM_INPUT_SAMPLES 0x50 #define SPN_CNTL_REG_START_DATA_TRANS 0x60 #define SPN_CNTL_REG_OUTPUT_ADDR2 0x70 +#define SPN_CNTL_REG_XSPN_COUNT 0x80 +#define SPN_CNTL_REG_BATCH_SIZE 0x90 +#define SPN_CNTL_REG_NUM_ITERATIONS 0xA0 template class spn_checker_regs { @@ -69,6 +72,12 @@ public: uint32_t r_start_data_trans; + uint32_t r_xspn_count; + + uint32_t r_batch_size; + + uint32_t r_num_iterations; + static inline uint32_t& start_result_check_reg(){ return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_RESULT_CHECK); } @@ -101,4 +110,16 @@ public: return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_DATA_TRANS); } + static inline uint32_t& xspn_count_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_XSPN_COUNT); + } + + static inline uint32_t& batch_size_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_BATCH_SIZE); + } + + static inline uint32_t& num_iterations_reg(){ + return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_ITERATIONS); + } + };