From 097e0217de61aac454d4fb999a74b2b691bbeac5 Mon Sep 17 00:00:00 2001 From: felsabbagh3 Date: Fri, 22 Mar 2019 03:54:59 -0400 Subject: [PATCH] Added support for MUL/DIV (Passes all tests) --- rtl/VX_d_e_reg.v | 6 +- rtl/VX_decode.v | 25 +- rtl/VX_define.v | 42 +- rtl/VX_execute.v | 140 ++--- rtl/obj_dir/Vvortex | Bin 352172 -> 356652 bytes rtl/obj_dir/Vvortex.cpp | 880 +++++++++++++++++++----------- rtl/obj_dir/Vvortex.h | 11 +- rtl/obj_dir/Vvortex__ALL.a | Bin 31768 -> 36568 bytes rtl/obj_dir/Vvortex__verFiles.dat | 26 +- rtl/results.txt | 72 +++ rtl/test_bench.cpp | 10 +- rtl/vortex.v | 4 +- 12 files changed, 766 insertions(+), 450 deletions(-) diff --git a/rtl/VX_d_e_reg.v b/rtl/VX_d_e_reg.v index 288ade1d..e9223e34 100644 --- a/rtl/VX_d_e_reg.v +++ b/rtl/VX_d_e_reg.v @@ -9,7 +9,7 @@ module VX_d_e_reg ( input wire[31:0] in_rd1, input wire[4:0] in_rs2, input wire[31:0] in_rd2, - input wire[3:0] in_alu_op, + input wire[4:0] in_alu_op, input wire[1:0] in_wb, input wire in_rs2_src, // NEW input wire[31:0] in_itype_immed, // new @@ -37,7 +37,7 @@ module VX_d_e_reg ( output wire[31:0] out_rd1, output wire[4:0] out_rs2, output wire[31:0] out_rd2, - output wire[3:0] out_alu_op, + output wire[4:0] out_alu_op, output wire[1:0] out_wb, output wire out_rs2_src, // NEW output wire[31:0] out_itype_immed, // new @@ -58,7 +58,7 @@ module VX_d_e_reg ( reg[31:0] rd1; reg[4:0] rs2; reg[31:0] rd2; - reg[3:0] alu_op; + reg[4:0] alu_op; reg[1:0] wb; reg[31:0] PC_next_out; reg rs2_src; diff --git a/rtl/VX_decode.v b/rtl/VX_decode.v index 9b974ece..125be236 100644 --- a/rtl/VX_decode.v +++ b/rtl/VX_decode.v @@ -29,7 +29,7 @@ module VX_decode( output wire[4:0] out_rs2, output wire[31:0] out_rd2, output wire[1:0] out_wb, - output wire[3:0] out_alu_op, + output wire[4:0] out_alu_op, output wire out_rs2_src, // NEW output reg[31:0] out_itype_immed, // new output wire[2:0] out_mem_read, // NEW @@ -45,7 +45,6 @@ module VX_decode( wire[6:0] curr_opcode; - reg[3:0] alu_op; wire[31:0] rd1_register; wire[31:0] rd2_register; @@ -94,8 +93,10 @@ module VX_decode( wire[11:0] alu_shift_i_immed; wire[1:0] csr_type; - reg[3:0] csr_alu; + reg[4:0] csr_alu; + reg[4:0] alu_op; + reg[4:0] mul_alu; // always @(posedge clk) begin // $display("Decode: curr_pc: %h", in_curr_PC); @@ -306,6 +307,20 @@ module VX_decode( endcase end + always @(*) begin + // ALU OP + case(func3) + 3'h0: mul_alu = `MUL; + 3'h1: mul_alu = `MULH; + 3'h2: mul_alu = `MULHSU; + 3'h3: mul_alu = `MULHU; + 3'h4: mul_alu = `DIV; + 3'h5: mul_alu = `DIVU; + 3'h6: mul_alu = `REM; + 3'h7: mul_alu = `REMU; + default: mul_alu = `NO_ALU; + endcase + end assign csr_type = func3[1:0]; @@ -318,14 +333,16 @@ module VX_decode( endcase end + wire[4:0] temp_final_alu; - assign out_alu_op = is_btype ? ((out_branch_type < `BLTU) ? `SUB : `SUBU) : + assign temp_final_alu = is_btype ? ((out_branch_type < `BLTU) ? `SUB : `SUBU) : is_lui ? `LUI_ALU : is_auipc ? `AUIPC_ALU : is_csr ? csr_alu : (is_stype || is_linst) ? `ADD : alu_op; + assign out_alu_op = ((func7[0] == 1'b1) && is_rtype) ? mul_alu : temp_final_alu; endmodule diff --git a/rtl/VX_define.v b/rtl/VX_define.v index d0e20785..b6ffe6a5 100644 --- a/rtl/VX_define.v +++ b/rtl/VX_define.v @@ -46,23 +46,31 @@ `define BGTU 3'h6 -`define NO_ALU 4'd15 -`define ADD 4'd0 -`define SUB 4'd1 -`define SLLA 4'd2 -`define SLT 4'd3 -`define SLTU 4'd4 -`define XOR 4'd5 -`define SRL 4'd6 -`define SRA 4'd7 -`define OR 4'd8 -`define AND 4'd9 -`define SUBU 4'd10 -`define LUI_ALU 4'd11 -`define AUIPC_ALU 4'd12 -`define CSR_ALU_RW 4'd13 -`define CSR_ALU_RS 4'd14 -`define CSR_ALU_RC 4'd15 +`define NO_ALU 5'd15 +`define ADD 5'd0 +`define SUB 5'd1 +`define SLLA 5'd2 +`define SLT 5'd3 +`define SLTU 5'd4 +`define XOR 5'd5 +`define SRL 5'd6 +`define SRA 5'd7 +`define OR 5'd8 +`define AND 5'd9 +`define SUBU 5'd10 +`define LUI_ALU 5'd11 +`define AUIPC_ALU 5'd12 +`define CSR_ALU_RW 5'd13 +`define CSR_ALU_RS 5'd14 +`define CSR_ALU_RC 5'd15 +`define MUL 5'd16 +`define MULH 5'd17 +`define MULHSU 5'd18 +`define MULHU 5'd19 +`define DIV 5'd20 +`define DIVU 5'd21 +`define REM 5'd22 +`define REMU 5'd23 diff --git a/rtl/VX_execute.v b/rtl/VX_execute.v index 30d1957c..eefc0777 100644 --- a/rtl/VX_execute.v +++ b/rtl/VX_execute.v @@ -7,7 +7,7 @@ module VX_execute ( input wire[31:0] in_rd1, input wire[4:0] in_rs2, input wire[31:0] in_rd2, - input wire[3:0] in_alu_op, + input wire[4:0] in_alu_op, input wire[1:0] in_wb, input wire in_rs2_src, // NEW input wire[31:0] in_itype_immed, // new @@ -68,101 +68,53 @@ module VX_execute ( // $display("EXECUTE CURR_PC: %h",in_curr_PC); // end + /* verilator lint_off UNUSED */ + wire[63:0] mult_unsigned_result = ALU_in1 * ALU_in2; + wire[63:0] mult_signed_result = $signed(ALU_in1) * $signed(ALU_in2); + + wire[63:0] alu_in1_signed = {{32{ALU_in1[31]}}, ALU_in1}; + + wire[63:0] mult_signed_un_result = alu_in1_signed * ALU_in2; + /* verilator lint_on UNUSED */ + + always @(*) begin + + case(in_alu_op) + `CSR_ALU_RW: out_csr_result = in_csr_mask; + `CSR_ALU_RS: out_csr_result = in_csr_data | in_csr_mask; + `CSR_ALU_RC: out_csr_result = in_csr_data & (32'hFFFFFFFF - in_csr_mask); + default: out_csr_result = 32'hdeadbeef; + endcase + + end + always @(*) begin case(in_alu_op) - `ADD: - begin - out_alu_result = $signed(ALU_in1) + $signed(ALU_in2); - out_csr_result = 32'hdeadbeef; - end - `SUB: - begin - out_alu_result = $signed(ALU_in1) - $signed(ALU_in2); - // $display("PC: %h ----> %h and %h",in_curr_PC, $signed(ALU_in1), $signed(ALU_in2)); - out_csr_result = 32'hdeadbeef; - end - `SLLA: - begin - out_alu_result = ALU_in1 << ALU_in2[4:0]; - out_csr_result = 32'hdeadbeef; - end - `SLT: - begin - out_alu_result = ($signed(ALU_in1) < $signed(ALU_in2)) ? 32'h1 : 32'h0; - out_csr_result = 32'hdeadbeef; - end - `SLTU: - begin - - out_alu_result = ALU_in1 < ALU_in2 ? 32'h1 : 32'h0; - out_csr_result = 32'hdeadbeef; - end - `XOR: - begin - out_alu_result = ALU_in1 ^ ALU_in2; - out_csr_result = 32'hdeadbeef; - end - `SRL: - begin - out_alu_result = ALU_in1 >> ALU_in2[4:0]; - out_csr_result = 32'hdeadbeef; - end - `SRA: - begin - out_alu_result = $signed(ALU_in1) >>> ALU_in2[4:0]; - // $display("Shifting right arithmatic - PC: %h\t%h >>> %h = %h",in_curr_PC, $signed(ALU_in1), ALU_in2, out_alu_result); - out_csr_result = 32'hdeadbeef; - end - `OR: - begin - out_alu_result = ALU_in1 | ALU_in2; - out_csr_result = 32'hdeadbeef; - end - `AND: - begin - out_alu_result = ALU_in2 & ALU_in1; - out_csr_result = 32'hdeadbeef; - end - `SUBU: - begin - if (ALU_in1 >= ALU_in2) begin - out_alu_result = 32'h0; - end else begin - out_alu_result = 32'hffffffff; - - end - out_csr_result = 32'hdeadbeef; - end - `LUI_ALU: - begin - out_alu_result = upper_immed; - out_csr_result = 32'hdeadbeef; - end - `AUIPC_ALU: - begin - out_alu_result = $signed(in_curr_PC) + $signed(upper_immed); - out_csr_result = 32'hdeadbeef; - end - `CSR_ALU_RW: - begin - out_alu_result = in_csr_data; - out_csr_result = in_csr_mask; - end - `CSR_ALU_RS: - begin - out_alu_result = in_csr_data; - out_csr_result = in_csr_data | in_csr_mask; - end - `CSR_ALU_RC: - begin - out_alu_result = in_csr_data; - out_csr_result = in_csr_data & (32'hFFFFFFFF - in_csr_mask); - end - default: - begin - out_alu_result = 32'h0; - out_csr_result = 32'hdeadbeef; - end + `ADD: out_alu_result = $signed(ALU_in1) + $signed(ALU_in2); + `SUB: out_alu_result = $signed(ALU_in1) - $signed(ALU_in2); + `SLLA: out_alu_result = ALU_in1 << ALU_in2[4:0]; + `SLT: out_alu_result = ($signed(ALU_in1) < $signed(ALU_in2)) ? 32'h1 : 32'h0; + `SLTU: out_alu_result = ALU_in1 < ALU_in2 ? 32'h1 : 32'h0; + `XOR: out_alu_result = ALU_in1 ^ ALU_in2; + `SRL: out_alu_result = ALU_in1 >> ALU_in2[4:0]; + `SRA: out_alu_result = $signed(ALU_in1) >>> ALU_in2[4:0]; + `OR: out_alu_result = ALU_in1 | ALU_in2; + `AND: out_alu_result = ALU_in2 & ALU_in1; + `SUBU: out_alu_result = (ALU_in1 >= ALU_in2) ? 32'h0 : 32'hffffffff; + `LUI_ALU: out_alu_result = upper_immed; + `AUIPC_ALU: out_alu_result = $signed(in_curr_PC) + $signed(upper_immed); + `CSR_ALU_RW: out_alu_result = in_csr_data; + `CSR_ALU_RS: out_alu_result = in_csr_data; + `CSR_ALU_RC: out_alu_result = in_csr_data; + `MUL: out_alu_result = mult_signed_result[31:0]; + `MULH: out_alu_result = mult_signed_result[63:32]; + `MULHSU: out_alu_result = mult_signed_un_result[63:32]; + `MULHU: out_alu_result = mult_unsigned_result[63:32]; + `DIV: out_alu_result = (ALU_in2 == 0) ? 32'hffffffff : $signed($signed(ALU_in1) / $signed(ALU_in2)); + `DIVU: out_alu_result = (ALU_in2 == 0) ? 32'hffffffff : ALU_in1 / ALU_in2; + `REM: out_alu_result = (ALU_in2 == 0) ? ALU_in1 : $signed($signed(ALU_in1) % $signed(ALU_in2)); + `REMU: out_alu_result = (ALU_in2 == 0) ? ALU_in1 : ALU_in1 % ALU_in2; + default: out_alu_result = 32'h0; endcase // in_alu_op end diff --git a/rtl/obj_dir/Vvortex b/rtl/obj_dir/Vvortex index 81641bcf3ba90dfb451c0d1502c7fe05c5cdc12d..79791de5543534b9d730f30c1e956a52a99e341f 100755 GIT binary patch delta 62618 zcmaI930zgh`#*kX4k)Ns5WRwe0t$*dE+{T2F6ebj%q27zOmoR4b4lC+7nJMqBzC%v zsTsCvrDAwHSfOYxsFhe*=91(`>rhr$rnvHdo@ed_ufOl>-{<3f?(=?To_XFgbLPyM znREI0knQ8Ewroe8WFL#yf5{uSbPme)vsf6w_p3{5w%^99J%iQ<`Ve}rHsCdV?f7MS_-C z(0wRRHjnfeQ+=iNbudbYCAvz{KNlhKmqtK68^Q)S+#KA)PH>}hr}-feCq1))nWqc&ipuN zL~_>`*DX4wkC?zd*XLG?=VcxB539Xm^E>Wi$pFVKz!6qi78Dep*Sq=%mRDB09#iI2 z_tC2d9t-%sjgQ5yBxTqgC(Ir-eDsTf4I1Yr0j9cQD=I2XyFYx_;kej$ z!`Dauwcc{Y26C$Hxw>08x?OJC)rBQ?#}RW0B)n+5!4#GG=%<38Zdl)f36gf&9Z8S~ z6UHs?>0>c(ROp>UMh#fVd@Q99EIKJNhdoj(0X3mk?T%3yW?XfEwdKWTG9&_f?z*H6 z0SC*>Hso@7zTJ^YmE071=eHqGD`S~YUh@V^nBNIXpoNHbds(nv*f6W{yWPRVsuO{B zM^6Y~J88#3>tI)H8Qt}%q0xL`cU=p8j`x0~-wbV7fA|9hiqtGvD=V@oKHITwdSqBr zp0-x+9~Nnw-3?t9`az}oK`OiBxVi3uzAUT}f9IjTHSA!5rHRGjICCHaGCRI8n?3}G zj?9ur6%}s2^c^}<>qul*fEGw_9)y|oroO3BbinNhAIoRhRk5GVy04#V)Q?-5=z)zx z`OpV?o5m4*;XQp=*lG}RECJoxmyzQw8 z%68r{^n2)QCFTggy(pbGr{2<6Hxc~3P`y#pi+s>+{a(|t{EJ)q=&0uW*@k+0)J1OI z(#J)Q1`Xs#$WAH8wQ3w+Su`n{Ip>g@j$BGux4sEaLg!o2*K zKCRV!OL47&LPnjhR8tnH((i9KECrc7Deo${)g_gwn~ z*7NIYie;T&*3jS7g|}86haqkGdGml9`;{0}$P4cr!}!1wePEZF{L&Tu(=M;@aaZ)t z@xw;-Eg=#&VT4A%_7x}Mq4Q$5GT;6M37vp}uGrj$-?g~Qm<*_|MHQ1fk_yd!r4y`tiH<{3!C z>{@0S46e|Eg_JYXM4`p~>VuSBC8((`0%7O^EgjHuN?K4RjZ$-2;LZZW8wp2&pVUY= z3Ia*fNSx@6Bb~*5qBqS(>?fe_VbvFe$V4O@T7=Z7496LWFN+FwMP-oG(m6Jj$Nt#1TM9|@kmo}+scG8?A9L{8^k#IOu zNOPsk(hnts1*b|I35RpK)Z%C9AEtzcG`d6qPRCeOSE@U}=u7(L6iGgoREv-DTTgobpz zNC76x0PXGodtcNKkMRUph#53%F3tcPT0Ujh2vnV*OHu+uZ7jfBIQB{gzJVF${v{bbk{3|l)-VH2df z5W=vXfO<6o<@9QV&FEaSF2mWIL(8V325N+=PEsA(PDG(2lhLhdxuiKsIGp)XBjIos zlIALuY>K3fgu_`ZHF8F5%3nb5S{Vta3Bug5)P+j4kUp-h{ECYBhBSEM<3R^QMxn*N>hl` z$QO|*kz~$GGQ~*d*bhX8AQ=DMWWEN}iwx!TA`^qoHLD`YL{L$holwoFp7hyVOX);7OV*c@AD5=_%4i!r@Gn8aX32MUqXSWRs6(`faAr%51dOz#xi(8S zInqYL;oK=Taz<=&C7Yd+O%Aeo_&u>9NOd8EYXhH`qbvAjrZzQ*S-hgMES4b%u#ouoRnKuiM{0}9oxX(6OJNjRJlQX>K5 zGHI@u7xgRs8l_89EDE^0OO1RHnG8uLO_G_5Wa7S~rXfgmA%tWS0QDk6Ilai((Ya;~ zlw=aAC~W|ts*_ZQmLlUwmPV;*siZkcz}!JIX(9nL0jZHMA~Ri* zNtI+$kj(IJi3~xi3n3&k22d|Dl+%k$Hagd=BjK?US|*E%vTKB@PEs9O4x(@^kkPGa zJ4thrfO&@0NWfrCnk%2k6iO2bm^Da^d=Z&sNyaY8BqEvFXNe3!stX|`vk*`(GL+Mc z%z1RKSvS!msa8xy4b%u#ouoQ66H&Mn$mrIzGSZwRU{WGA5-?W7N()TqEOTi<^CQhk z0;Ua8BWJ`WUb2amY+{g&qnOwbq`DA7HX8x;VnaE-*hHXn&HB?_YMKx#DoP_%b&~4P zViAQ)fsAfV(+~Bu1tv<1oh&ZV9RqjXZ7$muyO;jRZ^{q(;t&O&JBNnIxPg$ma6b z#D*Z%g%Gm24yYF!%IU?X9Gz>{9k8flhv^CxHBci|b&~4P{9Yn978I&m(*j9zl5jXf zq(%b9X3|^{FVSTZBW)yL&MY-@Mr_VYHpP-n5wf}a6|o^mbs>ao*pqB1rx%+N=?fl z%}D~LB2ps(gE48YT-g-)(nbO%3sNIz#Ac^tlOx$|MmFtFQ&SM6x)4G(T>d<0j z91&!6Yg#O6P7*K|ks1kjL?q3XIFBw9yR?yjsk79`8L>%|Z01Tf(~-@Llf;G~)rAnU zc?nQ2Hk8wgO)5IqtT+B8HYrq8lt!rPBo)>p5QUiu8Qq$uUrDkBW=KmGSzKB3^bNxr zrIX^!mZr^8qr4P+sti6w2A_<&e01k5C!<@_{18-~Bw+F(H4-oy zljaJUPaP{l+DO3kKx*WS*u+XUF_KLLvMD%DYzR_a2qBwefO@f^oL+3=(Ya!ADmC2?kmo^eGH(me*!qgf; zVq;RUT8U(H9@*59YzR_a2qBvWPqLw$UTgxaoh6C!whH`qb$wB9uwU%VFnTm?i2vwb=I<#Cw zVQxZ3x2EY8Lu`SC(o#egSJ47}@90M9q&SPE>Ach^F9n|?gWoKJ&&J@NKTN?Bq`DBo z;AaEs6+Gqi3f@HLnl<@PYKjsnO0yHHI!T2!3K>V4G)hggEQE|O`9J}a52=xW(U>$> z;6mzHA<{+y=EhPZXT&B;vdNHa(vZ!HLSjP@>~6T(H~{rxLpi!ADrARiZ(nbQN2T~(v#AdE!GhMPtMK*69 zA~poUR*0L;dw_bep`2c9($KkP{qYZCGna}Qs1XV~B&fnF1qo*c8Qq$eO`4MgtW`*j z1Uws(=E{+5c1jxwm@G?;oDrK8$tGE{u_K!U2Z;?qstY0PX@>#zVnaE-*c763&Dv11 z$)}>CG(urJ1y$HiA>k|{qg&JT4av5^5@|8X;xaM%M(LzD%cQAXYLu6PPn5yO%iv=% z_;UpmJVCI1;tu{YpkBdKPOsqoUZ&v3(blnMK@GQ0NIFS{?Gx0X^Gl=DvThj52QxUh)tkm z<0sizkd0NcAqbY3+-z)5vZ0(_Y&N5Fc<9AVcbJe+QLw8bizF3xRZxS@PoP`Va%B<{ zuvj5A67XzDnyXNJtj#2w^HfxnMkws6pbE5B%4CXCLh^MIzVg)f?X6hn;C$5 zv7ww^Z04eK&AR(nVl$nJf?X6@B&o2Af*N#w0^ORHC6kbV$%oWPz-UaGYqMmNBW)yL zdLT7&Mr?8=o1KzP4zgLEPizQ+T@*K)OhCQZP);v4`RH7;-n>q1a;YfTMUh343cDz% zLFXsXt!c$F2?P$%LlEquxY_Ig z)Qb(}^kQSdvm2VVi)2$yMMY_Z!Y&G`u!}AinP2c;BEigh_V#wl(Nuym8 zQk=2U6fZT(OTlNz;L~LAb1`_=rxZLvuxsKDz5r0K;3=n9@OE?#`@q+zDH5qD%}yxn znos~*3JGVjG)hfNCCy0!CLdBG0i!W#uDNM+nWRY@378v8jhqpi>5@&VWRrqy&bo*V zL9lJ&X7dxEUTi3*7n^K!uK6DNAF|2JqM`<75~^yXIx=$*h2=Xky0y%mq-i8ziYzq} zu!2FFGe1pi?8C#-3#E|+bW^F3H##DdEa}*h$F2RugCLloxOqGPw2H@x%v{*D$KyAv z3h-Oo0PQNAD78-}+^+c~+O_@1%CH!%AbVy-dWHFq$ASASkzI3vp~B4gzM>*4a{v@W z?q&K4^Nc6?I zHMY~D=ZyDDhwvTRe)zPj^2`)$ilNr^2xJL?ECH(%@IaGF3Y;7@@iZA6xCN70kms&{ zFe3mLq|998$(;EmlwLXqPNCy@#mxN5;!5vA(>Ttidx4&Mp6c;i`aPubRBz@-6i7l7 zT!_))2E*|+^9$@3j!ZufH^95nv9(Q@jG}o zW%d5C4>hesRxg1nX;i&sQ}vq@La;trmi9Mf3|I}v#4YQnZ)9a6vW`Bn*Wh6_=qUYh z9Yc#-1;_Wy65tGFm3WG$R#K_!;t4wXQd;LB_BJ}|7O=XntPUof^h76H)1{a59xvd% zH5h;+Lgq4QF7}wI5Rb!5x5It79-+nkbp;#_mKlmX8QeJdL&$6`&4nIwX*$FNnduZ> z)j>YHCiW-5-^zK(j$Jb91W#MF0X#uZom%%l<#9s#3hFA`3IYbc6C{lBleTG%R7*VAyk2u2VLl|_e} z%N#>*fQu6IyWRS*DV;h20XHK!+70JdwcY3vPldZ-C@u1%s(|y&>iczL$_#$v_q-<0 zui)$>{oQHf;FC?i&OX$Cn;y;H*R3;p!}nn`B5Uk&2b}!AzGOxmzkXfcH={25An(|W zAjWp;=U>p+2l~{RG4Q!z=6%Sj&Ps&OuV%f(-p}hfyCq}q>NDn~@K(R*U(R`^<-6dH zM#>zxX3Y>(;T;0H7Hw1IB}tYk@9O9M3Eh8L9D7~wwX8mK=8azVBV)SW z_7#me^)Fu80EQvyxoo5UFugZ>J+D{BQpR4>KVK0EpO;s}wcO~5(Sj8pfvOsp3EQj? z;~WwNWSO-wugA)LjA{B`tA1tc^>eGcvGwl+X0nG5LNGE;$GVxcPJec7a&0iG1ycY3Z?hfx zfwjw7mfj`nuewl%y?f?numr5e6U1hN-6jRSb$yIHfyvJ*_K0m zY4B|)3&_M*xk@RfS61c~zS@YhmHN-w-B`NbVB-LmkvD1MY-W1}1Jm-swYo1Guh%8C=;BnpVq%;ujo0i zkL$1uvWH>>@DJ`J1tHKs&94zfpfnyo@EcTgAeu(MqPKO1)m-jQV0M2+ALVQsg7Lj5VjW4G3S2$vtnVRJ|l}cag4d8&+!}RGOBw8SYcXpXh&WGug}f zk8d`C&wFnU3R{52OgO6mw*(mAVBmw6?+*7ubK5*Ub$ghVa?97E#w^es+q=56z@iFf zDZ}9wvJ}8Q!;G4z|Gd2$o3A%`Yb<;&c&mT(JWmx8BXxO}`QXJW9#qX&;F;;IwDhfS zK`4%-^QHNa)UNqz9(||O{e|1US?Vu(>{(KO&ZDPEeUwL^E_J&{Pmy|ek8UTuqiL|3S&qX+%j)alJ8i);5Ggp1?%?3aWNO`|c7=Av7ST2O{XhE8{PL%6gNH|tN=U)>cR zG|kgHo6Fj4_r88;SF7OXE9=RbgV~S3$x1VChR!~$Z;gft0Zb{F-QnACPhQlA!x>-n zZr-Ag1~7g~*9$+64hN@>%$;zB%2t5)MX#dfb`J#uejtF6jVW0yW;Z%Dei6Ot;vr6_3d@cjY5cJ%#`5Z_`Hs_$VGhfBKH zRqLnpwbbA4Uj)f=$!^_6;4ii9?P03zs}tz^I)NookjX(`OT#de!*?m!VW?Ww;Araj zFLC%WFHNkhxKTUJBh&QH1Gf>(dchBE;q%51@3F3Vul?9xVV(1Sx)8zm zi%kRK!M&Cc5BEj8W^KPsZ*!@wA7R$}OZCZ@+OSS}8!v58SbIIPBwVPOW?Oyx z)#H4^czx>swgtC=WNJYKHVnV;ifItfXkDDms9^}y>k)>?0Ny&HT^x*iOli?2tq z)_L2nzra{a-T${3)-tcdZ!hw8%_)LhSl^)nJ*8rl=5;WZX4b_~wt#@|o9o4;Y2aYs z?|bV_nGIRBxMQPay+MVIZlTxuqh(k#G{6y%OH^UWBwVPOoto)S|1p+D>%0F5X3=@a z{s?0%O22wzUiBynW3C?XTX3zBK=88&xaLhBmG{b@FLD;C|MhoRd?ZBE72dalXy#%a zWFY{_ETwY@O=v%zB6=+u1e`3{ z*ZpQs&Kl<}`F9v&Vfv|CY4F+izkcwU1)rh%*Z7$ibQ{bK_2=%Su?BiXxlJ#-(~iFN zbL&gW+xdlH1ioRz^?l{dS&05q`5HcBfIjJN^LoJ)Ktzd#!nRfBpEqcYaod)+ z=Y9h z5TgE+cO!Q$vMjg&3Db|{v;?&Hnhhjx%URUHl;Pu4&zU(fqp@<#TSkI&y zkf;%IQwx&uCXojKtRuw3cUWeKfkm%pE1yjZQZa?$R~1L`0|2(vF`}xoMvT`|jJ|$s zI&WCbU2?!d*8sf9ss$l<-;A)SB#1t|($yEfxmSm|ctg%($;&46V&RVSId+V1cY@XqPO=;eIHX zLo<+sXn@S8d=$|ukWJ&Ct`$22+2Wer*D97Fnl&6s5PR#e`t4r`uvjt@>H_S^Kgb_D zLIMK_uB7sID4e-K5BlwGu88?{SZYnj8uGIStmG#;zc%`r1hB`?WL!)WE52>|+Ech-~ELDPqQJ?LPdc6hKnau{`;1vkM4BSvPo?}|mc28^w zX5s9v*c;5E*j?lMVD=;Dz2n60hAg(xE$;cb1SeetXC6MPFbm5OO}Qf;HDtF%U?}qu zw?f%+c1O$$W6!gH#rZHcfc+yP8nHQ$U_&F;k=-`FY{b6dV0PAcE;uLfPIs`Gfv$W8G@EK8~dN!8^K97#9Kc2|V8 zJ!`@XibVVN;BtPESlXTq=MhEXoAzwJ^`jFQVits`4lNdwnzL{*y8{cT8CZnj!0YA5 zu86fASdW0ql|_xpHg8-vzU{y|G3D1#MGPFsBI?QBKOC+d7z%oVW=^~!z8S%StNVch zH&W5M8fzk!cVb=G72)c{a=M2%#3HN~=XWs2J8MfPw?oi`*0ro~PK(fWb|nm=NDwU&^t4xhUxd6n>y&FE1B<-GM@f z<;IZi%*K2|VFvgZhwL7}Av?&6Lp)@y%Z>oiI%t;fmiNN73CF`FiQWAj!Pjhql17@U; zaVY5x91^Ww9L(a!INYu&IeZRFCNKoL+hGrA=8I<}hcsMG@pPrx{eZ(6$)O$Iqc!VX zSi*sJC_PZgq475q+>2mvbBHCxH;@KFYtQ*2BMCU1reyW!i=9cp;oEs`4xhi|#UXY8 za44(p#bGmKmF>`+v1*cn3abQF6kY+%3_m3)*g>hJP%scEoI(may7>@;#5u&^js2Aj zzA2*6dV#^spo9?L!vD}G7)Z+*-x=%p=WP`Gj(X8-7yq@M*r z>ihRCQ85-K&iO{8XW^#LH~cFmj$;{o=l{enFGzWNACRsU^J*D;&Sy6h0GJZ16t3RB42E=3=yIpTQJmhRYZ{fwg9QVVPJw zkv+#hE)ka}vh?6wDy&czh8+bbRe$G-`KeG?uGp8#LV3jB;+s@9unnY@g+iGaBCR)V z+f!9u4wjd0KzVaNG5Sq{X%1ibr&#&|wI4<|#R&2NYklVRGlTLesDwy=+?O2JhzGYbX}bMan8vyJ3QtU2SEzl#~qvyuGN z1uQCqeIyd6!szgk7(JEsYzz+Uuwt)f?uYEq8{z6z=@Y81N2&N^DjNVly@UPOf#3#l$3ra(@geC6NYKhE#?qPbg6W&Ow`LO(Ibc(0*awD z=Sx+YCe$kp-ZLSM52g9Obec?ar`O}ej>t46TaZ|BX?;RpZUPkoB7cj2>53A65lLlh?dp_C&Wouob%fhntKV%h^m;55`&O z<#?GwDRi~Yb{dXXu$Lde-l19V91%aJv&l?1x@WMHu!kyqS3;-PjKq~}6!-t+~`jqqr2aJ0T)|dGYa*_Vf5dBq_#%Z`3)tkB@{dsIaCO5e5%@e@4nKZpZBZzWZGaJHmH2xD)NHzl$Y%er3{iI@i{tN37lSsk zn5L^B0{F!qs0bQ5U~LD#1C#|~opmY9P{h6$S>47%p$8oI9S=Gz_9t}s1bNs_!JrOw zDqQ0DMmCsVoc2N8*BIkJO*L#fdrD!ih$)-k(pnOG-#nBdDg=9*Ej8ZW%$9KWvS_pw9uyadVO!Zqw$ONYD-7Xm zo)P^fYpk#rMZX+2zS&FAC14VU#gu^)=#3x1=!6?!uo6-N2rO;xm@iJ`u<2~Rh~2?n zWb;Ih6oGHEiQsSU+i*_^n&a+Uutb1knQ5IP#5*iJX7&?(E&`1YXI90Y4?n(UmMk!S zeuvFxY>x5tdu%>uGsN)^Aoyvb`~wJnhB0&}dx^2B#-Uy8eI*@tDNig|e~&Tl-{mbKS5u{RIqsT0NbdF<7Rj5NBIILp;TebWFY-7q*+Jqh(WM6#M%9OUS7xoivTr4`gTV;YA?*v`IV9pZlU93q% z7(wM`XR3Fa^1fm>*m*%;an{8e@FRW24Hs+5m-iKQK4lHLqpxW5DQnU)0UW^jB6zeo zVeYsKajZ%h0}#+_gSDw93<1p)P(5N|J_`vPeB)6?DfJ3C17ThtFLr#&>bLO4L=j+u z@h7%&2^Y>om8VoyMX~wwBvJAyYnD!x4SVm7q!KfY6!=w9cHF+|IEVcz6Ji+Agkr$o z)rFlZ)85^85Fi0-h9Iyip_4Q>C9`jH(Cn~<4gSsttoA1mepIjon!(-gAd+jK!5-ZG zNX62CTsnNq;X5!aC9$yFygE*7H-Jrt_1GB_4g+p}JPxzr<3PebnXb&-jF=j?BT`&8 zSd(Y8-c?n2^A6O3>bnx5?n&kDW#Cj9^-MtF*%eQUKm<_bzGDF?rQ@Pn!rLl%)ok6e zP*}IAVst(m_}nv9^>^M3gfkd4wrjrgAT@3Q%A*sS?<_AJe(ck|_XmU3J-A&%_cF~o z5S*Iyz~OrX5p^LnK-~32!49x~0i&zRDK=l2C`KND6}d%;V$lH>#fK+~HxIB&{24A9 z@8AvitrTO^XKX(U8c~_cIi0SqabnyTaFZBetoedfXZ+quv7vxnYu+GKu^hlF*>TDY zhN9qFE`01-z6Z-y$9@0lhSzfYpr@a>lutY@E+2$TIk~DZJVs;g9U}q`u}(fL6FTP` zMXaOv^CK1}HXUNaf`?-Z6%;`-82pM+z~DD^xOi}gHRuCTyGIdQ54hLCm=%E&RJreN z-pBHxi4dn5>jZG-0q{}P96DS)Q^>yY{}OMwn(f(i(e^M4Rv(%6yi%$KCi=fWw2CPXdFIcfjgrH#BFcsv>`OL|u_4BUqpU4sgN1gC zH3sqVG1e<+FgSB>uLNSY4+e{e$5>?0z{lL-o#oZ1MeK2Sb{Q&CjQ0oNTpi9~twToB@vlcFaY$vl$ zWfhyx4ifiIvXQZHYr`8Q437694A@|UQm9(Ytx0a~rl|b(Ws*og#afO6!1FX2fnh06 zJ%R%t)Yr{kV8ou^&wXsjy+xzNJ=KnQ(495tI`K%Z3OZ$=cytPaKH1iYJ`HzKKC+Fm zz-A`(+w*VHkPUiTy>-BoYH?i#fY=4iOqlm;IYPO>;3-bby#N!B&SK34*0fK&yTYN* z=0m$cn+M{(TXWIWXj+xIfPhn-E7KR?EXO?1+4$oEQ<(ofs4{T!+7xl;B5TFsMAJ*G zV{n{1xu@4to-T1>_9eKZ#);Q1vB5zds>p9fmuI?*zb~=ix*fgSRP#L-CK_C3v4JzN zD0LwWmPgXG<8j=|MAs6w&-%qLyI&dEi9xZ7H-sOXFTCdTmG%wN~B1?$r^&TsC9!ebC`nJl*5g6HpW@#!siz6lrY{$pEtwPE6` z|6te)HU9h$R&${yqVKR?FvLH92NqmnhKkScuyfy?^F_fk%YkXq5|(Kkn|F z&=8E!X0!XDur?Sdnm%Byc*H=F`~bEI>rv%yhV)RmIVhlcQtF8s4}M$$tJ$|f=& zu^uc)9C-wH)erg$^ATjNLs?U0*6Hr7g>}T+6_B-#ak&Ds1_{{n?!f}ZSjMAxyM7{r z@ppm)D69LqHrAarCO~xKyc-KJ7IHp?aVr-W72cG8-Fp+9$_c4OdCG57q!xFcowd05 z+=qANwYYKHhr{IpxjI+lU4v?RYVaqR;6n{g?j=@K;}NxMfE)QU^6-=wDA+JwSIl0= zY8%DXxIg3mP-u1Dlh@=T)Q?B>{-+0|*KA2J$UyDg1g-sTv&VLrOyaG!^hWeUpEnBfsp`XNP%CCTtFfUbZ>4ZwF21PE zSG3_66rECrwk^lucML+Xa1Gx*qn#b^Q{6ciF9h&t4sv4vZx>{#@@-hY!QzBp5lj|S1q##2C~+d#V~en9P>Xjh-KHT8K8D;Ld!c^gPFDi}J{ zeeqf_9}ePLFmDZ_P6%%dTgb5?Ji677zhJEvWFWJx0&X}e?QENH*|{e~ZlFoI$Oz%# z-1&>x5yG3pHulL7{uyR?E$j%PiR~?4uf-~l~x3PMXV84X+Oic5aJL0V{-n2dZKs#nUZ|;D| zAVt1AMTwb>fVvQ~6x$t(BEXnyhW{)6g=`J$UnYKd-Iy0%BYyGtecrz!wh_>|en|{( z1a$rriyHx*UoINf#@xnPnb9{0iB7c1iVMPo?}T1v%+ZhVjNY)e#r6LWj;VB@`3;4tWFRmH?(zMuaPC9QcJ z`yXtK^HH|f>vGG%%XA#W76{*=$A1B&PGekIwY|KI~irP+Et5QF;hhCyF@`Xn4Z$3|@XwRpK79}@hP8~0qNWIX+q_^BU% zn|&jeCGia)YW3$c806^Bb#_|R7{Cv*Q^v^wJluz!5T%3R0y{3AAHttz$Bg_T{5Qsq zikznaJ!*sv<4(qoh)HMck?ntv z0aVhrj{)?wdKds`m=H0(ko6UiMFHhl7G2Us^f?TBB;G?S6nU27NJaJ?SPevRb{bFDc zf-0tIBF(v5?G>$_=gS&=Napu`A#=W*KEjlI(;iXyJa5T9H2!#=_fmMDpGE5#ycG2M zFYxzkShss>O7)GqC{8ZmefZrA!n%-;;ICgWo?FNVv!FMsBFeu95moFEhhF9mw$&K8 zi0`Y$oZ|j+zL~u)UVnwZ$~KCo>2UdMGzO*f@vOl{PXU^%1n9uPQG~3zy(S7X_^_Z? zt9(<7zbTB!75uKkHW;Cqe10|CO}I$mUXHtN2XJWyZZzlCig#50OdOmwcXw>xAHRfD z_&Of^;0c!EfInOjw+=zoHkd>~G8Vgdt!THNH?*!ri`=VRuu6Rd)e%%}BS{pb0B){)mbu@B27mDCHGD$Nl4;blqIW)zWn+zb`A`oagFeHE zMj2`F7gIRjI>u;vh%3xC2Ac!sYyVY6lrTbcFNBDat0L-!am$D-l@a{|9S9=IBT?Xo z5&iPCJ0cVOIkao=2@#QL|I^}XA&(7(6fow*|Ao9VNx<7znD@tIqs?JnkHb<{j`R4pgWZ#x?07x~|ebvDe){67W{)jwb1eU+frm7UB< zYY1wb(eZ!06K8FW>DT#RaJC#1F5=>wQvO{~bX98HxG`(CHS&Jvr(pmaOLg%0HF-T+ z=zl^TG_9(G-zHVoLDe<61wj=KW}uMQq$65{{{`116z91nS4WEef59~wZA|?Or*Z`o z4e0l+7>hIt%J^i)8XJ-S@NeL_w(o zs}R-i@fQ4x3en*n|AU`-WQ5=6zbU--ec@NZ=fXMZ#T9%v53)W+86TL})HmX}Qdi-% zm>BA-lt3XyyK2hw@C3z-P1Tjv)wmBc!fGpt3b!yZp^gF*HYQpGDN9*}@m`S9TY*P_ z-)zcBcHh`nU-_^)oaY?ZSowwB5u9?V^9Hy5vv4h_~7+ z&%|A+e7n&1Vk1Z;FCRZhDTl~c5mar%NE8GDZZ7{twCbQVZ21d3^1+G*LTQ&_VZ5e& zW@Zs+u~1YAI)I}@XuMNmyx2jRT7&&y{Ln)g>jU$}_Pv#}j1`M+Z!3{TRA1#jgUMS& zl5!o6d{yhOe8)~27y2u$87nfX+m)F^C-!!`g6RZFFSyOo-dNGTzuPu1tW+*jH5< zTgxETla=ulf~qZmgshB&{bJ@ssEqwpl@Xu&|5F)8p0Rf#R>m&4zhY&)YrHfEE8`tm z8B^wBWxOR)=Rsw>Df-Wc%GhQ!T!59a)fli)d0PqCME)K4*VnSm<8K+|Y07gfz*&Xn znxnRh8B3H;;LaPiRB6VXM&G5%=M3(^70Z;ifVN$(3<`R!GKUjqWM-$W#=7MS953Ez zjLA^WRkIB*q^f%SGLBm>`mTkla#U4Sm!it5s=ADSKS5RX5ea!2|D=jDYn6tr;1q)A zGX8$8yQ*-)6auXhi?cTP`45~wjZiIO(R#k#$jMS>GPYLKTBk%YhiJb}*~79#$vWjd zmMPY#P(!PYvFovhRvBwGWj?oM8Wi~B9e&0t5s(dmXH*3~^H62rRUN)Df~xHb{E2o>hON)?!d9b&wZl9uU%mL4}jrZga>`OkE*{zD}^vNtBX z0k;td@=ckntxUEElYKH>eD$F+4`wI5K2jRAeIEQcl6Jc1Ys+)tslU*!!aH@Xrc}0A z5+Fl!?T)MrvF0OX5Y)!mkCf1W$(8+hRF3)OEOGxM;PVH3+#{I!Nr z=2XYLA?Ewa!wLdn`ya5ZL9I<4Adl8YlDDUvVUna< zrDvdfk_*$0&LY6*$==qC^FWk!Wi}YiNW?G@iM@`P6){*gtIXQYyvIG>(%rGen!h2& zDzk3Jtlw3pb0=$W79s@8yY3RUVX}`sm?yXn<{M8!9pPOP$XO54ds1~W=ks*H;N108ctk*3RYw<}SjXj@7>M zV@zjyKu@|Z<~f8S!03VE%_9gU0wha-A=qM0@RWd<-LbL+!8b5rRa3yYjqjvB;je4D zIS(;x9_cV2(@l6XT{m+uLRIzt1t#m_!93x0H=_{33iUue%sL2p*JrZ%0OnE1tW#ye z1bCxbV(v%^v50ft*ipm|iyixvy6L;ognm6m^)$D5QhT6Y=2}lGN$)FkF#pM9iDs$? zlF5oO*$~94YVdo+;t`|H?CH6^&1g?vPpN&(AcU$q^LfnrsN#WlynW3-o`m|D=bwa< z%wtbN{moA*9!&6dHo$!A$z*nOJwTqI2A)VNgD@;BmY3n5n+?!ffkI7XJ`c&J!Y}zu z9#saT5sV(|N2iIvJQy8*N1ut15XK|uSu0>l0d0byyl4nSw`L%M*gvMiDQ-wS)iL~O z^Zug;6^U8+12Se}*1ohz+@q;BfLQ{M`&vNMIqrL}KeGfK_q_$8?s4D0K-4?#Yl5&H z_r2P`HnY?}?t2N;U^uW5A<{?k#=14P7XROEq2|FHCqo>{gL`F$xR$4MXzhXFbdLlmuUIE*@JowicV8PKFBkzc*6vrwDz& zlE^b6Mem;!oA`adGOo}2keiy@k@UUU^$|XTfX@u*C%6o(F8|()LQwM!(k&MFORRuv z)_U+A!o#Jqm&-(!OW9KU)R;;?*Ua%E_EV)^g#97q>Zvmga6fXvUp}ZNQuE4tn zSyvQQT6@Qf8(%1sMzn_!pe$oaU#O#oWW?X!$iO}h(`0wCD@cXPT4(Qwb(UrCfnuE< z{(diN-KEx9YQ02G0d&#?ajZaT5uH5MG3xjBg)*e!eYzGW1~`u=X8a1ru|9=g>cK!4 z_ZD>zD$%Tu=z0()wS7eDK_!9p7TXUh9b2X`cu8>iUl1PN%haT6GS8^L9X~i$@5B2y zmI|#IFYX^yTKGe~i~_Y!yl8Vs8Oh?s%0o)W#)+6KYj|H2>xM)0sMVCNpeDXMq)ZJ4 zYNN{54FWQw%CZL4sPvOusHE5EFa*%vv}jKGssO%&B9x) zW9a76Wgzh#QfkY9PlvbbS{#tsz>~~A1uLSaJN4_Ob}-b*hgVm?<#Aix7d4B2}zHq-yeZ@WnuT#k+i<_2WSg-Z4Zz#+3tVV{cWK8 zvf2DtBD(Z?K>mDrE5+6x9*bdDvBQ~n36=lzQnIrHN>eH+Cwfn^!URK!>&rrg!vvKvYZ?P7x%iW}?ZFl%XbN$Ukabx(AGs zn0+9Xy8_)m#sYeBK&H)|N*$Ah_dJKT0E_64Ngs>EJ82f)Sm7^tcn4El3Bqa)29t@d z)XW9q!+T1z^fXfN(~-1VORv{l zr?Gp5kWLpn4l0hr4s8m$JOfHTzTZn1hcWzVUbo}0;DCeT*OaJqj9bmb&-N#Y zY#+E3@WPr0KM(>kYhEHT|Flo1u7@8Re(>1=I^>|v{zY`xrlgVXq_Xeh=*q@X0)Os=yw7VD2@$~GE&l)7`||K8immVJ>4vaG z5;Z_rgb9lvvP{@PlmrqsS;7vACI~2aK_lBmQD-zpGK|0|V4;GJii!$20uoTf336Fg z1_VSz9T6b`ltEDt6~5o8I-O0i~UQ%iSOSDiZDL)!J7uF~nt zKDPEO>D^&={YQT)L=PBr8w~T#qZnU4QEz^hIwq=bS{fBppR7;UbxowMrTbkQ%}XW_ zZpTu-Cp|bSItd?3dS1vuyUd!+Q?}$?L^ZBfGHMWQ>7AE>63UvozE3N>eR$t@W-Ygx zSz%;sLv5McuQjoPei$)^M}0jKiFqHTYnzVH#8fqSl-?l)OOb@{+mm*xslEs4s??Ei zNk@{Jd~J5BbQ+n0eB^s%oh<&yZ07Dt^)DFQLp9?OKV{!i+#A%dtJ(p1JeuC zc$ZPo2iF$GLV)_vK9w#gE3rG&SKxu7qLMiL{2P_1%piG@hIUW3ma{%KuXnq2Poimh z^v{bVs=mXkeq4(_ZSuaUqJ|;6oR(BhhYA9g5`h0lxl9ffcd@iNq{vWl4dH3!RkIedpgMN$+A3@Z}SQd!afe zito3AmW+gmF8&7h-xOb;VrmS&T?^{XwXY!+7JDogq_kfJ;i8g;xLmODmRe;5Y7)ZTRCLsdHB;30IGqVtU#kA7q0+Yv`VRIf zI_dO=z4@firzl?Hg&DGB&|g$e*4U0^*9A(pZyL-#BcvNo42s9cYeBUNpHigT?^C_t z&8Hi|r>Hmo9O=O~i_7(azH7V{`bys@1*O$#PMxJYuyk6|XFNV+PwEDjiuGwDjZa|2 zJAFwee_}Qo4YzufOjN%r>r*ex;w!t9?MS(7w(@Zm;`D83KPPx$qOS z#Wly2dZIA9lS+DY+9y{YMh%Q3@{do<2Dcqil0>znPs!_w_*8Z9Wo6O;Pq|VJdEe-6 zXi%YRbT8<+f_fmdk+b%gZEEi)<=eg6GJN@TSo~dOx-!FZ^Byxr{uVZ`aGu034g15`bMN^2Y+Mvb@1Hes{HjreK+B#CNCpORVX^v5<>FKcPN?MN^r0#?Z z1r}|1mS*nq&fBD_(`o~$-HTuC0RQx;ckw1w7*V`C2wJftQLVaFugAx>(4cuidGlVg zL8qX~K~(3!Yoh8nq~eL{4)v*S)z_Ub|D0U3*KBm%O?eSZ4d2g|)%hm-5@=p7PJX@D ztbOH5Xj5Nlm0KLfUZ0w)(%pC#`2>$BTG~TY1YnD8T%QtNZ$3S zx!mx}`2FT}#uKvRe)GAuPpI5Pz4?B1Ow^mdNF5WkpRX?X#(HptEX+=*DU%MEiPAb~ zUeyCGjK%%EnGtedCVS-e;;o%{0-@{|Dmqg979xSeI5CGXu;D)&@g571CLuSpYX$)J-0f)@Sa{eK+a-D6xU96ifM*7n_Q{@6=No~tT zv}4|$g#$`d3!`96C3Ln9@&HuV?#N;*%ZY94-AN{VZq~VS2d+%DOvEsTXO`G3yMJ!h z9XrQ^7H*47#_|-adC#PTCE7~cI!)9_-8y3k%hs{(s*?rYuicOztcqTNxjFrTl-tGPIme-x>-dX+V zAl>ItN{i$3B5~;jMHH7=P(X%Gm7K8NL&xdfP_Mc1mC3f6Q82J2ao^)*8M~CPI5s+v z`gF2NF0E{7t9Qyv=ge!|5qrr{Y)`3^yaOUIeQu;@YU;kt)4*b@+`n9v(VZ1~Q&m0P z7gWXm5TAEEuFH?*`e<)TxU_kFuJ2!2w_Q#-j6J&}a_?cYS=<>kY8tnHU~ zoim$d?)PQxCj)5aA$ptIwwr|2-WNXLs#fC#Fc;4#E*Rk?mQdJBEyj73RE)V#v8;c@ ztYZw3^N*PI2J9$#2raW$*O1ri@pAHXk72GfU~9<$lH{dzsU(|+NOM#^f5fa`We6{z z3%4A>mU{xsT?2{>2E*Jnpcs}hx#TOed)YJWap=VOSB%+n=`*ZpxwxmlhNbT&+4O6( zf6Y>X{^bPZ<6oNtAhG{zvr989zY`X3@fhoN5-8udlx=<)Es3v9y=rNy~bNYH)b$uO@$Bphz%H$(eVR{WzJ4BxszHl(N9QhsLk)v1$r!p+rD%O%xN>OuYO z3Uy=2P_da*SuKeUmzHp)Y<|v6>ZX<-C39K19y=cShW3Nh8d#}AtDx?8OdCpu<8XtX zub}6PcAGUvUZD6!h))e|#CTn<*+oCpp_WGzGIsp^N~QcFh^lC>TGS#jzWl;fwmD(e z>R|6)wW2b!>*QpA0+2F?Jn1 zJN!sik(E;xfAq3D_$iQiZQkfXaKrW}JH@@~H*H-xeMw z_2tbTxGbnzs>`%h=iTEpohLziHMw6M6UDc$NC8`QxHt4t8de>5OyTMV$8CpfJ1E=V zHky{A|E|$$t@^hs)>1pqjit>lSMny({qI}cRkc{AM`7rp_W4vR@vSb(%Io0@XMQR7 zSb3{fE4vrV3_ZnvW$0N)O4-oE*F>qIXTdSt$K?z?n7FBHh7CP{L6ic!PdP&m>9beJ zLDJ2Jo(d<&zM$B;V;h}Tl02^vX^s*Ru)vV%hZ5|Ct^8ph%+D2V8?^kjO+8#t1yc{l zRWS8b=s~vhV5EelM=hP%(o><@Wm1(O7Purgo-iB9z5C7N9!sePM=G2LeOJ6r&F%Kx~88hU$agpVdF_c zO=4_3xw=}DNfoL^oNPR~;Mh2$*!+p06+02ts$0#r@r+lUSu@RKo6mTam8i~&{WEn; z^~C<0I;KwbOS0oBvnzI~?>l97!=Cln-_5$|z0>h1$VdtI$Ad2uTb+Fv zrx$#vq6$X$C647>dWJ32JELl;yi2BhZ`Q4q$wH(1q*py`A9t05zc;&}!1O;RqyrU`ry-A#Gv*8-W;wmR+{BHS z(;GaU+z#el~0O{yS}IN?tzWpSA5uDK#Tx$mCzl{f^29)Uv)1%lbR(dT{g}UB z(2s#8jLx7KOi1hhU_n2O^8FVJ`Ye(eiyN2*C$*sO{Z|Y6{v<|2r80?NupC6S;GdWGUAs~If4#gXF$}Gs7^T&5nw%wWM}UB_eq$UxPQXb zm05O*Vorc=4a&g8?F&|NOV@NQ?Ew6BJ8C!z=XAoS;}L0vZK zuy$gX09OMZ#M-z|x-(KjT<0F>gVH24=2tgO6ji$(u&0e0+0#Zme9_v1e!W<%hpt${ z`Ug^~UMQ<>XO*n0`xka~I-R9Wrm{XUiq-th$S)!Ky<28du$6AEs2@ zQC4zun#JHwz^{=cG?dww%s$;{7E4|@dKODZ_AC}}(9#Hms6H8LuGbAY?YSOe2fO6A zm&}f}^~7{iOrmltyw>O{M_x9&)z*{6$uTlLXP%QEz}>jHGAC*Y+Esh#_q;QPcfdLCufB)Q zeR?A0(sj|>KJ?>H)-Wu*Tq)avrG2)X2T5!Qrs>~)&5U>l9KnuH7_S4w_<2W)X%@|2 z?85J!URPBvHmoj%^D9{`4EN=xZ=?xvx#>zpS1TG+bd93x6kV_A21Vahbd#c+6%8r6 zMbWK_Zc}uJqPrCRNYPIe4J*2jsJrQY1r92DNYTTJ9#QlwMI(wHRrHvm#}zGB^rWJv z75zccsG>hAdQQ<_6uqG6MMZyC)O|@YkxqT!P}EYivZ7TKt)^(aqBRsvRP-uElN7C` zXtJVp6|Jvm14W&RHd3^SqSq?g+^tv(MO!M`T2YsxZ53^=Xh%gmE811jZi?QdXquuu z6wOeym!f?X?WbseMF%RHrRb1!yy|P$?@=^Y(W#0~S9GSLvlM+m(FfCEtGnFvVFf&jKC0+riaxGrfueI2eL~Usiux6O zO3_7%KCS2yMW0o4siMy-8c_5lMVBl3Dk!f16$-qe=t@ObD;iXEjiT!mU9ac{Mc-9) zlcJjy4Jo=s(XEPZQ*?)-yA=IM(N7c&6CKucp91?8J*em*MGq@_MA5GljVO9l(PN4p zSF{+k|GaCwT`@Ztdb#QST?_wJ*}AuqyK!?NrnV45OukN#3$XZxz(WAE!26lNa{xtl z${UEe6JT0vA&h3%3-PkSc@kh%#1c%n$-3A8Dg>crfga^Hl11_*TS_~crZ(i3DLHu5; zA3WMlh$G+vlmA)ukPf~9Ja@bhhrm4(glJOV5)nK#3c#aJ3b6t__i1$0sB0jwOo%1m zX|D*;tpO_Z8U(?`n?mddkE}*T8d@UjBb*}e-2FnV1P>X8=$`_GafWyTJTcx79}#YC zi1v+;FVzqp@F>2$5CTukHbi`5@H-4K3S3Mu++sNna{pn7D0pzTA-Xl88XBSiJiNpZ z`@uc07-CpcRPZfB90QN6GenbXp`g$ZwMADv3O z9_i=MV(=V%25n3$R1{x`TLCVxNZAjLA2$?9tx<4mhsXg>>+TRMiI2j0bwPftLwLZQ z?kNt@ITaBPJH#Sz&s+z(4GIDd5#JUHUv`N0;GxwhfcO!INNW#8#~k7b@Z8f5aR@wk z(IKo3(Bm{k26%3&DJFvl@pFSq!0E?hwt}ZUU<#`v8ZaAj;H{mHo5GKSkk=HOz#|Jx zag6YrrkL0XHGBsd!NUobusX|`H(EX1(b2-ly#?3At-?sVRfqt11Ux!Mh^(;2_wfVL}VV~76~J|2zizWBe)b7^fFs55l3gjsgajq@G z2z`irJE40wp5kLszGYpAU9B>bCh}=YnaN$!Pu9^HN|rz&K7Aj3 z4#%%L94@TdbH9M1FA#UsVMM-#!V?a|`6J@-6_&JQQ>4{3jYxB|QqB#g8Mx6joFmLi zfr+LWx!W`nb4}s8&oqMgot*%F;x{zIG;Z+YN0VHSn8KN78d-D9O8#d}GrZI^TrVSj zxoP-ULg^~gh<<9CF3U2~;&A=MSw@O*$ZvXE&1zw6TaKX{BVFL-GOp4VX2ms43XQZ> zYM)V>=K`0ex(jOR*zgK`!vZ=y_$mZ(*L=;hI6jfFGs<$fxk=86Z#WaDo0YhKH|NJq zPnd3A;xq~or<<5~_)CS|>Sj{{80U!RG-JV3&1ux2cp6oR`(Xzr9;l&tVoS|~F3m-% z<{suD4A3O+xkGd3MtnGv^kIB9FcT4ColbD!uBQZ?NyQ^qY3`rEHJ+?_2q%Q((tg%B zrzWT4^KTTNSc~O2e}H+2<8QC6dwe2sDnI8HtuUvb=7E1|K9vO@WbVw@@gA=(;Bk)k zGY{bRC8+|g1>92RVdeqmQH&s}0eDj3_QNp438BSY^F`c}CpCYT3s}y4HS-P3w=n;R z`9bCp<|mn-V}6Nwm1N7UYI0Sw?h-*CHARKQd|ksRS1cINm>#~AUZ3T!W$t3$m3ap9 zfy_rSzk|8RjQcMkYdj%&9jnqL6bSdOy*g2bOnQTHK(UPzWHw%ZFjjQ}RB}?_Qw~=t)5dPTciMfUgO91Q8B5(%jXH@lRS2J(?&z+Ea5s-=2x} zHO^V8qy>@ABiJQW2M5} zrGEUp17Ugw6JNyno@c&-`5MhTz`s~`p`STTE0ki)gNW0-i1;SXxDDJMzOHaTWe;DR zx|H!@#>bfd!2AMp2c~|cHJ*7b=C5-8AoF*bZ)N@o^Fx}u#Zitp&HNYUqLwb88uKLP z4VX7)-j;bc=DnC_F~5cRc;@#opQSj4k4HJ;3Fc2T4={g&`8wvCneSk}kNFYi$C*c& zUu16aO1h2 z;5Z%Y8n1c5NG*MVxzm;#DG&Fyvdw<_DoN@V=7cQHNE3HbpLVzAp2?c$-mAH5y5|0w zLS1J`Dd7ioj9pjH;}vmO7WJ``?Gl@<&5HY@^7<^Rq)YYBMqoa8r2x6A@SN9jVls8L ztmU(&I|A1fKH;;P8u6h9!nFJii8Ph(KVeOAc$&$U^Q==1!!BeDVmabyn>kY~tC|Y> zQdLug+mXUfvg3R!vsSPZK&UfiAB7`KCIN4iPtLclt%aGRY2mR4G7iz6@g#7U{CK|A zyygd^+E2^AXIiE>FskFU?6Fht!r?cv+5+p<%AS9rdmJ*gW2GkY@B(Y3!?Rnq^INkW z(dT5)Z(Zl`ER|pQt?t(bFqm0ZP*ED#EGzH=(XgUXMME#kv?r|>YeZkBl+e2>N0B`9 zB>t?H!(v( zTOAyM)3VXi)+|Txd%5&!t7DDOqgY;u;9R01pNu?>wg%@BiY`=fi)9OGwXPCgqT*J_ z9BDPE5z52b!ip{c75*ji327x)@w`VU^od+4t%ob07-diAWn(bb9;%HN)`rX~3|tMsizJ-bxO9{K3A zNbwv{=%7mff@tuptoodldqe1Fh0YTV{|0LLmsSQ1f(pmrDPmC*oTHoX7SA?8rWcST z0s*3-7Yo-tXSFfnqA!!=NSV6KN|)C!v$CAww@JXWTZw(8vK&*iglM=#KDW$DiT`vM z+NEMVr{oS~t{XZ<>7LU>LyCI7SI6JW#?M>b9G)NK*ypXT4c1~@3Z9{q;8~*4ABlQ? zBI^H1ZhYRlwQb-Wp}<9=k;|Y~Fh7o@<`WGn8d5Z@s7K0PFIYFZ{W1=%8Fz2)gkF>G z8K0ST^Ek1%W%iwuXH1*e^Nvih5k-5JLxmL}Dk3XMyj1l4mIKF5nUFb2{L&7W>nf56 zy+_hvq9Uq}gPSNOv`fW&u8W&8W$ZoU)2H4gZ~fV-E^7p=<~4#RNFZ2DG_nN0-DIV> zUmGDDJ;gVzGQ@AK^x$@;72W+mW33-}u?oq9>J)ElN?Cx_epsbMR7y|rLhB6ieruAU z#=Q+G;)Rg&yreXMY7M)UhP_CMsFVOc%l2Ks`Uk#QI`~EF76(SCRWDlgs{~#_J}dN! z-20-{rE7$c2)#;L#!s3u4V74uI&son6VWYiq@pWcqx2|IEAj?W|4O2vRWjoxt4Z_d zYDy2jW!EB_O6~Zaj1!1Mx2~b|$VTaZ$r@b6^RCMKo-BC@_kHjSLXj^?B6LZ%df6J( z-v4G*LP1a~u%3>?AJVaZHysCwTH(*DqP8<9jGKP%)V^XU@AGpntJ((@0ir~G9lo-g5l$%d<}Syx4ml3;Ys6_n|TD=>b_ z+}f3L>?W6O*Fa}xhnM(zhm z8qzjf{4qp!Sz|SIyfjSatg)PxzaG{xTbz=Qudy1%J%^iloY*AaT4SZuS^$8HFMH>ZOQq-Kw}ck1*Bv$C@@1`W&3o;fRf{Dg7$ zj-S977Ub-)lV@a#?=jfDjd_YF@xMQYC5qm(B%=87FD$1XOasj8dTJC9(m}`f2G{@j@8=X zzpe1%J60WsJCfjX1r4Xumzd+q&5am2xnV1KlfO~abU9sVE*C70 z>hFn{unZB_k%aVV%WoCdCe0;7zL z!5TZ?*6Fnw=Y%wF$2jnz#y2xg+^X>%j3YaM$sRbJBhq$ifw?x`r}2w+2F9BiN6|mj zLkAc;*>dtd<3u*?Rv)4(9AG@1aU!}=*#i%8geyfWyvR70@wlN{L2e_R?q)0+YrKqc z7Tb(B+3DDMq6&TvOm|tRzP1saR~WY8VGeB%tUXK%AVOv6z*r2|c&5TIvoT)A={Eis z<6KTZ!tzlz;TmuUqie>-4N5WF13Re*PpQBN#sWJ`)PmWJos6Gi?0G<^zsESh_zYwE zH8#rMbp$t%@hyynd$tx>%@Iz<)$n!=)i{muGcmaKsEX+?DeNhgzkak%&*l8@#^BD_ zfg=5GTi`<#;So0Ok1Z(@2tBAPc(=khhm7Yk77yw45Mw9fUu=2&Kp*u$XPAyiUk)3y z?^W32E{#~FBh)4yWjMnbT=TVpYi}b37^)eMXB=Ii)8{cx^lQACv5*@7$k@ra_3fn3 z4TWs^ykA9lL>A+p80RvclC3Kcc#aEX9AbQmafI>A94#-FYI$QUHvpy+YT$6fZnP+i zBM!4bF5_%GG^oXafX?t9W7^&%1r70xpmf^iB;1j)XSv4XfN9|JGj=mh{cTi zN33B5w4qK4zh_MQq=cK}AwvZwI<-Zw7h@OW0OKsi%_eC1T*j*zM|s2J%mj@8s)g8K zr2}>8)5a~yf5$kBjoE|l!uYGYkhfai zxl3c(*rf~&Cvt_b!Am$Fn0hSd4ULyF4lsU)afIgFU?#&#L^SKt-4@?z^)X?_U z)0{4_g-sPQ@75J?F|NlrmvLLh0ml6ZTSEC_Q2sHD$tMHYE$-n6a?T)uM;Mcn2H{1F z$ytN&YmCWhgYdhI$$5kD$BfB|gK&f~Idc&Hi7`2KsQtjo|Ijrg?+y~E!x6I~WAZ*BEE$s*3gI^ylQ#b?Y z-6C>ZA>5cTxvvoJ#F*Sz2;a<@+*t@`GcIoC))CVUoa+r8^UK8liv+t^IqKm z^1mTmn=$#}5Wb!<`Qs4ouCZG==1{~?79a;5!gnzyM;*em8I!{f;RTGzafk5BjLCtA za3N!I<1>txFur<*E-=8j1LF;h zN6*0drwW8P;sF*o#CRFw2;&WmFEBp9SiGxS_!Hw~##hhe9%9^raT?=6ZadxY=Z@64730vq^x83lv5PS#!Ad@@NT<7JafI_V9kGCM zaF$jWursim&Kkz#-bfeOcE(wp|0rV*yYrm0aZ9bQ7cx-;Lb?HNF`6UNT5ExO8T;SX z1w6ty%6K8;T+{@I;x)$PKS{VQx`+z!RMqMCFb=fP>5nmvzDnsh|I6$MI9if|b&Ny1 zv;x{OB!$tP8e=l7aB!Q()lH4V59$097>8hlB7N}n((>@nB>V#7NFQL7uU=H30$c;N z06nV-2ij?jhnB)=H))*4*xys*(Tt;=HJ-{ixIp84#!i^er~=Q~@^9e&r-;>dhV{Bd zyBL$JDy6rsq$@x!tb{WelS?Y$+Zjji(s;d{euu_;7{iND$)9BGpMv(2f?kz%0iL_H zz<9>w+DhquWEh2aJt*}_p1cO2?o}7^L2%; zRv5PtXK2CL1us#mP&byh{R8`RdSJOOU@T*Dexl0&&j?D<1R_m`X@6cZ)D290N72pQ4mhF6!97h z1Q>t7IKucdTLEL*yHfdE>HKxj7{cVJP5Lq!i)%EVZKrqFczq3wze)i-z$wEX7RY5> z%s5hCryB{n0P+|o`MQi<`2B9e9T^M8Ll_4bPiCCM`0)gsf9gWp$#k(2fXM{~lfqXS z+fJwNF}9sg_c6AeP)iuw&ZzYHDbjB{rCy;hdc2<2-`vd+p;kJgC*x>Kjc;e1R$t@$ z8H=_W?_nI|4T-NA(`ygZfHRE!T;OHK^cn=EyA!U|T^e1d*Z=#f(Go z`Xc&}v5V7xWE^3y*{iP7`aMUqzI4W}!wS2_eH;;C1ursAd|zkS%Q*D8#s*rZu9@F7 zPGy`}sPQ<$IDMYqbOm3u)7R_tcNj;NJkI~;91+BGm%8K!#v$$zBS{xXPW_ag#5l?( znx>4&*`LxoGWNWzyLdQb*J_QY+v(&vP0#-)IYRKz`8MMKUeq9kdl@@9{Vd}!r(ao9 zSCC%dAo+F*drCc^hjDr?r%z=Z!pNwe|4-TxT;sKjbGXI_7)Ln$JmUbT*Quo|ki%p9 z4UE%xq`Z}J2tP_p6?~8}-Yn72{}(vI!!-=q3fAikN9}aRmGEgix&}gwuVYNFtWW_% z7}F~*gl7}RHIc(3?E=OH7kT~vGDqaH0DXIp3ZQpoNWmV3J;HV-KhEibTX>oC2RMH% z%*)k9$`xpDW4voa`UVq5g|gh7VG;|tSmC3L1-Ec1d;=sI3QZx&Yg)zn_igYyEQ>M_K=Fr+WT- zL@=NQDyL`#w%>nu#<ivFxBdRdF}D5x7c%zndjQ)Q+wTK-o9g`JK1&T~<-V3H;L|k{ z&A0+9G>&VovHiZl+l=k^1|GSN^S`3yd$-Uy?9}+Qjrn~71M>=zB5Y^|~V!oh?#8rv@(v~g){zkqO_vHc=KAeGbkg@om8HRcx++~V$bI>LTK zVSIay?H3g;Gqzt?*wR6#+b=H6?x?Z-0>jmvG`3${n8((tjZTl$|6)9j>q8Cn<^@NCQ zi(~NHG5DJp{BsPh+N(l&Zc(>lgculuA5+-l5d8OSO!}KK_&^Lk9fRxjE?)s$38@t# zgt#XLzo~Fp1=hyk_hRtA82ot*j+Dn3X2mZmqHLtF`joFBb{jM{>>g+-`+jXTbdQJ; zyDJ7i6oa3N!LP;ObuoCC#-+s`tcYb?#JW;;j#!CCWjQ*63f1eY>Rp=Q+8Ep_2DgjB zU1D%r4DJqCkVJN}~gfR#?2v~&EpOPg$4tP8Q*4AQ{9Q>ViwL2e&|L-oj|MnGE z?f+kL|Erf=&A+_l3STU-rd{p&@4j?VSosfY_3&Y-Bl>3#7~X$q_Ta&TCrz3(Ws1no zzNJ52mgt|IIciwuzzn4HMZAt~Ptt=jGWw1fn%%c=-${4ht>Z~cS)^Pwq|*JZ|D*@< XlUTk(nfkuH2WCT2Vbh_N=EVOWgbgWj delta 56973 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 // ALWAYS at VX_e_m_reg.v:117 vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__curr_PC = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__curr_PC; - // ALWAYS at VX_e_m_reg.v:117 - vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__branch_offset - = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__itype_immed; // ALWAYS at VX_d_e_reg.v:130 vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed = (0xfffffU & ((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling) @@ -199,6 +198,9 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0xcU) : 0U)))); + // ALWAYS at VX_e_m_reg.v:117 + vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__branch_offset + = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__itype_immed; // ALWAYS at VX_d_e_reg.v:130 vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rs2_src = (1U & ((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling) @@ -353,19 +355,15 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__is_csr = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__is_csr; // ALWAYS at VX_e_m_reg.v:117 vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__csr_result - = ((8U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? ((4U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? ((2U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? ((1U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? (vlTOPp->Vortex__DOT__csr_decode_csr_data - & ((IData)(0xffffffffU) - - vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask)) - : (vlTOPp->Vortex__DOT__csr_decode_csr_data - | vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask)) - : ((1U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask - : 0xdeadbeefU)) : 0xdeadbeefU) - : 0xdeadbeefU); + = ((0xdU == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask + : ((0xeU == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (vlTOPp->Vortex__DOT__csr_decode_csr_data + | vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask) + : ((0xfU == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (vlTOPp->Vortex__DOT__csr_decode_csr_data + & ((IData)(0xffffffffU) - vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__csr_mask)) + : 0xdeadbeefU))); // ALWAYS at VX_m_w_reg.v:60 vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd; vlTOPp->out_cache_driver_in_data = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd2; @@ -453,87 +451,11 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) // ALWAYS at VX_d_e_reg.v:130 vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op = ((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling) - ? 0xfU : ((0x63U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - ? ((5U > (IData)(vlTOPp->Vortex__DOT__decode_branch_type)) - ? 1U : 0xaU) : ((0x37U == - (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - ? 0xbU : - ((0x17U == - (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - ? 0xcU : - ((IData)(vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr) - ? ((1U - == - (3U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU))) - ? 0xdU - : ( - (2U - == - (3U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU))) - ? 0xeU - : 0xfU)) - : (((0x23U - == - (0x7fU - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - | (3U - == - (0x7fU - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))) - ? 0U - : ( - (0x4000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? - ((0x2000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? - ((0x1000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? 9U - : 8U) - : - ((0x1000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? - ((0U - == - (0x7fU - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x19U))) - ? 6U - : 7U) - : 5U)) - : - ((0x2000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? - ((0x1000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? 4U - : 3U) - : - ((0x1000U - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) - ? 2U - : - ((0x13U - == - (0x7fU - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - ? 0U - : - ((0U - == - (0x7fU - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x19U))) - ? 0U - : 1U))))))))))); + ? 0xfU : (((vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x19U) & (0x33U == (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))) + ? (IData)(vlTOPp->Vortex__DOT__vx_decode__DOT__mul_alu) + : (IData)(vlTOPp->Vortex__DOT__vx_decode__DOT__temp_final_alu))); // ALWAYS at VX_e_m_reg.v:117 vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd; // ALWAYS at VX_m_w_reg.v:60 @@ -550,6 +472,9 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__PC_next = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__PC_next; // ALWAYS at VX_m_w_reg.v:60 vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb; + vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result + = VL_MULS_QQQ(64,64,64, VL_EXTENDS_QI(64,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1), + VL_EXTENDS_QI(64,32, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)); // ALWAYS at VX_d_e_reg.v:130 vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__valid = ( (~ (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling)) @@ -568,101 +493,171 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__PC_next = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__PC_next_out; // ALWAYS at VX_e_m_reg.v:117 vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb; - // ALWAYS at VX_execute.v:71 - vlTOPp->Vortex__DOT__execute_alu_result = ((8U + // ALWAYS at VX_execute.v:91 + vlTOPp->Vortex__DOT__execute_alu_result = ((0x10U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? ( - (4U + (8U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? 0U + : + ((4U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + : + VL_MODDIV_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + : + VL_MODDIVS_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0xffffffffU + : + VL_DIV_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0xffffffffU + : + VL_DIVS_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) + : + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (IData)( + (((QData)((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1)) + * (QData)((IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + >> 0x20U)) + : (IData)( + (((((QData)((IData)( + VL_NEGATE_I((IData)( + (1U + & (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >> 0x1fU)))))) + << 0x20U) + | (QData)((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1))) + * (QData)((IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + >> 0x20U))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (IData)( + (vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result + >> 0x20U)) + : (IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result))))) + : ( + (8U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - ((2U + ((4U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? vlTOPp->Vortex__DOT__csr_decode_csr_data - : - ((1U + ? + ((2U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? vlTOPp->Vortex__DOT__csr_decode_csr_data : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__curr_PC - + + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? vlTOPp->Vortex__DOT__csr_decode_csr_data + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__curr_PC + + + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed + << 0xcU)))) + : + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed - << 0xcU)))) + << 0xcU) + : + ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >= vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0U + : 0xffffffffU)) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2 + & vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + | vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) : - ((2U + ((4U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - ((1U + ((2U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed - << 0xcU) + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >> + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) : - ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - >= vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 0U - : 0xffffffffU)) + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + ^ vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + : + ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + < vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 1U + : 0U))) : - ((1U + ((2U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - (vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2 - & vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1) + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (VL_LTS_III(1,32,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 1U + : 0U) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + << + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - | vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) - : ( - (4U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - >> - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - ^ vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - : - ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - < vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 1U - : 0U))) - : - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (VL_LTS_III(1,32,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 1U - : 0U) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - << - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - - vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - + vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))))); + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + - vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + + vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))))); vlTOPp->out_cache_driver_in_address = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__alu_result; // ALWAYS at VX_memory.v:66 vlTOPp->Vortex__DOT__memory_branch_dir = (1U & @@ -839,16 +834,6 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { vlTOPp->Vortex__DOT__vx_decode__DOT__is_itype = ((0x13U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) | (3U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))); - vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr = ( - (0x73U - == - (0x7fU - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - & (0U - != - (7U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU)))); vlTOPp->Vortex__DOT__decode_csr_address = (0xfffU & (((0U != @@ -864,7 +849,33 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U) : 0x55U)); - // ALWAYS at VX_decode.v:259 + // ALWAYS at VX_decode.v:310 + vlTOPp->__Vtableidx1 = (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)); + vlTOPp->Vortex__DOT__vx_decode__DOT__mul_alu = + vlTOPp->__Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu + [vlTOPp->__Vtableidx1]; + vlTOPp->Vortex__DOT__vx_decode__DOT__alu_tempp + = (0xfffU & (((1U == (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) | (5U + == + (7U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)))) + ? (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x14U)) : (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x14U))); + vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr = ( + (0x73U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + & (0U + != + (7U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)))); + // ALWAYS at VX_decode.v:260 vlTOPp->Vortex__DOT__decode_branch_type = ((0x63U == (0x7fU @@ -895,16 +906,6 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { ? 2U : 1U))) : 0U); - vlTOPp->Vortex__DOT__vx_decode__DOT__alu_tempp - = (0xfffU & (((1U == (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU))) | (5U - == - (7U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU)))) - ? (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x14U)) : (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x14U))); vlTOPp->Vortex__DOT__csr_decode_csr_data = ((0xc00U == (IData)(vlTOPp->Vortex__DOT__vx_csr_handler__DOT__decode_csr_address)) ? (IData)(vlTOPp->Vortex__DOT__vx_csr_handler__DOT__cycle) @@ -1010,7 +1011,7 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd)) & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0xfU)))) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))); - // ALWAYS at VX_decode.v:248 + // ALWAYS at VX_decode.v:249 vlTOPp->Vortex__DOT__decode_itype_immed = ((0x40U & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) ? ( @@ -1145,6 +1146,87 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { >> 0x14U))) : 0xdeadbeefU) : 0xdeadbeefU)))))); + vlTOPp->Vortex__DOT__vx_decode__DOT__temp_final_alu + = ((0x63U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? ((5U > (IData)(vlTOPp->Vortex__DOT__decode_branch_type)) + ? 1U : 0xaU) : ((0x37U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0xbU : ((0x17U == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0xcU : + ((IData)(vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr) + ? ((1U + == + (3U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) + ? 0xdU + : + ((2U + == + (3U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) + ? 0xeU + : 0xfU)) + : (((0x23U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + | (3U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))) + ? 0U + : + ((0x4000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x2000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 9U + : 8U) + : + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0U + == + (0x7fU + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x19U))) + ? 6U + : 7U) + : 5U)) + : + ((0x2000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 4U + : 3U) + : + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 2U + : + ((0x13U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0U + : + ((0U + == + (0x7fU + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x19U))) + ? 0U + : 1U)))))))))); // ALWAYS at VX_fetch.v:95 vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC = ( ((IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__jal) @@ -1155,101 +1237,9 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { & (~ (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__delay_reg))) ? vlTOPp->Vortex__DOT__memory_branch_dest : vlTOPp->Vortex__DOT__vx_fetch__DOT__PC_to_use)); - // ALWAYS at VX_execute.v:71 - vlTOPp->Vortex__DOT__execute_alu_result = ((8U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? ( - (4U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? vlTOPp->Vortex__DOT__csr_decode_csr_data - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? vlTOPp->Vortex__DOT__csr_decode_csr_data - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__curr_PC - + - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed - << 0xcU)))) - : - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed - << 0xcU) - : - ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - >= vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 0U - : 0xffffffffU)) - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2 - & vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - | vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) - : ( - (4U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - >> - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - ^ vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - : - ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - < vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 1U - : 0U))) - : - ((2U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (VL_LTS_III(1,32,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - ? 1U - : 0U) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - << - (0x1fU - & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) - : - ((1U - & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) - ? - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - - vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) - : - (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 - + vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))))); + vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result + = VL_MULS_QQQ(64,64,64, VL_EXTENDS_QI(64,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1), + VL_EXTENDS_QI(64,32, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd = (((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U)) == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd)) @@ -1264,6 +1254,171 @@ void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { >> 0xfU)))) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd))); vlTOPp->curr_PC = vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC; + // ALWAYS at VX_execute.v:91 + vlTOPp->Vortex__DOT__execute_alu_result = ((0x10U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? ( + (8U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? 0U + : + ((4U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + : + VL_MODDIV_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + : + VL_MODDIVS_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0xffffffffU + : + VL_DIV_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + ((0U + == vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0xffffffffU + : + VL_DIVS_III(32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) + : + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (IData)( + (((QData)((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1)) + * (QData)((IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + >> 0x20U)) + : (IData)( + (((((QData)((IData)( + VL_NEGATE_I((IData)( + (1U + & (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >> 0x1fU)))))) + << 0x20U) + | (QData)((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1))) + * (QData)((IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + >> 0x20U))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? (IData)( + (vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result + >> 0x20U)) + : (IData)(vlTOPp->Vortex__DOT__vx_execute__DOT__mult_signed_result))))) + : ( + (8U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((4U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? vlTOPp->Vortex__DOT__csr_decode_csr_data + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? vlTOPp->Vortex__DOT__csr_decode_csr_data + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__curr_PC + + + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed + << 0xcU)))) + : + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__upper_immed + << 0xcU) + : + ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >= vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 0U + : 0xffffffffU)) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2 + & vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + | vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))) + : + ((4U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + >> + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + ^ vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + : + ((vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + < vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 1U + : 0U))) + : + ((2U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (VL_LTS_III(1,32,32, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + ? 1U + : 0U) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + << + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2))) + : + ((1U + & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) + ? + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + - vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2) + : + (vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1 + + vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)))))); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_wb_fwd = ((((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U)) == (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)) @@ -1389,16 +1544,6 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) vlTOPp->Vortex__DOT__vx_decode__DOT__is_itype = ((0x13U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) | (3U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))); - vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr = ( - (0x73U - == - (0x7fU - & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) - & (0U - != - (7U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU)))); vlTOPp->Vortex__DOT__decode_csr_address = (0xfffU & (((0U != @@ -1414,7 +1559,33 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U) : 0x55U)); - // ALWAYS at VX_decode.v:259 + // ALWAYS at VX_decode.v:310 + vlTOPp->__Vtableidx1 = (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)); + vlTOPp->Vortex__DOT__vx_decode__DOT__mul_alu = + vlTOPp->__Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu + [vlTOPp->__Vtableidx1]; + vlTOPp->Vortex__DOT__vx_decode__DOT__alu_tempp + = (0xfffU & (((1U == (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) | (5U + == + (7U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)))) + ? (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x14U)) : (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x14U))); + vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr = ( + (0x73U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + & (0U + != + (7U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU)))); + // ALWAYS at VX_decode.v:260 vlTOPp->Vortex__DOT__decode_branch_type = ((0x63U == (0x7fU @@ -1445,16 +1616,6 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) ? 2U : 1U))) : 0U); - vlTOPp->Vortex__DOT__vx_decode__DOT__alu_tempp - = (0xfffU & (((1U == (7U & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU))) | (5U - == - (7U - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xcU)))) - ? (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x14U)) : (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x14U))); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd = ((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U)) == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd)) @@ -1465,7 +1626,7 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd)) & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0xfU)))) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))); - // ALWAYS at VX_decode.v:248 + // ALWAYS at VX_decode.v:249 vlTOPp->Vortex__DOT__decode_itype_immed = ((0x40U & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) ? ( @@ -1600,6 +1761,87 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) >> 0x14U))) : 0xdeadbeefU) : 0xdeadbeefU)))))); + vlTOPp->Vortex__DOT__vx_decode__DOT__temp_final_alu + = ((0x63U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? ((5U > (IData)(vlTOPp->Vortex__DOT__decode_branch_type)) + ? 1U : 0xaU) : ((0x37U == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0xbU : ((0x17U == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0xcU : + ((IData)(vlTOPp->Vortex__DOT__vx_decode__DOT__is_csr) + ? ((1U + == + (3U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) + ? 0xdU + : + ((2U + == + (3U + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xcU))) + ? 0xeU + : 0xfU)) + : (((0x23U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + | (3U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction))) + ? 0U + : + ((0x4000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x2000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 9U + : 8U) + : + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0U + == + (0x7fU + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x19U))) + ? 6U + : 7U) + : 5U)) + : + ((0x2000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 4U + : 3U) + : + ((0x1000U + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) + ? 2U + : + ((0x13U + == + (0x7fU + & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) + ? 0U + : + ((0U + == + (0x7fU + & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x19U))) + ? 0U + : 1U)))))))))); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd = (((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U)) == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd)) @@ -1806,13 +2048,15 @@ void VVortex::_ctor_var_reset() { Vortex__DOT__vx_decode__DOT__is_itype = VL_RAND_RESET_I(1); Vortex__DOT__vx_decode__DOT__is_csr = VL_RAND_RESET_I(1); Vortex__DOT__vx_decode__DOT__alu_tempp = VL_RAND_RESET_I(12); + Vortex__DOT__vx_decode__DOT__mul_alu = VL_RAND_RESET_I(5); + Vortex__DOT__vx_decode__DOT__temp_final_alu = VL_RAND_RESET_I(5); { int __Vi0=0; for (; __Vi0<32; ++__Vi0) { Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers[__Vi0] = VL_RAND_RESET_I(32); }} Vortex__DOT__vx_d_e_reg__DOT__rd = VL_RAND_RESET_I(5); Vortex__DOT__vx_d_e_reg__DOT__rd1 = VL_RAND_RESET_I(32); Vortex__DOT__vx_d_e_reg__DOT__rd2 = VL_RAND_RESET_I(32); - Vortex__DOT__vx_d_e_reg__DOT__alu_op = VL_RAND_RESET_I(4); + Vortex__DOT__vx_d_e_reg__DOT__alu_op = VL_RAND_RESET_I(5); Vortex__DOT__vx_d_e_reg__DOT__wb = VL_RAND_RESET_I(2); Vortex__DOT__vx_d_e_reg__DOT__PC_next_out = VL_RAND_RESET_I(32); Vortex__DOT__vx_d_e_reg__DOT__rs2_src = VL_RAND_RESET_I(1); @@ -1830,6 +2074,7 @@ void VVortex::_ctor_var_reset() { Vortex__DOT__vx_d_e_reg__DOT__valid = VL_RAND_RESET_I(1); Vortex__DOT__vx_d_e_reg__DOT__stalling = VL_RAND_RESET_I(1); Vortex__DOT__vx_execute__DOT__ALU_in2 = VL_RAND_RESET_I(32); + Vortex__DOT__vx_execute__DOT__mult_signed_result = VL_RAND_RESET_Q(64); Vortex__DOT__vx_e_m_reg__DOT__alu_result = VL_RAND_RESET_I(32); Vortex__DOT__vx_e_m_reg__DOT__rd = VL_RAND_RESET_I(5); Vortex__DOT__vx_e_m_reg__DOT__rd2 = VL_RAND_RESET_I(32); @@ -1864,4 +2109,13 @@ void VVortex::_ctor_var_reset() { Vortex__DOT__vx_csr_handler__DOT__cycle = VL_RAND_RESET_Q(64); Vortex__DOT__vx_csr_handler__DOT__instret = VL_RAND_RESET_Q(64); Vortex__DOT__vx_csr_handler__DOT__decode_csr_address = VL_RAND_RESET_I(12); + __Vtableidx1 = VL_RAND_RESET_I(3); + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[0] = 0x10U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[1] = 0x11U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[2] = 0x12U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[3] = 0x13U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[4] = 0x14U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[5] = 0x15U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[6] = 0x16U; + __Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[7] = 0x17U; } diff --git a/rtl/obj_dir/Vvortex.h b/rtl/obj_dir/Vvortex.h index 4c184f36..8b30c02d 100644 --- a/rtl/obj_dir/Vvortex.h +++ b/rtl/obj_dir/Vvortex.h @@ -48,8 +48,10 @@ VL_MODULE(VVortex) { VL_SIG8(Vortex__DOT__vx_f_d_reg__DOT__valid,0,0); VL_SIG8(Vortex__DOT__vx_decode__DOT__is_itype,0,0); VL_SIG8(Vortex__DOT__vx_decode__DOT__is_csr,0,0); + VL_SIG8(Vortex__DOT__vx_decode__DOT__mul_alu,4,0); + VL_SIG8(Vortex__DOT__vx_decode__DOT__temp_final_alu,4,0); VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__rd,4,0); - VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__alu_op,3,0); + VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__alu_op,4,0); VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__wb,1,0); VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__rs2_src,0,0); VL_SIG8(Vortex__DOT__vx_d_e_reg__DOT__mem_read,2,0); @@ -98,10 +100,10 @@ VL_MODULE(VVortex) { VL_SIG(Vortex__DOT__vx_decode__DOT__rd2_register,31,0); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__rd1,31,0); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__rd2,31,0); - VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__PC_next_out,31,0); - VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__itype_immed,31,0); }; struct { + VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__PC_next_out,31,0); + VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__itype_immed,31,0); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__upper_immed,19,0); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__csr_mask,31,0); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__curr_PC,31,0); @@ -117,6 +119,7 @@ VL_MODULE(VVortex) { VL_SIG(Vortex__DOT__vx_m_w_reg__DOT__alu_result,31,0); VL_SIG(Vortex__DOT__vx_m_w_reg__DOT__mem_result,31,0); VL_SIG(Vortex__DOT__vx_m_w_reg__DOT__PC_next,31,0); + VL_SIG64(Vortex__DOT__vx_execute__DOT__mult_signed_result,63,0); VL_SIG64(Vortex__DOT__vx_csr_handler__DOT__cycle,63,0); VL_SIG64(Vortex__DOT__vx_csr_handler__DOT__instret,63,0); VL_SIG(Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers[32],31,0); @@ -126,8 +129,10 @@ VL_MODULE(VVortex) { // LOCAL VARIABLES // Internals; generally not touched by application code // Begin mtask footprint all: + VL_SIG8(__Vtableidx1,2,0); VL_SIG8(__Vclklast__TOP__clk,0,0); VL_SIG8(__Vclklast__TOP__reset,0,0); + static VL_ST_SIG8(__Vtable1_Vortex__DOT__vx_decode__DOT__mul_alu[8],4,0); // INTERNAL VARIABLES // Internals; generally not touched by application code diff --git a/rtl/obj_dir/Vvortex__ALL.a b/rtl/obj_dir/Vvortex__ALL.a index 8e91e947df5e4e309b1e7712d97ed8342bc569cc..a9070918714506cb016b667716e8d2a146e1d2ec 100644 GIT binary patch literal 36568 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 W&uyC_GlOr*NdBwcwtIY!j{0wTLX-Lc diff --git a/rtl/obj_dir/Vvortex__verFiles.dat b/rtl/obj_dir/Vvortex__verFiles.dat index 5190892b..6adb6004 100644 --- a/rtl/obj_dir/Vvortex__verFiles.dat +++ b/rtl/obj_dir/Vvortex__verFiles.dat @@ -2,11 +2,11 @@ C "-Wall -cc Vortex.v VX_fetch.v VX_f_d_reg.v VX_decode.v VX_register_file.v VX_d_e_reg.v VX_execute.v VX_e_m_reg.v VX_memory.v VX_m_w_reg.v VX_writeback.v VX_csr_handler.v VX_forwarding.v --exe test_bench.cpp" S 4608404 12889046060 1553037052 0 1548678579 0 "/usr/local/Cellar/verilator/4.010/bin/verilator_bin" S 1495 12889087229 1553211178 0 1553211178 0 "VX_csr_handler.v" -S 4626 12889079539 1553190875 0 1553190875 0 "VX_d_e_reg.v" -S 8725 12889063385 1553236943 0 1553236943 0 "VX_decode.v" -S 1351 12889079483 1553200040 0 1553200040 0 "VX_define.v" +S 4626 12889079539 1553237386 0 1553237386 0 "VX_d_e_reg.v" +S 9200 12889063385 1553237914 0 1553237914 0 "VX_decode.v" +S 1503 12889079483 1553237629 0 1553237629 0 "VX_define.v" S 3644 12889083963 1553196174 0 1553196174 0 "VX_e_m_reg.v" -S 4919 12889081819 1553236958 0 1553236958 0 "VX_execute.v" +S 4844 12889081819 1553241258 0 1553241258 0 "VX_execute.v" S 1120 12889050060 1553236935 0 1553236935 0 "VX_f_d_reg.v" S 3537 12889047675 1553236929 0 1553236929 0 "VX_fetch.v" S 5020 12889086478 1553236985 0 1553236985 0 "VX_forwarding.v" @@ -14,12 +14,12 @@ S 1578 12889085814 1553211072 0 1553211072 0 "VX_m_w_ S 2606 12889084513 1553234474 0 1553234474 0 "VX_memory.v" S 958 12889070228 1553234503 0 1553234503 0 "VX_register_file.v" S 806 12889086287 1553236964 0 1553236964 0 "VX_writeback.v" -S 12863 12889050092 1553211358 0 1553211358 0 "Vortex.v" -T 78272 12889102709 1553237041 0 1553237041 0 "obj_dir/VVortex.cpp" -T 7758 12889102708 1553237041 0 1553237041 0 "obj_dir/VVortex.h" -T 1800 12889102711 1553237041 0 1553237041 0 "obj_dir/VVortex.mk" -T 530 12889102707 1553237041 0 1553237041 0 "obj_dir/VVortex__Syms.cpp" -T 711 12889102706 1553237041 0 1553237041 0 "obj_dir/VVortex__Syms.h" -T 455 12889102712 1553237041 0 1553237041 0 "obj_dir/VVortex__ver.d" -T 0 0 1553237041 0 1553237041 0 "obj_dir/VVortex__verFiles.dat" -T 1159 12889102710 1553237041 0 1553237041 0 "obj_dir/VVortex_classes.mk" +S 12863 12889050092 1553237368 0 1553237368 0 "Vortex.v" +T 88166 12889102709 1553241260 0 1553241260 0 "obj_dir/VVortex.cpp" +T 8044 12889102708 1553241260 0 1553241260 0 "obj_dir/VVortex.h" +T 1800 12889102711 1553241260 0 1553241260 0 "obj_dir/VVortex.mk" +T 530 12889102707 1553241260 0 1553241260 0 "obj_dir/VVortex__Syms.cpp" +T 711 12889102706 1553241260 0 1553241260 0 "obj_dir/VVortex__Syms.h" +T 455 12889102712 1553241260 0 1553241260 0 "obj_dir/VVortex__ver.d" +T 0 0 1553241260 0 1553241260 0 "obj_dir/VVortex__verFiles.dat" +T 1159 12889102710 1553241260 0 1553241260 0 "obj_dir/VVortex_classes.mk" diff --git a/rtl/results.txt b/rtl/results.txt index e11422af..76783cfc 100644 --- a/rtl/results.txt +++ b/rtl/results.txt @@ -340,3 +340,75 @@ # CPI: 1.04314 # time to simulate: 6.95313e-310 milliseconds # GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-div.hex **************** +# Dynamic Instructions: 112 +# of total cycles: 123 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.09821 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-divu.hex **************** +# Dynamic Instructions: 113 +# of total cycles: 124 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.09735 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-mul.hex **************** +# Dynamic Instructions: 589 +# of total cycles: 600 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.01868 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-mulh.hex **************** +# Dynamic Instructions: 585 +# of total cycles: 596 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.0188 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-mulhsu.hex **************** +# Dynamic Instructions: 585 +# of total cycles: 596 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.0188 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-mulhu.hex **************** +# Dynamic Instructions: 585 +# of total cycles: 596 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.0188 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-rem.hex **************** +# Dynamic Instructions: 112 +# of total cycles: 123 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.09821 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING + +**************** ../../src/riscv_tests/rv32um-p-remu.hex **************** +# Dynamic Instructions: 112 +# of total cycles: 123 +# of forwarding stalls: 0 +# of branch stalls: 0 +# CPI: 1.09821 +# time to simulate: 6.95313e-310 milliseconds +# GRADE: PASSING diff --git a/rtl/test_bench.cpp b/rtl/test_bench.cpp index 1feb23a9..90721a63 100644 --- a/rtl/test_bench.cpp +++ b/rtl/test_bench.cpp @@ -2,7 +2,7 @@ #include "test_bench.h" -#define NUM_TESTS 38 +#define NUM_TESTS 46 int main(int argc, char **argv) { @@ -52,6 +52,14 @@ int main(int argc, char **argv) "../../src/riscv_tests/rv32ui-p-sw.hex", "../../src/riscv_tests/rv32ui-p-xor.hex", "../../src/riscv_tests/rv32ui-p-xori.hex", + "../../src/riscv_tests/rv32um-p-div.hex", + "../../src/riscv_tests/rv32um-p-divu.hex", + "../../src/riscv_tests/rv32um-p-mul.hex", + "../../src/riscv_tests/rv32um-p-mulh.hex", + "../../src/riscv_tests/rv32um-p-mulhsu.hex", + "../../src/riscv_tests/rv32um-p-mulhu.hex", + "../../src/riscv_tests/rv32um-p-rem.hex", + "../../src/riscv_tests/rv32um-p-remu.hex" }; for (int ii = 0; ii < NUM_TESTS; ii++) diff --git a/rtl/vortex.v b/rtl/vortex.v index 75996f0b..6d0222d7 100644 --- a/rtl/vortex.v +++ b/rtl/vortex.v @@ -38,7 +38,7 @@ wire[31:0] decode_rd1; wire[4:0] decode_rs2; wire[31:0] decode_rd2; wire[1:0] decode_wb; -wire[3:0] decode_alu_op; +wire[4:0] decode_alu_op; wire decode_rs2_src; reg[31:0] decode_itype_immed; wire[2:0] decode_mem_read; @@ -59,7 +59,7 @@ wire[4:0] d_e_rs1; wire[31:0] d_e_rd1; wire[4:0] d_e_rs2; wire[31:0] d_e_rd2; -wire[3:0] d_e_alu_op; +wire[4:0] d_e_alu_op; wire[1:0] d_e_wb; wire d_e_rs2_src; wire[31:0] d_e_itype_immed;