From 01d142c6e6c0db044d92b54dfdda44ef9ff1195c Mon Sep 17 00:00:00 2001 From: felsabbagh3 Date: Fri, 22 Mar 2019 02:44:53 -0400 Subject: [PATCH] rtl passing all tests --- rtl/Makefile | 5 + rtl/VX_decode.v | 14 +- rtl/VX_execute.v | 14 +- rtl/VX_f_d_reg.v | 7 +- rtl/VX_fetch.v | 7 +- rtl/VX_forwarding.v | 7 +- rtl/VX_memory.v | 12 +- rtl/VX_register_file.v | 18 ++- rtl/VX_writeback.v | 6 + rtl/obj_dir/Vvortex | Bin 351976 -> 352172 bytes rtl/obj_dir/Vvortex.cpp | 261 ++++++++++++++++-------------- rtl/obj_dir/Vvortex.h | 15 +- rtl/obj_dir/Vvortex__ALL.a | Bin 31104 -> 31768 bytes rtl/obj_dir/Vvortex__verFiles.dat | 32 ++-- rtl/results.txt | 189 +++++++++++----------- rtl/test_bench.cpp | 21 +-- rtl/test_bench.h | 109 +++++++------ 17 files changed, 398 insertions(+), 319 deletions(-) diff --git a/rtl/Makefile b/rtl/Makefile index 96ba4c26..15df9944 100644 --- a/rtl/Makefile +++ b/rtl/Makefile @@ -9,4 +9,9 @@ VERILATOR: RUNFILE: VERILATOR (cd obj_dir && make -j -f Vvortex.mk) + + + +clean: + rm ./obj_dir/* diff --git a/rtl/VX_decode.v b/rtl/VX_decode.v index 068a40bb..9b974ece 100644 --- a/rtl/VX_decode.v +++ b/rtl/VX_decode.v @@ -96,6 +96,11 @@ module VX_decode( wire[1:0] csr_type; reg[3:0] csr_alu; + + // always @(posedge clk) begin + // $display("Decode: curr_pc: %h", in_curr_PC); + // end + VX_register_file vx_register_file( .clk(clk), .in_write_register(write_register), @@ -142,8 +147,13 @@ module VX_decode( // ch_print("DECODE: PC: {0}, INSTRUCTION: {1}", in_curr_PC, in_instruction); - assign out_rd1 = (is_jal == 1'b1) ? in_curr_PC : - ((in_src1_fwd == 1'b1) ? in_src1_fwd_data : rd1_register); + assign out_rd1 = ((is_jal == 1'b1) ? in_curr_PC : ((in_src1_fwd == 1'b1) ? in_src1_fwd_data : rd1_register)); + + // always @(negedge clk) begin + // if (in_curr_PC == 32'h800001f0) begin + // $display("IN DECODE: Going to write to: %d with val: %h [%h, %h, %h]", out_rd, out_rd1, in_curr_PC, in_src1_fwd_data, rd1_register); + // end + // end assign out_rd2 = (in_src2_fwd == 1'b1) ? in_src2_fwd_data : rd2_register; diff --git a/rtl/VX_execute.v b/rtl/VX_execute.v index 79fd6184..30d1957c 100644 --- a/rtl/VX_execute.v +++ b/rtl/VX_execute.v @@ -45,8 +45,6 @@ module VX_execute ( output wire out_valid ); - - wire which_in2; wire[31:0] ALU_in1; @@ -66,6 +64,10 @@ module VX_execute ( assign out_jal = in_jal; + // always @(*) begin + // $display("EXECUTE CURR_PC: %h",in_curr_PC); + // end + always @(*) begin case(in_alu_op) `ADD: @@ -76,11 +78,12 @@ module VX_execute ( `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; + out_alu_result = ALU_in1 << ALU_in2[4:0]; out_csr_result = 32'hdeadbeef; end `SLT: @@ -101,12 +104,13 @@ module VX_execute ( end `SRL: begin - out_alu_result = ALU_in1 >> ALU_in2; + 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; + 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: diff --git a/rtl/VX_f_d_reg.v b/rtl/VX_f_d_reg.v index ba0ef7f3..8585ce85 100644 --- a/rtl/VX_f_d_reg.v +++ b/rtl/VX_f_d_reg.v @@ -24,10 +24,12 @@ module VX_f_d_reg ( always @(posedge clk or posedge reset) begin - if(reset || (in_fwd_stall == 1'b1) || (in_freeze == 1'b1)) begin + if(reset) begin instruction <= 32'h0; curr_PC <= 32'h0; valid <= 1'b0; + end else if (in_fwd_stall == 1'b1 || in_freeze == 1'b1) begin + // $display("Because of FWD stall keeping pc: %h", curr_PC); end else begin instruction <= in_instruction; valid <= in_valid; @@ -35,6 +37,9 @@ module VX_f_d_reg ( end end + always @(*) begin + // $display("PC in VX_f_d_reg: %h", curr_PC); + end assign out_instruction = instruction; assign out_curr_PC = curr_PC; diff --git a/rtl/VX_fetch.v b/rtl/VX_fetch.v index 7bf3a35b..7bfb0dcb 100644 --- a/rtl/VX_fetch.v +++ b/rtl/VX_fetch.v @@ -70,6 +70,7 @@ module VX_fetch ( always @(*) begin if ((delay_reg == 1'b1) && (in_freeze == 1'b0)) begin + // $display("Using old cuz delay: PC: %h",old); PC_to_use = old; end else if (in_debug == 1'b1) begin if (prev_debug == 1'b1) begin @@ -78,12 +79,12 @@ module VX_fetch ( PC_to_use = real_PC; end end else if (stall_reg == 1'b1) begin + // $display("Using old cuz stall: PC: %h\treal_pc: %h",old, real_PC); PC_to_use = old; end else begin PC_to_use = PC_to_use_temp; end end - assign stall = in_branch_stall || in_fwd_stall || in_branch_stall_exe || in_interrupt || delay || in_freeze; @@ -160,7 +161,9 @@ module VX_fetch ( end - + // always @(*) begin + // $display("Fetch out pc: %h", out_PC); + // end diff --git a/rtl/VX_forwarding.v b/rtl/VX_forwarding.v index cc359965..ff904645 100644 --- a/rtl/VX_forwarding.v +++ b/rtl/VX_forwarding.v @@ -125,9 +125,14 @@ module VX_forwarding ( assign out_csr_fwd = csr_exe_fwd || csr_mem_fwd; // COMMENT + wire exe_mem_read_stall = ((src1_exe_fwd || src2_exe_fwd) && exe_mem_read) ? `STALL : `NO_STALL; + wire mem_mem_read_stall = ((src1_mem_fwd || src2_mem_fwd) && mem_mem_read) ? `STALL : `NO_STALL; - assign out_fwd_stall = ((src1_exe_fwd || src2_exe_fwd) && exe_mem_read) ? `STALL : `NO_STALL; + assign out_fwd_stall = exe_mem_read_stall || mem_mem_read_stall; + // always @(*) begin + // if (out_fwd_stall) $display("FWD STALL"); + // end assign out_src1_fwd_data = src1_exe_fwd ? ((exe_jal) ? in_execute_PC_next : in_execute_alu_result) : (src1_mem_fwd) ? ((mem_jal) ? in_memory_PC_next : (mem_mem_read ? in_memory_mem_data : in_memory_alu_result)) : diff --git a/rtl/VX_memory.v b/rtl/VX_memory.v index 1ce464f8..06de357f 100644 --- a/rtl/VX_memory.v +++ b/rtl/VX_memory.v @@ -35,6 +35,12 @@ module VX_memory ( output wire[31:0] out_cache_driver_in_data ); + always @(in_mem_read, in_cache_driver_out_data) begin + if (in_mem_read == `LW_MEM_READ) begin + // $display("PC: %h ----> Received: %h", in_curr_PC, in_cache_driver_out_data); + end + end + assign out_delay = 1'b0; assign out_cache_driver_in_address = in_alu_result; @@ -60,7 +66,11 @@ module VX_memory ( always @(*) begin case(in_branch_type) `BEQ: out_branch_dir = (in_alu_result == 0) ? `TAKEN : `NOT_TAKEN; - `BNE: out_branch_dir = (in_alu_result == 0) ? `NOT_TAKEN : `TAKEN; + `BNE: + begin + out_branch_dir = (in_alu_result == 0) ? `NOT_TAKEN : `TAKEN; + // $display("Branch @%h is: %h", in_curr_PC, out_branch_dir); + end `BLT: out_branch_dir = (in_alu_result[31] == 0) ? `NOT_TAKEN : `TAKEN; `BGT: out_branch_dir = (in_alu_result[31] == 0) ? `TAKEN : `NOT_TAKEN; `BLTU: out_branch_dir = (in_alu_result[31] == 0) ? `NOT_TAKEN : `TAKEN; diff --git a/rtl/VX_register_file.v b/rtl/VX_register_file.v index 0754d172..ca7e8bf1 100644 --- a/rtl/VX_register_file.v +++ b/rtl/VX_register_file.v @@ -8,8 +8,8 @@ module VX_register_file ( input wire[4:0] in_src1, input wire[4:0] in_src2, - output wire[31:0] out_src1_data, - output wire[31:0] out_src2_data + output reg[31:0] out_src1_data, + output reg[31:0] out_src2_data ); reg[31:0] registers[31:0]; @@ -20,7 +20,12 @@ module VX_register_file ( wire write_enable; - + // reg[5:0] i; + // always @(posedge clk) begin + // for (i = 0; i < 32; i++) begin + // $display("%d: %h",i, registers[i[4:0]]); + // end + // end assign write_data = in_data; assign write_register = in_rd; @@ -29,12 +34,15 @@ module VX_register_file ( always @(posedge clk) begin if(write_enable) begin + // $display("Writing %h to %d",write_data, write_register); registers[write_register] <= write_data; end end - assign out_src1_data = registers[in_src1]; - assign out_src2_data = registers[in_src2]; + always @(negedge clk) begin + out_src1_data <= registers[in_src1]; + out_src2_data <= registers[in_src2]; + end endmodule diff --git a/rtl/VX_writeback.v b/rtl/VX_writeback.v index a92d269f..86f0bd4a 100644 --- a/rtl/VX_writeback.v +++ b/rtl/VX_writeback.v @@ -17,6 +17,12 @@ module VX_writeback ( wire is_jal; wire uses_alu; + // always @(*) begin + // if (in_PC_next == 32'h800001f4 || in_PC_next == 32'h800001f0) begin + + // $display("(%h) WB Data: %h, to register: %d",in_PC_next - 4, in_mem_result, in_rd); + // end + // end assign is_jal = in_wb == `WB_JAL; assign uses_alu = in_wb == `WB_ALU; diff --git a/rtl/obj_dir/Vvortex b/rtl/obj_dir/Vvortex index 1be666cae18ee92db82d277d0ab9dccd95cec4f1..81641bcf3ba90dfb451c0d1502c7fe05c5cdc12d 100755 GIT binary patch delta 60714 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 NY+v@lRcW7O{vVY?9ftq_ diff --git a/rtl/obj_dir/Vvortex.cpp b/rtl/obj_dir/Vvortex.cpp index b67fb7a5..90e8fee8 100644 --- a/rtl/obj_dir/Vvortex.cpp +++ b/rtl/obj_dir/Vvortex.cpp @@ -93,28 +93,28 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__1(VVortex__Syms* __restrict vlSymsp) VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_sequent__TOP__1\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__stall_reg = ((~ (IData)(vlTOPp->reset)) & (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__stall)); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__old = ((IData)(vlTOPp->reset) ? 0U : vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__BR_reg = ((IData)(vlTOPp->reset) ? 0U : ((IData)(4U) + vlTOPp->Vortex__DOT__memory_branch_dest)); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__delay_reg = 0U; - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__real_PC = ((IData)(vlTOPp->reset) ? 0U : ((IData)(4U) + vlTOPp->Vortex__DOT__vx_fetch__DOT__PC_to_use)); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__state = ((IData)(vlTOPp->reset) ? 0U : @@ -127,13 +127,13 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__1(VVortex__Syms* __restrict vlSymsp) ((IData)(vlTOPp->Vortex__DOT__memory_branch_dir) ? 2U : 0U)))); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__JAL_reg = ((IData)(vlTOPp->reset) ? 0U : ((IData)(4U) + vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__jal_dest)); - // ALWAYS at VX_fetch.v:128 + // ALWAYS at VX_fetch.v:129 vlTOPp->Vortex__DOT__vx_fetch__DOT__prev_debug = 0U; // ALWAYS at VX_fetch.v:71 vlTOPp->Vortex__DOT__vx_fetch__DOT__PC_to_use = @@ -230,7 +230,7 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) __Vdlyvdim0__Vortex__DOT__vx_csr_handler__DOT__csr__v0 = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__csr_address; } - // ALWAYS at VX_register_file.v:30 + // ALWAYS at VX_register_file.v:35 if (((0U != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb)) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)))) { __Vdlyvval__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0 @@ -250,6 +250,11 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) vlTOPp->Vortex__DOT__vx_csr_handler__DOT__csr[__Vdlyvdim0__Vortex__DOT__vx_csr_handler__DOT__csr__v0] = __Vdlyvval__Vortex__DOT__vx_csr_handler__DOT__csr__v0; } + // ALWAYSPOST at VX_register_file.v:38 + if (__Vdlyvset__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0) { + vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers[__Vdlyvdim0__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0] + = __Vdlyvval__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0; + } // ALWAYS at VX_d_e_reg.v:130 vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__branch_type = ((IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling) @@ -401,12 +406,7 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) ? vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__mem_result : vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__alu_result)) : 0xdeadbeefU))) - : - vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers - [ - (0x1fU - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0x14U))])); + : vlTOPp->Vortex__DOT__vx_decode__DOT__rd2_register)); 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) @@ -429,11 +429,6 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) : vlTOPp->Vortex__DOT__vx_csr_handler__DOT__csr [vlTOPp->Vortex__DOT__vx_csr_handler__DOT__decode_csr_address])))); - // ALWAYSPOST at VX_register_file.v:32 - if (__Vdlyvset__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0) { - vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers[__Vdlyvdim0__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0] - = __Vdlyvval__Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers__v0; - } // ALWAYS at VX_e_m_reg.v:117 vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__valid = vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__valid; vlTOPp->Vortex__DOT__execute_branch_stall = ((0U @@ -573,7 +568,7 @@ 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:69 + // ALWAYS at VX_execute.v:71 vlTOPp->Vortex__DOT__execute_alu_result = ((8U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? ( @@ -625,19 +620,14 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) ((1U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - ((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) + VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) : - ((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)) + (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)) @@ -660,12 +650,10 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) ? 1U : 0U) : - ((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)) + (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)) @@ -676,7 +664,7 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) (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:60 + // ALWAYS at VX_memory.v:66 vlTOPp->Vortex__DOT__memory_branch_dir = (1U & ((4U & (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__branch_type)) @@ -765,8 +753,24 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__2(VVortex__Syms* __restrict vlSymsp) : 0U)))); } -void VVortex::_initial__TOP__3(VVortex__Syms* __restrict vlSymsp) { - VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_initial__TOP__3\n"); ); +VL_INLINE_OPT void VVortex::_sequent__TOP__3(VVortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_sequent__TOP__3\n"); ); + VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // ALWAYS at VX_register_file.v:42 + vlTOPp->Vortex__DOT__vx_decode__DOT__rd2_register + = vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers + [(0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0x14U))]; + // ALWAYS at VX_register_file.v:42 + vlTOPp->Vortex__DOT__vx_decode__DOT__rd1_register + = vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers + [(0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xfU))]; +} + +void VVortex::_initial__TOP__4(VVortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_initial__TOP__4\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body // INITIAL at VX_csr_handler.v:27 @@ -828,8 +832,8 @@ void VVortex::_initial__TOP__3(VVortex__Syms* __restrict vlSymsp) { vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__valid = 0U; } -void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { - VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_settle__TOP__4\n"); ); +void VVortex::_settle__TOP__5(VVortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_settle__TOP__5\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body vlTOPp->Vortex__DOT__vx_decode__DOT__is_itype = @@ -860,7 +864,7 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U) : 0x55U)); - // ALWAYS at VX_decode.v:249 + // ALWAYS at VX_decode.v:259 vlTOPp->Vortex__DOT__decode_branch_type = ((0x63U == (0x7fU @@ -951,7 +955,7 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { + (vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__branch_offset << 1U)); vlTOPp->out_cache_driver_in_address = vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__alu_result; - // ALWAYS at VX_memory.v:60 + // ALWAYS at VX_memory.v:66 vlTOPp->Vortex__DOT__memory_branch_dir = (1U & ((4U & (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__branch_type)) @@ -1006,7 +1010,7 @@ void VVortex::_settle__TOP__4(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:238 + // ALWAYS at VX_decode.v:248 vlTOPp->Vortex__DOT__decode_itype_immed = ((0x40U & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) ? ( @@ -1141,7 +1145,7 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { >> 0x14U))) : 0xdeadbeefU) : 0xdeadbeefU)))))); - // ALWAYS at VX_fetch.v:94 + // ALWAYS at VX_fetch.v:95 vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC = ( ((IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__jal) & (~ (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__delay_reg))) @@ -1151,7 +1155,7 @@ void VVortex::_settle__TOP__4(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:69 + // ALWAYS at VX_execute.v:71 vlTOPp->Vortex__DOT__execute_alu_result = ((8U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? ( @@ -1203,19 +1207,14 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { ((1U & (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__alu_op)) ? - ((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) + VL_SHIFTRS_III(32,32,5, vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__rd1, + (0x1fU + & vlTOPp->Vortex__DOT__vx_execute__DOT__ALU_in2)) : - ((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)) + (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)) @@ -1238,12 +1237,10 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { ? 1U : 0U) : - ((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)) + (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)) @@ -1260,10 +1257,6 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { >> 0x14U)))) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd))); - vlTOPp->Vortex__DOT__forwarding_fwd_stall = (((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd) - | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd)) - & (2U - == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd = (((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd)) @@ -1279,6 +1272,22 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd))); + vlTOPp->Vortex__DOT__forwarding_fwd_stall = ((((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd) + | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd)) + & (2U + == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))) + | (((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd) + | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd)) + & (2U + == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb)))); + vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_wb_fwd + = ((((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)) + & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xfU)))) & (0U + != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) + & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd))) + & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd))); vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling = ((IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall) | (IData)(vlTOPp->Vortex__DOT__execute_branch_stall)); @@ -1297,14 +1306,6 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)))) | (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)) | (IData)(vlTOPp->Vortex__DOT__execute_branch_stall)); - vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_wb_fwd - = ((((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)) - & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU)))) & (0U - != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) - & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd))) - & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd))); vlTOPp->Vortex__DOT__decode_rd1 = ((0x6fU == (0x7fU & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)) ? vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__curr_PC @@ -1339,32 +1340,42 @@ void VVortex::_settle__TOP__4(VVortex__Syms* __restrict vlSymsp) { ? vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__mem_result : vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__alu_result)) : 0xdeadbeefU))) - : vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers - [(0x1fU - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU))])); + : vlTOPp->Vortex__DOT__vx_decode__DOT__rd1_register)); } -VL_INLINE_OPT void VVortex::_sequent__TOP__5(VVortex__Syms* __restrict vlSymsp) { - VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_sequent__TOP__5\n"); ); +VL_INLINE_OPT void VVortex::_sequent__TOP__6(VVortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_sequent__TOP__6\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body // ALWAYS at VX_f_d_reg.v:26 - vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__valid = (1U - & ((~ - ((IData)(vlTOPp->reset) - | (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall))) - & (~ (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__stall)))); + if (vlTOPp->reset) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__valid = 0U; + } else { + if ((1U & (~ (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)))) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__valid + = (1U & (~ (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__stall))); + } + } // ALWAYS at VX_f_d_reg.v:26 - vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__curr_PC = - (((IData)(vlTOPp->reset) | (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)) - ? 0U : vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC); + if (vlTOPp->reset) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__curr_PC = 0U; + } else { + if ((1U & (~ (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)))) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__curr_PC + = vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC; + } + } // ALWAYS at VX_f_d_reg.v:26 - vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - = (((IData)(vlTOPp->reset) | (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)) - ? 0U : ((IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__stall) - ? 0U : vlTOPp->fe_instruction)); - // ALWAYS at VX_fetch.v:94 + if (vlTOPp->reset) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction = 0U; + } else { + if ((1U & (~ (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)))) { + vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + = ((IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__stall) + ? 0U : vlTOPp->fe_instruction); + } + } + // ALWAYS at VX_fetch.v:95 vlTOPp->Vortex__DOT__vx_fetch__DOT__temp_PC = ( ((IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__jal) & (~ (IData)(vlTOPp->Vortex__DOT__vx_fetch__DOT__delay_reg))) @@ -1403,7 +1414,7 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__5(VVortex__Syms* __restrict vlSymsp) (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0x14U) : 0x55U)); - // ALWAYS at VX_decode.v:249 + // ALWAYS at VX_decode.v:259 vlTOPp->Vortex__DOT__decode_branch_type = ((0x63U == (0x7fU @@ -1454,7 +1465,7 @@ VL_INLINE_OPT void VVortex::_sequent__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:238 + // ALWAYS at VX_decode.v:248 vlTOPp->Vortex__DOT__decode_itype_immed = ((0x40U & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction) ? ( @@ -1596,10 +1607,6 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__5(VVortex__Syms* __restrict vlSymsp) >> 0x14U)))) & (0U != (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd))); - vlTOPp->Vortex__DOT__forwarding_fwd_stall = (((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd) - | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd)) - & (2U - == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))); vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd = (((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__rd)) @@ -1614,6 +1621,22 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__5(VVortex__Syms* __restrict vlSymsp) != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd))) & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd))); + vlTOPp->Vortex__DOT__forwarding_fwd_stall = ((((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd) + | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_exe_fwd)) + & (2U + == (IData)(vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__wb))) + | (((IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd) + | (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src2_mem_fwd)) + & (2U + == (IData)(vlTOPp->Vortex__DOT__vx_e_m_reg__DOT__wb)))); + vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_wb_fwd + = ((((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)) + & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction + >> 0xfU)))) & (0U + != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) + & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd))) + & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd))); vlTOPp->Vortex__DOT__vx_d_e_reg__DOT__stalling = ((IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall) | (IData)(vlTOPp->Vortex__DOT__execute_branch_stall)); @@ -1632,18 +1655,10 @@ VL_INLINE_OPT void VVortex::_sequent__TOP__5(VVortex__Syms* __restrict vlSymsp) & vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction)))) | (IData)(vlTOPp->Vortex__DOT__forwarding_fwd_stall)) | (IData)(vlTOPp->Vortex__DOT__execute_branch_stall)); - vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_wb_fwd - = ((((((0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU)) == (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__rd)) - & (0U != (0x1fU & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU)))) & (0U - != (IData)(vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__wb))) - & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_exe_fwd))) - & (~ (IData)(vlTOPp->Vortex__DOT__vx_forwarding__DOT__src1_mem_fwd))); } -VL_INLINE_OPT void VVortex::_combo__TOP__6(VVortex__Syms* __restrict vlSymsp) { - VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_combo__TOP__6\n"); ); +VL_INLINE_OPT void VVortex::_combo__TOP__7(VVortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_combo__TOP__7\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body vlTOPp->Vortex__DOT__decode_rd1 = ((0x6fU == (0x7fU @@ -1680,10 +1695,7 @@ VL_INLINE_OPT void VVortex::_combo__TOP__6(VVortex__Syms* __restrict vlSymsp) { ? vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__mem_result : vlTOPp->Vortex__DOT__vx_m_w_reg__DOT__alu_result)) : 0xdeadbeefU))) - : vlTOPp->Vortex__DOT__vx_decode__DOT__vx_register_file__DOT__registers - [(0x1fU - & (vlTOPp->Vortex__DOT__vx_f_d_reg__DOT__instruction - >> 0xfU))])); + : vlTOPp->Vortex__DOT__vx_decode__DOT__rd1_register)); } void VVortex::_eval(VVortex__Syms* __restrict vlSymsp) { @@ -1697,11 +1709,14 @@ void VVortex::_eval(VVortex__Syms* __restrict vlSymsp) { if (((IData)(vlTOPp->clk) & (~ (IData)(vlTOPp->__Vclklast__TOP__clk)))) { vlTOPp->_sequent__TOP__2(vlSymsp); } + if (((~ (IData)(vlTOPp->clk)) & (IData)(vlTOPp->__Vclklast__TOP__clk))) { + vlTOPp->_sequent__TOP__3(vlSymsp); + } if ((((IData)(vlTOPp->clk) & (~ (IData)(vlTOPp->__Vclklast__TOP__clk))) | ((IData)(vlTOPp->reset) & (~ (IData)(vlTOPp->__Vclklast__TOP__reset))))) { - vlTOPp->_sequent__TOP__5(vlSymsp); + vlTOPp->_sequent__TOP__6(vlSymsp); } - vlTOPp->_combo__TOP__6(vlSymsp); + vlTOPp->_combo__TOP__7(vlSymsp); // Final vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; vlTOPp->__Vclklast__TOP__reset = vlTOPp->reset; @@ -1713,7 +1728,7 @@ void VVortex::_eval_initial(VVortex__Syms* __restrict vlSymsp) { // Body vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; vlTOPp->__Vclklast__TOP__reset = vlTOPp->reset; - vlTOPp->_initial__TOP__3(vlSymsp); + vlTOPp->_initial__TOP__4(vlSymsp); } void VVortex::final() { @@ -1727,7 +1742,7 @@ void VVortex::_eval_settle(VVortex__Syms* __restrict vlSymsp) { VL_DEBUG_IF(VL_DBG_MSGF("+ VVortex::_eval_settle\n"); ); VVortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; // Body - vlTOPp->_settle__TOP__4(vlSymsp); + vlTOPp->_settle__TOP__5(vlSymsp); } VL_INLINE_OPT QData VVortex::_change_request(VVortex__Syms* __restrict vlSymsp) { @@ -1786,6 +1801,8 @@ void VVortex::_ctor_var_reset() { Vortex__DOT__vx_f_d_reg__DOT__instruction = VL_RAND_RESET_I(32); Vortex__DOT__vx_f_d_reg__DOT__curr_PC = VL_RAND_RESET_I(32); Vortex__DOT__vx_f_d_reg__DOT__valid = VL_RAND_RESET_I(1); + Vortex__DOT__vx_decode__DOT__rd1_register = VL_RAND_RESET_I(32); + Vortex__DOT__vx_decode__DOT__rd2_register = VL_RAND_RESET_I(32); 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); diff --git a/rtl/obj_dir/Vvortex.h b/rtl/obj_dir/Vvortex.h index a839f777..4c184f36 100644 --- a/rtl/obj_dir/Vvortex.h +++ b/rtl/obj_dir/Vvortex.h @@ -94,14 +94,16 @@ VL_MODULE(VVortex) { VL_SIG(Vortex__DOT__vx_fetch__DOT__temp_PC,31,0); VL_SIG(Vortex__DOT__vx_f_d_reg__DOT__instruction,31,0); VL_SIG(Vortex__DOT__vx_f_d_reg__DOT__curr_PC,31,0); + VL_SIG(Vortex__DOT__vx_decode__DOT__rd1_register,31,0); + 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); - 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); }; struct { + 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); VL_SIG(Vortex__DOT__vx_d_e_reg__DOT__jal_offset,31,0); VL_SIG(Vortex__DOT__vx_execute__DOT__ALU_in2,31,0); @@ -159,7 +161,7 @@ VL_MODULE(VVortex) { private: static QData _change_request(VVortex__Syms* __restrict vlSymsp); public: - static void _combo__TOP__6(VVortex__Syms* __restrict vlSymsp); + static void _combo__TOP__7(VVortex__Syms* __restrict vlSymsp); private: void _ctor_var_reset(); public: @@ -171,11 +173,12 @@ VL_MODULE(VVortex) { public: static void _eval_initial(VVortex__Syms* __restrict vlSymsp); static void _eval_settle(VVortex__Syms* __restrict vlSymsp); - static void _initial__TOP__3(VVortex__Syms* __restrict vlSymsp); + static void _initial__TOP__4(VVortex__Syms* __restrict vlSymsp); static void _sequent__TOP__1(VVortex__Syms* __restrict vlSymsp); static void _sequent__TOP__2(VVortex__Syms* __restrict vlSymsp); - static void _sequent__TOP__5(VVortex__Syms* __restrict vlSymsp); - static void _settle__TOP__4(VVortex__Syms* __restrict vlSymsp); + static void _sequent__TOP__3(VVortex__Syms* __restrict vlSymsp); + static void _sequent__TOP__6(VVortex__Syms* __restrict vlSymsp); + static void _settle__TOP__5(VVortex__Syms* __restrict vlSymsp); } VL_ATTR_ALIGNED(128); #endif // guard diff --git a/rtl/obj_dir/Vvortex__ALL.a b/rtl/obj_dir/Vvortex__ALL.a index ae89e441c6cb43177511a71251492c8eca88d888..8e91e947df5e4e309b1e7712d97ed8342bc569cc 100644 GIT binary patch literal 31768 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 C>|)gb literal 31104 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 zE&&nOA;EGIyBczMZNwkL_M*FncCPIw4instruction_file_name, &this->ram); } +void Vortex::print_stats(bool cycle_test) +{ + + if (cycle_test) + { + this->results << std::left; + // this->results << "# Static Instructions:\t" << std::dec << this->stats_static_inst << std::endl; + this->results << std::setw(24) << "# Dynamic Instructions:" << std::dec << this->stats_dynamic_inst << std::endl; + this->results << std::setw(24) << "# of total cycles:" << std::dec << this->stats_total_cycles << std::endl; + this->results << std::setw(24) << "# of forwarding stalls:" << std::dec << this->stats_fwd_stalls << std::endl; + this->results << std::setw(24) << "# of branch stalls:" << std::dec << this->stats_branch_stalls << std::endl; + this->results << std::setw(24) << "# CPI:" << std::dec << (double) this->stats_total_cycles / (double) this->stats_dynamic_inst << std::endl; + this->results << std::setw(24) << "# time to simulate: " << std::dec << this->stats_sim_time << " milliseconds" << std::endl; + } + else + { + this->results << std::left; + this->results << std::setw(24) << "# of total cycles:" << std::dec << this->stats_total_cycles << std::endl; + this->results << std::setw(24) << "# time to simulate: " << std::dec << this->stats_sim_time << " milliseconds" << std::endl; + } + + + uint32_t status; + ram.getWord(0, &status); + + if (this->unit_test) + { + if (status == 1) + { + this->results << std::setw(24) << "# GRADE:" << "PASSING\n"; + } else + { + this->results << std::setw(24) << "# GRADE:" << "Failed on test: " << status << "\n"; + } + } + else + { + this->results << std::setw(24) << "# GRADE:" << "N/A [NOT A UNIT TEST]\n"; + } + + this->stats_static_inst = 0; + this->stats_dynamic_inst = -1; + this->stats_total_cycles = 0; + this->stats_fwd_stalls = 0; + this->stats_branch_stalls = 0; + +} bool Vortex::ibus_driver() { @@ -166,7 +213,9 @@ bool Vortex::dbus_driver() } else if (vortex->out_cache_driver_in_mem_read == LW_MEM_READ) { - + // printf("Reading mem - Addr: %h = %h\n", addr, data_read); + // std::cout << "Reading mem - Addr: " << std::hex << addr << " = " << data_read << "\n"; + std::cout << std::dec; vortex->in_cache_driver_out_data = data_read; } else if (vortex->out_cache_driver_in_mem_read == LBU_MEM_READ) @@ -222,19 +271,26 @@ bool Vortex::simulate(std::string file_to_simulate) unsigned curr_inst; unsigned new_PC; + + int cycle = 0; while (this->stop && (!(stop && (counter > 5)))) { + // std::cout << "************* Cycle: " << cycle << "\n"; bool istop = ibus_driver(); bool dstop = !dbus_driver(); - stop = istop && dstop; vortex->clk = 1; vortex->eval(); + + vortex->clk = 0; vortex->eval(); + + stop = istop && dstop; + if (stop) { counter++; @@ -243,6 +299,7 @@ bool Vortex::simulate(std::string file_to_simulate) counter = 0; } + cycle++; } uint32_t status; @@ -256,54 +313,6 @@ bool Vortex::simulate(std::string file_to_simulate) } -void Vortex::print_stats(bool cycle_test) -{ - - if (cycle_test) - { - this->results << std::left; - // this->results << "# Static Instructions:\t" << std::dec << this->stats_static_inst << std::endl; - this->results << std::setw(24) << "# Dynamic Instructions:" << std::dec << this->stats_dynamic_inst << std::endl; - this->results << std::setw(24) << "# of total cycles:" << std::dec << this->stats_total_cycles << std::endl; - this->results << std::setw(24) << "# of forwarding stalls:" << std::dec << this->stats_fwd_stalls << std::endl; - this->results << std::setw(24) << "# of branch stalls:" << std::dec << this->stats_branch_stalls << std::endl; - this->results << std::setw(24) << "# CPI:" << std::dec << (double) this->stats_total_cycles / (double) this->stats_dynamic_inst << std::endl; - this->results << std::setw(24) << "# time to simulate: " << std::dec << this->stats_sim_time << " milliseconds" << std::endl; - } - else - { - this->results << std::left; - this->results << std::setw(24) << "# of total cycles:" << std::dec << this->stats_total_cycles << std::endl; - this->results << std::setw(24) << "# time to simulate: " << std::dec << this->stats_sim_time << " milliseconds" << std::endl; - } - - - uint32_t status; - ram.getWord(0, &status); - - if (this->unit_test) - { - if (status == 1) - { - this->results << std::setw(24) << "# GRADE:" << "PASSING\n"; - } else - { - this->results << std::setw(24) << "# GRADE:" << "Failed on test: " << status << "\n"; - } - } - else - { - this->results << std::setw(24) << "# GRADE:" << "N/A [NOT A UNIT TEST]\n"; - } - - this->stats_static_inst = 0; - this->stats_dynamic_inst = -1; - this->stats_total_cycles = 0; - this->stats_fwd_stalls = 0; - this->stats_branch_stalls = 0; - -} -