From d08d3891771410d1f95776fe6a55591a398c1513 Mon Sep 17 00:00:00 2001 From: felsabbagh3 Date: Thu, 21 Mar 2019 02:23:10 -0400 Subject: [PATCH] Started on rtl (Finished till decode) --- .DS_Store | Bin 6148 -> 8196 bytes rtl/Makefile | 12 + rtl/VX_decode.v | 386 ++++++++ rtl/VX_f_d_reg.v | 45 + rtl/VX_fetch.v | 168 ++++ rtl/VX_register_file.v | 40 + rtl/obj_dir/VVX_decode.cpp | 975 ++++++++++++++++++++ rtl/obj_dir/VVX_decode.h | 118 +++ rtl/obj_dir/VVX_decode.mk | 53 ++ rtl/obj_dir/VVX_decode__Syms.cpp | 19 + rtl/obj_dir/VVX_decode__Syms.h | 34 + rtl/obj_dir/VVX_decode__ver.d | 1 + rtl/obj_dir/VVX_decode__verFiles.dat | 13 + rtl/obj_dir/VVX_decode_classes.mk | 38 + rtl/obj_dir/VVX_register_file.cpp | 200 ++++ rtl/obj_dir/VVX_register_file.h | 88 ++ rtl/obj_dir/VVX_register_file.mk | 53 ++ rtl/obj_dir/VVX_register_file__Syms.cpp | 19 + rtl/obj_dir/VVX_register_file__Syms.h | 34 + rtl/obj_dir/VVX_register_file__ver.d | 1 + rtl/obj_dir/VVX_register_file__verFiles.dat | 12 + rtl/obj_dir/VVX_register_file_classes.mk | 38 + rtl/obj_dir/Vvortex | Bin 0 -> 277588 bytes rtl/obj_dir/Vvortex.cpp | 304 ++++++ rtl/obj_dir/Vvortex.h | 100 ++ rtl/obj_dir/Vvortex.mk | 66 ++ rtl/obj_dir/Vvortex__ALL.a | Bin 0 -> 11608 bytes rtl/obj_dir/Vvortex__ALLcls.cpp | 3 + rtl/obj_dir/Vvortex__ALLcls.d | 5 + rtl/obj_dir/Vvortex__ALLsup.cpp | 3 + rtl/obj_dir/Vvortex__ALLsup.d | 5 + rtl/obj_dir/Vvortex__Syms.cpp | 19 + rtl/obj_dir/Vvortex__Syms.h | 34 + rtl/obj_dir/Vvortex__ver.d | 1 + rtl/obj_dir/Vvortex__verFiles.dat | 14 + rtl/obj_dir/Vvortex_classes.mk | 38 + rtl/obj_dir/test_bench.d | 4 + rtl/obj_dir/verilated.d | 9 + rtl/test_bench.cpp | 42 + rtl/vortex.v | 94 ++ src/vortex_software/.DS_Store | Bin 8196 -> 6148 bytes src/vortex_software/vx_include/.DS_Store | Bin 0 -> 6148 bytes src/vortex_software/vx_os/.DS_Store | Bin 6148 -> 6148 bytes 43 files changed, 3088 insertions(+) create mode 100644 rtl/Makefile create mode 100644 rtl/VX_decode.v create mode 100644 rtl/VX_f_d_reg.v create mode 100644 rtl/VX_fetch.v create mode 100644 rtl/VX_register_file.v create mode 100644 rtl/obj_dir/VVX_decode.cpp create mode 100644 rtl/obj_dir/VVX_decode.h create mode 100644 rtl/obj_dir/VVX_decode.mk create mode 100644 rtl/obj_dir/VVX_decode__Syms.cpp create mode 100644 rtl/obj_dir/VVX_decode__Syms.h create mode 100644 rtl/obj_dir/VVX_decode__ver.d create mode 100644 rtl/obj_dir/VVX_decode__verFiles.dat create mode 100644 rtl/obj_dir/VVX_decode_classes.mk create mode 100644 rtl/obj_dir/VVX_register_file.cpp create mode 100644 rtl/obj_dir/VVX_register_file.h create mode 100644 rtl/obj_dir/VVX_register_file.mk create mode 100644 rtl/obj_dir/VVX_register_file__Syms.cpp create mode 100644 rtl/obj_dir/VVX_register_file__Syms.h create mode 100644 rtl/obj_dir/VVX_register_file__ver.d create mode 100644 rtl/obj_dir/VVX_register_file__verFiles.dat create mode 100644 rtl/obj_dir/VVX_register_file_classes.mk create mode 100755 rtl/obj_dir/Vvortex create mode 100644 rtl/obj_dir/Vvortex.cpp create mode 100644 rtl/obj_dir/Vvortex.h create mode 100644 rtl/obj_dir/Vvortex.mk create mode 100644 rtl/obj_dir/Vvortex__ALL.a create mode 100644 rtl/obj_dir/Vvortex__ALLcls.cpp create mode 100644 rtl/obj_dir/Vvortex__ALLcls.d create mode 100644 rtl/obj_dir/Vvortex__ALLsup.cpp create mode 100644 rtl/obj_dir/Vvortex__ALLsup.d create mode 100644 rtl/obj_dir/Vvortex__Syms.cpp create mode 100644 rtl/obj_dir/Vvortex__Syms.h create mode 100644 rtl/obj_dir/Vvortex__ver.d create mode 100644 rtl/obj_dir/Vvortex__verFiles.dat create mode 100644 rtl/obj_dir/Vvortex_classes.mk create mode 100644 rtl/obj_dir/test_bench.d create mode 100644 rtl/obj_dir/verilated.d create mode 100644 rtl/test_bench.cpp create mode 100644 rtl/vortex.v create mode 100644 src/vortex_software/vx_include/.DS_Store diff --git a/.DS_Store b/.DS_Store index ffe5b8b379f2f4c52495d90f19157aa66b4c9d91..32aaf96e3075d20a8728890b60cd6dace1b74f65 100644 GIT binary patch literal 8196 zcmeHMU2GIp6h3EL;NBMK6#3}@YZq!sEk(A4(iThI{#YmlA#O`s{>tpmKqpRT%FgUA zP-`0FZ=%Nd6C)Un;Z2N*4@QZP{$ost!6-32=!=g=qlr((bLY-NyQQyU?A&DTx%ZrV z=I;6KH}~}30swYp^+tdy0ATb8sgzT7n{xQl$tOL{%eq}! z=7{JW)V#4&&>nCc>tIMxtI%L|qlkak}w(k1xNlF7_ zobgdbot$inZ)=D(wl+;Q#3maXx5XP`JGRHCrZ`(u+qkRm#Q52BlaEe4c3y^r!L|Su zMIm0e6`$qiy5;>uJly|Z$TYIOrwK43?6`t|!A zUA$5EEo!w|%h(a2@6H%hOEs@k>$#$_0hc0?uh_!3a>eBXkI-sL*CxK5DLNmtw3J~< zRSR!pNDv6&j!edf_mn!G=6M2hYO`a2_tgC3qh`hR@*(xB_3p zRk#j6!7uO|{0@J>pYS&>L55{mj#an;H)0KL#a3*?`>`E6aWD4cetZa%codJ}D4xKR z=->oq(8Wo70-wZZ@L7BbFW?*aCccI5;fMGUUdB)GQ~Uh7AlEln-$oi`V;Xx(N~$Y+hDg-@3P z9sI?c%|Tjib?rJH9VAv6XNvh>V7RhG@P`R*sMWD(R1w6H-Fs@O8zFAX?!EO6tvsqMB9cn$w(XoNrNm-sZEYj#V&bc`?&=^bi0@3AyK3oONSo9=?36;eklHaCDtr=woR*R_RQ~mg05#12KJc;%^Z)EWdS*cL|8D*R?B`ka delta 147 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjdEU6q~50D9QxlfW(Rml5+BsfV`7Q1rrOG zPd1QYnXD!@o6&6ZAu(6RjSb?gi`h9i1et*= 12'h2; + + assign out_csr_address = (csr_cond1 && csr_cond2) ? u_12 : 12'h55; + + + // ITYPE IMEED + assign alu_shift_i = (func3 == 3'h1) || (func3 == 3'h5); + assign alu_shift_i_immed = {{7{1'b0}}, out_rs2}; + assign alu_tempp = alu_shift_i ? alu_shift_i_immed : u_12; + + + always @(*) begin + case(curr_opcode) + `ALU_INST: out_itype_immed = {{20{alu_tempp[11]}}, alu_tempp}; + `S_INST: out_itype_immed = {{20{func7[6]}}, func7, out_rd}; + `L_INST: out_itype_immed = {{20{u_12[11]}}, u_12}; + `B_INST: out_itype_immed = {{20{in_instruction[31]}}, in_instruction[31], in_instruction[7], in_instruction[30:25], in_instruction[11:8]}; + default: out_itype_immed = 32'hdeadbeef; + endcase + end + + + always @(*) begin + case(curr_opcode) + `B_INST: + begin + out_branch_stall = 1'b1; + case(func3) + 3'h0: out_branch_type = `BEQ; + 3'h1: out_branch_type = `BNE; + 3'h4: out_branch_type = `BLT; + 3'h5: out_branch_type = `BGT; + 3'h6: out_branch_type = `BLTU; + 3'h7: out_branch_type = `BGTU; + default: out_branch_type = `NO_BRANCH; + endcase + end + + `JAL_INST: + begin + out_branch_type = `NO_BRANCH; + out_branch_stall = 1'b1; + end + `JALR_INST: + begin + out_branch_type = `NO_BRANCH; + out_branch_stall = 1'b1; + end + default: + begin + out_branch_type = `NO_BRANCH; + out_branch_stall = 1'b0; + end + endcase + end + + + always @(*) begin + // ALU OP + case(func3) + 3'h0: alu_op = (curr_opcode == `ALU_INST) ? `ADD : (func7 == 7'h0 ? `ADD : `SUB); + 3'h1: alu_op = `SLLA; + 3'h2: alu_op = `SLT; + 3'h3: alu_op = `SLTU; + 3'h4: alu_op = `XOR; + 3'h5: alu_op = (func7 == 7'h0) ? `SRL : `SRA; + 3'h6: alu_op = `OR; + 3'h7: alu_op = `AND; + default: alu_op = `NO_ALU; + endcase + end + + + assign csr_type = func3[1:0]; + + always @(*) begin + case(csr_type) + 2'h1: csr_alu = `CSR_ALU_RW; + 2'h2: csr_alu = `CSR_ALU_RS; + 2'h3: csr_alu = `CSR_ALU_RC; + default: csr_alu = `NO_ALU; + endcase + end + + + assign out_alu_op = 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; + + +endmodule + + + + + + + + diff --git a/rtl/VX_f_d_reg.v b/rtl/VX_f_d_reg.v new file mode 100644 index 00000000..27b8a1a9 --- /dev/null +++ b/rtl/VX_f_d_reg.v @@ -0,0 +1,45 @@ + + + +module VX_f_d_reg ( + input wire clk, + input wire reset, + input wire[31:0] in_instruction, + input wire in_valid, + input wire[31:0] in_curr_PC, + input wire in_fwd_stall, + input wire in_freeze, + output wire[31:0] out_instruction, + output wire[31:0] out_curr_PC, + output wire out_valid +); + + always @(posedge clk) begin + $display("Fetch Inst: %d\tDecode Inst: %d", in_instruction, out_instruction); + end + + reg[31:0] instruction; + reg[31:0] curr_PC; + reg valid; + + + always @(posedge clk or posedge reset) begin + if(reset || (in_fwd_stall == 1'b1) || (in_freeze == 1'b1)) begin + instruction <= 32'h0; + curr_PC <= 32'h0; + valid <= 1'b0; + end else begin + instruction <= in_instruction; + valid <= in_valid; + curr_PC <= in_curr_PC; + end + end + + + assign out_instruction = instruction; + assign out_curr_PC = curr_PC; + assign out_valid = valid; + + + +endmodule \ No newline at end of file diff --git a/rtl/VX_fetch.v b/rtl/VX_fetch.v new file mode 100644 index 00000000..7bf3a35b --- /dev/null +++ b/rtl/VX_fetch.v @@ -0,0 +1,168 @@ + + +module VX_fetch ( + input wire clk, + input wire reset, + input wire in_branch_dir, + input wire in_freeze, + input wire[31:0] in_branch_dest, + input wire in_branch_stall, + input wire in_fwd_stall, + input wire in_branch_stall_exe, + input wire in_jal, + input wire[31:0] in_jal_dest, + input wire in_interrupt, + input wire in_debug, + input wire[31:0] in_instruction, + + output wire[31:0] out_instruction, + output wire out_delay, + output wire[31:0] out_curr_PC, + output wire out_valid +); + + + reg stall_reg; + reg delay_reg; + reg[31:0] old; + reg[4:0] state; + reg[31:0] real_PC; + reg[31:0] JAL_reg; + reg[31:0] BR_reg; + reg prev_debug; + + + reg delay; + reg[31:0] PC_to_use; + reg[31:0] PC_to_use_temp; + reg stall; + reg[31:0] temp_PC; + reg[31:0] out_PC; + reg[4:0] temp_state; + reg[4:0] tempp_state; + + initial begin + stall_reg = 0; + delay_reg = 0; + old = 0; + state = 0; + real_PC = 0; + JAL_reg = 0; + BR_reg = 0; + prev_debug = 0; + end + + always @(*) begin + case(state) + 5'h00: PC_to_use_temp = real_PC; + 5'h01: PC_to_use_temp = JAL_reg; + 5'h02: PC_to_use_temp = BR_reg; + 5'h03: PC_to_use_temp = real_PC; + 5'h04: PC_to_use_temp = old; + default: PC_to_use_temp = 32'h0; + endcase // state + end + + + + assign out_delay = 0; + assign delay = out_delay; + + always @(*) begin + if ((delay_reg == 1'b1) && (in_freeze == 1'b0)) begin + PC_to_use = old; + end else if (in_debug == 1'b1) begin + if (prev_debug == 1'b1) begin + PC_to_use = old; + end else begin + PC_to_use = real_PC; + end + end else if (stall_reg == 1'b1) begin + 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; + + assign out_instruction = stall ? 32'b0 : in_instruction; + assign out_valid = stall ? 1'b0 : 1'b1; + + + always @(*) begin + + if ((in_jal == 1'b1) && (delay_reg == 1'b0)) begin + temp_PC = in_jal_dest; + end else if ((in_branch_dir == 1'b1) && (delay_reg == 1'b0)) begin + temp_PC = in_branch_dest; + end else begin + temp_PC = PC_to_use; + end + + end + + assign out_PC = temp_PC; + + always @(*) begin + + if (in_jal == 1'b1) begin + temp_state = 5'h1; + end else if (in_branch_dir == 1'b1) begin + temp_state = 5'h2; + end else begin + temp_state = 5'h0; + end + end + + + + + + assign tempp_state = in_interrupt ? 5'h3 : temp_state; + + assign out_curr_PC = out_PC; + + + always @(posedge clk or posedge reset) begin + if(reset) begin + state <= 0; + stall_reg <= 0; + delay_reg <= 0; + old <= 0; + real_PC <= 0; + JAL_reg <= 0; + BR_reg <= 0; + prev_debug <= 0; + + end else begin + + if (in_debug == 1'b1) begin + state <= 5'h3; + end else begin + if (prev_debug == 1'b1) begin + state <= 5'h4; + end else begin + state <= tempp_state; + end + end + + stall_reg <= stall; + delay_reg <= delay || in_freeze; + old <= out_PC; + real_PC <= PC_to_use + 32'h4; + JAL_reg <= in_jal_dest + 32'h4; + BR_reg <= in_branch_dest + 32'h4; + prev_debug <= in_debug; + + end + end + + + + + + + +endmodule \ No newline at end of file diff --git a/rtl/VX_register_file.v b/rtl/VX_register_file.v new file mode 100644 index 00000000..0754d172 --- /dev/null +++ b/rtl/VX_register_file.v @@ -0,0 +1,40 @@ + + +module VX_register_file ( + input wire clk, + input wire in_write_register, + input wire[4:0] in_rd, + input wire[31:0] in_data, + 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 +); + + reg[31:0] registers[31:0]; + + wire[31:0] write_data; + + wire[4:0] write_register; + + wire write_enable; + + + + assign write_data = in_data; + assign write_register = in_rd; + + assign write_enable = in_write_register && (in_rd != 5'h0); + + always @(posedge clk) begin + if(write_enable) begin + registers[write_register] <= write_data; + end + end + + assign out_src1_data = registers[in_src1]; + assign out_src2_data = registers[in_src2]; + + +endmodule diff --git a/rtl/obj_dir/VVX_decode.cpp b/rtl/obj_dir/VVX_decode.cpp new file mode 100644 index 00000000..8cdd345f --- /dev/null +++ b/rtl/obj_dir/VVX_decode.cpp @@ -0,0 +1,975 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Design implementation internals +// See VVX_decode.h for the primary calling header + +#include "VVX_decode.h" +#include "VVX_decode__Syms.h" + + +//-------------------- +// STATIC VARIABLES + + +//-------------------- + +VL_CTOR_IMP(VVX_decode) { + VVX_decode__Syms* __restrict vlSymsp = __VlSymsp = new VVX_decode__Syms(this, name()); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Reset internal values + + // Reset structure values + _ctor_var_reset(); +} + +void VVX_decode::__Vconfigure(VVX_decode__Syms* vlSymsp, bool first) { + if (0 && first) {} // Prevent unused + this->__VlSymsp = vlSymsp; +} + +VVX_decode::~VVX_decode() { + delete __VlSymsp; __VlSymsp=NULL; +} + +//-------------------- + + +void VVX_decode::eval() { + VL_DEBUG_IF(VL_DBG_MSGF("+++++TOP Evaluate VVX_decode::eval\n"); ); + VVX_decode__Syms* __restrict vlSymsp = this->__VlSymsp; // Setup global symbol table + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +#ifdef VL_DEBUG + // Debug assertions + _eval_debug_assertions(); +#endif // VL_DEBUG + // Initialize + if (VL_UNLIKELY(!vlSymsp->__Vm_didInit)) _eval_initial_loop(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + VL_DEBUG_IF(VL_DBG_MSGF("+ Clock loop\n");); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +void VVX_decode::_eval_initial_loop(VVX_decode__Syms* __restrict vlSymsp) { + vlSymsp->__Vm_didInit = true; + _eval_initial(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + _eval_settle(vlSymsp); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't DC converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +//-------------------- +// Internal Methods + +VL_INLINE_OPT void VVX_decode::_combo__TOP__1(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_combo__TOP__1\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->out_PC_next = ((IData)(4U) + vlTOPp->in_curr_PC); + vlTOPp->out_mem_read = (7U & ((3U == (0x7fU & vlTOPp->in_instruction)) + ? (vlTOPp->in_instruction + >> 0xcU) : 7U)); + vlTOPp->out_mem_write = (7U & ((0x23U == (0x7fU + & vlTOPp->in_instruction)) + ? (vlTOPp->in_instruction + >> 0xcU) : 7U)); + // ALWAYS at VX_decode.v:247 + vlTOPp->out_jal = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + | ((0x67U == (0x7fU & vlTOPp->in_instruction)) + | ((0x73U == (0x7fU & vlTOPp->in_instruction)) + & ((0U == (7U & (vlTOPp->in_instruction + >> 0xcU))) + & (2U > (0xfffU & (vlTOPp->in_instruction + >> 0x14U))))))); + vlTOPp->out_csr_address = (0xfffU & (((0U != (7U + & (vlTOPp->in_instruction + >> 0xcU))) + & (2U <= + (0xfffU + & (vlTOPp->in_instruction + >> 0x14U)))) + ? (vlTOPp->in_instruction + >> 0x14U) + : 0x55U)); + // ALWAYS at VX_decode.v:306 + vlTOPp->out_branch_stall = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + | ((0x6fU == (0x7fU + & vlTOPp->in_instruction)) + | (0x67U == (0x7fU + & vlTOPp->in_instruction)))); + vlTOPp->out_rd = (0x1fU & (vlTOPp->in_instruction + >> 7U)); + // ALWAYS at VX_decode.v:306 + vlTOPp->out_branch_type = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + ? ((0x4000U & vlTOPp->in_instruction) + ? ((0x2000U & vlTOPp->in_instruction) + ? ((0x1000U + & vlTOPp->in_instruction) + ? 6U : 5U) + : ((0x1000U + & vlTOPp->in_instruction) + ? 4U : 3U)) + : ((0x2000U & vlTOPp->in_instruction) + ? 0U : ((0x1000U + & vlTOPp->in_instruction) + ? 2U + : 1U))) + : 0U); + vlTOPp->VX_decode__DOT__is_itype = ((0x13U == (0x7fU + & vlTOPp->in_instruction)) + | (3U == (0x7fU + & vlTOPp->in_instruction))); + vlTOPp->VX_decode__DOT__is_csr = ((0x73U == (0x7fU + & vlTOPp->in_instruction)) + & (0U != (7U + & (vlTOPp->in_instruction + >> 0xcU)))); + vlTOPp->out_rs1 = (0x1fU & (vlTOPp->in_instruction + >> 0xfU)); + vlTOPp->out_rs2 = (0x1fU & (vlTOPp->in_instruction + >> 0x14U)); + vlTOPp->out_rs2_src = (1U & (((IData)(vlTOPp->VX_decode__DOT__is_itype) + | (0x23U == (0x7fU + & vlTOPp->in_instruction))) + ? 1U : 0U)); + vlTOPp->out_is_csr = vlTOPp->VX_decode__DOT__is_csr; + vlTOPp->out_wb = ((((0x6fU == (0x7fU & vlTOPp->in_instruction)) + | (0x67U == (0x7fU & vlTOPp->in_instruction))) + | ((0x73U == (0x7fU & vlTOPp->in_instruction)) + & (0U == (7U & (vlTOPp->in_instruction + >> 0xcU))))) + ? 3U : ((3U == (0x7fU & vlTOPp->in_instruction)) + ? 2U : ((((((IData)(vlTOPp->VX_decode__DOT__is_itype) + | (0x33U + == (0x7fU + & vlTOPp->in_instruction))) + | (0x37U + == (0x7fU + & vlTOPp->in_instruction))) + | (0x17U + == (0x7fU + & vlTOPp->in_instruction))) + | (IData)(vlTOPp->VX_decode__DOT__is_csr)) + ? 1U : 0U))); + vlTOPp->out_alu_op = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + ? ((5U > (IData)(vlTOPp->out_branch_type)) + ? 1U : 0xaU) : ((0x37U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0xbU + : ( + (0x17U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0xcU + : + ((IData)(vlTOPp->VX_decode__DOT__is_csr) + ? + ((1U + == + (3U + & (vlTOPp->in_instruction + >> 0xcU))) + ? 0xdU + : + ((2U + == + (3U + & (vlTOPp->in_instruction + >> 0xcU))) + ? 0xeU + : 0xfU)) + : + (((0x23U + == + (0x7fU + & vlTOPp->in_instruction)) + | (3U + == + (0x7fU + & vlTOPp->in_instruction))) + ? 0U + : + ((0x4000U + & vlTOPp->in_instruction) + ? + ((0x2000U + & vlTOPp->in_instruction) + ? + ((0x1000U + & vlTOPp->in_instruction) + ? 9U + : 8U) + : + ((0x1000U + & vlTOPp->in_instruction) + ? + ((0U + == + (0x7fU + & (vlTOPp->in_instruction + >> 0x19U))) + ? 6U + : 7U) + : 5U)) + : + ((0x2000U + & vlTOPp->in_instruction) + ? + ((0x1000U + & vlTOPp->in_instruction) + ? 4U + : 3U) + : + ((0x1000U + & vlTOPp->in_instruction) + ? 2U + : + ((0x13U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0U + : + ((0U + == + (0x7fU + & (vlTOPp->in_instruction + >> 0x19U))) + ? 0U + : 1U)))))))))); + // ALWAYS at VX_decode.v:201 + vlTOPp->out_upper_immed = ((0x37U == (0x7fU & vlTOPp->in_instruction)) + ? ((0xfe000U & (vlTOPp->in_instruction + >> 0xcU)) + | (((IData)(vlTOPp->out_rs2) + << 8U) | (((IData)(vlTOPp->out_rs1) + << 3U) + | (7U + & (vlTOPp->in_instruction + >> 0xcU))))) + : ((0x17U == (0x7fU + & vlTOPp->in_instruction)) + ? ((0xfe000U & + (vlTOPp->in_instruction + >> 0xcU)) + | (((IData)(vlTOPp->out_rs2) + << 8U) | + (((IData)(vlTOPp->out_rs1) + << 3U) + | (7U & + (vlTOPp->in_instruction + >> 0xcU))))) + : 0U)); + vlTOPp->VX_decode__DOT__jalr_immed = ((0xfe0U & + (vlTOPp->in_instruction + >> 0x14U)) + | (IData)(vlTOPp->out_rs2)); + vlTOPp->VX_decode__DOT__alu_tempp = (0xfffU & ( + ((1U + == + (7U + & (vlTOPp->in_instruction + >> 0xcU))) + | (5U + == + (7U + & (vlTOPp->in_instruction + >> 0xcU)))) + ? (IData)(vlTOPp->out_rs2) + : + (vlTOPp->in_instruction + >> 0x14U))); + // ALWAYS at VX_decode.v:247 + vlTOPp->out_jal_offset = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + ? ((0xffe00000U & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0x15U)) + | ((0x100000U & (vlTOPp->in_instruction + >> 0xbU)) + | ((0xff000U & vlTOPp->in_instruction) + | ((0x800U + & (vlTOPp->in_instruction + >> 9U)) + | (0x7feU + & (vlTOPp->in_instruction + >> 0x14U)))))) + : ((0x67U == (0x7fU + & vlTOPp->in_instruction)) + ? ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & ((IData)(vlTOPp->VX_decode__DOT__jalr_immed) + >> 0xbU)))) + << 0xcU)) + | (IData)(vlTOPp->VX_decode__DOT__jalr_immed)) + : ((0x73U == (0x7fU + & vlTOPp->in_instruction)) + ? (((0U == (7U + & (vlTOPp->in_instruction + >> 0xcU))) + & (2U > + (0xfffU + & (vlTOPp->in_instruction + >> 0x14U)))) + ? 0xb0000000U + : 0xdeadbeefU) + : 0xdeadbeefU))); + // ALWAYS at VX_decode.v:295 + vlTOPp->out_itype_immed = ((0x40U & vlTOPp->in_instruction) + ? ((0x20U & vlTOPp->in_instruction) + ? ((0x10U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U + & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ( + (2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | ((0x800U + & (vlTOPp->in_instruction + >> 0x14U)) + | ((0x400U + & (vlTOPp->in_instruction + << 3U)) + | ((0x3f0U + & (vlTOPp->in_instruction + >> 0x15U)) + | (0xfU + & (vlTOPp->in_instruction + >> 8U)))))) + : 0xdeadbeefU) + : 0xdeadbeefU)))) + : 0xdeadbeefU) : + ((0x20U & vlTOPp->in_instruction) + ? ((0x10U & vlTOPp->in_instruction) + ? 0xdeadbeefU : + ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U & vlTOPp->in_instruction) + ? ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | ((0xfe0U + & (vlTOPp->in_instruction + >> 0x14U)) + | (IData)(vlTOPp->out_rd))) + : 0xdeadbeefU) + : 0xdeadbeefU)))) + : ((0x10U & vlTOPp->in_instruction) + ? ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & ((IData)(vlTOPp->VX_decode__DOT__alu_tempp) + >> 0xbU)))) + << 0xcU)) + | (IData)(vlTOPp->VX_decode__DOT__alu_tempp)) + : 0xdeadbeefU) + : 0xdeadbeefU))) + : ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | (0xfffU + & (vlTOPp->in_instruction + >> 0x14U))) + : 0xdeadbeefU) + : 0xdeadbeefU)))))); +} + +void VVX_decode::_settle__TOP__2(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_settle__TOP__2\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->out_PC_next = ((IData)(4U) + vlTOPp->in_curr_PC); + vlTOPp->out_mem_read = (7U & ((3U == (0x7fU & vlTOPp->in_instruction)) + ? (vlTOPp->in_instruction + >> 0xcU) : 7U)); + vlTOPp->out_mem_write = (7U & ((0x23U == (0x7fU + & vlTOPp->in_instruction)) + ? (vlTOPp->in_instruction + >> 0xcU) : 7U)); + // ALWAYS at VX_decode.v:247 + vlTOPp->out_jal = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + | ((0x67U == (0x7fU & vlTOPp->in_instruction)) + | ((0x73U == (0x7fU & vlTOPp->in_instruction)) + & ((0U == (7U & (vlTOPp->in_instruction + >> 0xcU))) + & (2U > (0xfffU & (vlTOPp->in_instruction + >> 0x14U))))))); + vlTOPp->out_csr_address = (0xfffU & (((0U != (7U + & (vlTOPp->in_instruction + >> 0xcU))) + & (2U <= + (0xfffU + & (vlTOPp->in_instruction + >> 0x14U)))) + ? (vlTOPp->in_instruction + >> 0x14U) + : 0x55U)); + // ALWAYS at VX_decode.v:306 + vlTOPp->out_branch_stall = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + | ((0x6fU == (0x7fU + & vlTOPp->in_instruction)) + | (0x67U == (0x7fU + & vlTOPp->in_instruction)))); + vlTOPp->out_rd = (0x1fU & (vlTOPp->in_instruction + >> 7U)); + // ALWAYS at VX_decode.v:306 + vlTOPp->out_branch_type = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + ? ((0x4000U & vlTOPp->in_instruction) + ? ((0x2000U & vlTOPp->in_instruction) + ? ((0x1000U + & vlTOPp->in_instruction) + ? 6U : 5U) + : ((0x1000U + & vlTOPp->in_instruction) + ? 4U : 3U)) + : ((0x2000U & vlTOPp->in_instruction) + ? 0U : ((0x1000U + & vlTOPp->in_instruction) + ? 2U + : 1U))) + : 0U); + vlTOPp->VX_decode__DOT__is_itype = ((0x13U == (0x7fU + & vlTOPp->in_instruction)) + | (3U == (0x7fU + & vlTOPp->in_instruction))); + vlTOPp->VX_decode__DOT__is_csr = ((0x73U == (0x7fU + & vlTOPp->in_instruction)) + & (0U != (7U + & (vlTOPp->in_instruction + >> 0xcU)))); + vlTOPp->out_rs1 = (0x1fU & (vlTOPp->in_instruction + >> 0xfU)); + vlTOPp->out_rs2 = (0x1fU & (vlTOPp->in_instruction + >> 0x14U)); + vlTOPp->out_rs2_src = (1U & (((IData)(vlTOPp->VX_decode__DOT__is_itype) + | (0x23U == (0x7fU + & vlTOPp->in_instruction))) + ? 1U : 0U)); + vlTOPp->out_is_csr = vlTOPp->VX_decode__DOT__is_csr; + vlTOPp->out_wb = ((((0x6fU == (0x7fU & vlTOPp->in_instruction)) + | (0x67U == (0x7fU & vlTOPp->in_instruction))) + | ((0x73U == (0x7fU & vlTOPp->in_instruction)) + & (0U == (7U & (vlTOPp->in_instruction + >> 0xcU))))) + ? 3U : ((3U == (0x7fU & vlTOPp->in_instruction)) + ? 2U : ((((((IData)(vlTOPp->VX_decode__DOT__is_itype) + | (0x33U + == (0x7fU + & vlTOPp->in_instruction))) + | (0x37U + == (0x7fU + & vlTOPp->in_instruction))) + | (0x17U + == (0x7fU + & vlTOPp->in_instruction))) + | (IData)(vlTOPp->VX_decode__DOT__is_csr)) + ? 1U : 0U))); + vlTOPp->out_alu_op = ((0x63U == (0x7fU & vlTOPp->in_instruction)) + ? ((5U > (IData)(vlTOPp->out_branch_type)) + ? 1U : 0xaU) : ((0x37U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0xbU + : ( + (0x17U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0xcU + : + ((IData)(vlTOPp->VX_decode__DOT__is_csr) + ? + ((1U + == + (3U + & (vlTOPp->in_instruction + >> 0xcU))) + ? 0xdU + : + ((2U + == + (3U + & (vlTOPp->in_instruction + >> 0xcU))) + ? 0xeU + : 0xfU)) + : + (((0x23U + == + (0x7fU + & vlTOPp->in_instruction)) + | (3U + == + (0x7fU + & vlTOPp->in_instruction))) + ? 0U + : + ((0x4000U + & vlTOPp->in_instruction) + ? + ((0x2000U + & vlTOPp->in_instruction) + ? + ((0x1000U + & vlTOPp->in_instruction) + ? 9U + : 8U) + : + ((0x1000U + & vlTOPp->in_instruction) + ? + ((0U + == + (0x7fU + & (vlTOPp->in_instruction + >> 0x19U))) + ? 6U + : 7U) + : 5U)) + : + ((0x2000U + & vlTOPp->in_instruction) + ? + ((0x1000U + & vlTOPp->in_instruction) + ? 4U + : 3U) + : + ((0x1000U + & vlTOPp->in_instruction) + ? 2U + : + ((0x13U + == + (0x7fU + & vlTOPp->in_instruction)) + ? 0U + : + ((0U + == + (0x7fU + & (vlTOPp->in_instruction + >> 0x19U))) + ? 0U + : 1U)))))))))); + vlTOPp->out_rd1 = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + ? vlTOPp->in_curr_PC : ((IData)(vlTOPp->in_src1_fwd) + ? vlTOPp->in_src1_fwd_data + : + vlTOPp->VX_decode__DOT__vx_register_file__DOT__registers + [vlTOPp->out_rs1])); + // ALWAYS at VX_decode.v:201 + vlTOPp->out_upper_immed = ((0x37U == (0x7fU & vlTOPp->in_instruction)) + ? ((0xfe000U & (vlTOPp->in_instruction + >> 0xcU)) + | (((IData)(vlTOPp->out_rs2) + << 8U) | (((IData)(vlTOPp->out_rs1) + << 3U) + | (7U + & (vlTOPp->in_instruction + >> 0xcU))))) + : ((0x17U == (0x7fU + & vlTOPp->in_instruction)) + ? ((0xfe000U & + (vlTOPp->in_instruction + >> 0xcU)) + | (((IData)(vlTOPp->out_rs2) + << 8U) | + (((IData)(vlTOPp->out_rs1) + << 3U) + | (7U & + (vlTOPp->in_instruction + >> 0xcU))))) + : 0U)); + vlTOPp->VX_decode__DOT__jalr_immed = ((0xfe0U & + (vlTOPp->in_instruction + >> 0x14U)) + | (IData)(vlTOPp->out_rs2)); + vlTOPp->VX_decode__DOT__alu_tempp = (0xfffU & ( + ((1U + == + (7U + & (vlTOPp->in_instruction + >> 0xcU))) + | (5U + == + (7U + & (vlTOPp->in_instruction + >> 0xcU)))) + ? (IData)(vlTOPp->out_rs2) + : + (vlTOPp->in_instruction + >> 0x14U))); + vlTOPp->out_rd2 = ((IData)(vlTOPp->in_src2_fwd) + ? vlTOPp->in_src2_fwd_data : + vlTOPp->VX_decode__DOT__vx_register_file__DOT__registers + [vlTOPp->out_rs2]); + vlTOPp->out_csr_mask = (((IData)(vlTOPp->VX_decode__DOT__is_csr) + & (vlTOPp->in_instruction + >> 0xeU)) ? (IData)(vlTOPp->out_rs1) + : vlTOPp->out_rd1); + // ALWAYS at VX_decode.v:247 + vlTOPp->out_jal_offset = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + ? ((0xffe00000U & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0x15U)) + | ((0x100000U & (vlTOPp->in_instruction + >> 0xbU)) + | ((0xff000U & vlTOPp->in_instruction) + | ((0x800U + & (vlTOPp->in_instruction + >> 9U)) + | (0x7feU + & (vlTOPp->in_instruction + >> 0x14U)))))) + : ((0x67U == (0x7fU + & vlTOPp->in_instruction)) + ? ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & ((IData)(vlTOPp->VX_decode__DOT__jalr_immed) + >> 0xbU)))) + << 0xcU)) + | (IData)(vlTOPp->VX_decode__DOT__jalr_immed)) + : ((0x73U == (0x7fU + & vlTOPp->in_instruction)) + ? (((0U == (7U + & (vlTOPp->in_instruction + >> 0xcU))) + & (2U > + (0xfffU + & (vlTOPp->in_instruction + >> 0x14U)))) + ? 0xb0000000U + : 0xdeadbeefU) + : 0xdeadbeefU))); + // ALWAYS at VX_decode.v:295 + vlTOPp->out_itype_immed = ((0x40U & vlTOPp->in_instruction) + ? ((0x20U & vlTOPp->in_instruction) + ? ((0x10U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U + & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ( + (2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | ((0x800U + & (vlTOPp->in_instruction + >> 0x14U)) + | ((0x400U + & (vlTOPp->in_instruction + << 3U)) + | ((0x3f0U + & (vlTOPp->in_instruction + >> 0x15U)) + | (0xfU + & (vlTOPp->in_instruction + >> 8U)))))) + : 0xdeadbeefU) + : 0xdeadbeefU)))) + : 0xdeadbeefU) : + ((0x20U & vlTOPp->in_instruction) + ? ((0x10U & vlTOPp->in_instruction) + ? 0xdeadbeefU : + ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U & vlTOPp->in_instruction) + ? ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | ((0xfe0U + & (vlTOPp->in_instruction + >> 0x14U)) + | (IData)(vlTOPp->out_rd))) + : 0xdeadbeefU) + : 0xdeadbeefU)))) + : ((0x10U & vlTOPp->in_instruction) + ? ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & ((IData)(vlTOPp->VX_decode__DOT__alu_tempp) + >> 0xbU)))) + << 0xcU)) + | (IData)(vlTOPp->VX_decode__DOT__alu_tempp)) + : 0xdeadbeefU) + : 0xdeadbeefU))) + : ((8U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((4U & vlTOPp->in_instruction) + ? 0xdeadbeefU + : ((2U + & vlTOPp->in_instruction) + ? + ((1U + & vlTOPp->in_instruction) + ? + ((0xfffff000U + & (VL_NEGATE_I((IData)( + (1U + & (vlTOPp->in_instruction + >> 0x1fU)))) + << 0xcU)) + | (0xfffU + & (vlTOPp->in_instruction + >> 0x14U))) + : 0xdeadbeefU) + : 0xdeadbeefU)))))); +} + +VL_INLINE_OPT void VVX_decode::_sequent__TOP__3(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_sequent__TOP__3\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Variables + // Begin mtask footprint all: + VL_SIG8(__Vdlyvdim0__VX_decode__DOT__vx_register_file__DOT__registers__v0,4,0); + VL_SIG8(__Vdlyvset__VX_decode__DOT__vx_register_file__DOT__registers__v0,0,0); + VL_SIG(__Vdlyvval__VX_decode__DOT__vx_register_file__DOT__registers__v0,31,0); + // Body + __Vdlyvset__VX_decode__DOT__vx_register_file__DOT__registers__v0 = 0U; + // ALWAYS at VX_register_file.v:30 + if (((0U != (IData)(vlTOPp->in_wb)) & (0U != (IData)(vlTOPp->in_rd)))) { + __Vdlyvval__VX_decode__DOT__vx_register_file__DOT__registers__v0 + = vlTOPp->in_write_data; + __Vdlyvset__VX_decode__DOT__vx_register_file__DOT__registers__v0 = 1U; + __Vdlyvdim0__VX_decode__DOT__vx_register_file__DOT__registers__v0 + = vlTOPp->in_rd; + } + // ALWAYSPOST at VX_register_file.v:32 + if (__Vdlyvset__VX_decode__DOT__vx_register_file__DOT__registers__v0) { + vlTOPp->VX_decode__DOT__vx_register_file__DOT__registers[__Vdlyvdim0__VX_decode__DOT__vx_register_file__DOT__registers__v0] + = __Vdlyvval__VX_decode__DOT__vx_register_file__DOT__registers__v0; + } +} + +VL_INLINE_OPT void VVX_decode::_combo__TOP__4(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_combo__TOP__4\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->out_rd2 = ((IData)(vlTOPp->in_src2_fwd) + ? vlTOPp->in_src2_fwd_data : + vlTOPp->VX_decode__DOT__vx_register_file__DOT__registers + [vlTOPp->out_rs2]); + vlTOPp->out_rd1 = ((0x6fU == (0x7fU & vlTOPp->in_instruction)) + ? vlTOPp->in_curr_PC : ((IData)(vlTOPp->in_src1_fwd) + ? vlTOPp->in_src1_fwd_data + : + vlTOPp->VX_decode__DOT__vx_register_file__DOT__registers + [vlTOPp->out_rs1])); + vlTOPp->out_csr_mask = (((IData)(vlTOPp->VX_decode__DOT__is_csr) + & (vlTOPp->in_instruction + >> 0xeU)) ? (IData)(vlTOPp->out_rs1) + : vlTOPp->out_rd1); +} + +void VVX_decode::_eval(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_eval\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->_combo__TOP__1(vlSymsp); + if (((IData)(vlTOPp->clk) & (~ (IData)(vlTOPp->__Vclklast__TOP__clk)))) { + vlTOPp->_sequent__TOP__3(vlSymsp); + } + vlTOPp->_combo__TOP__4(vlSymsp); + // Final + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; +} + +void VVX_decode::_eval_initial(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_eval_initial\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; +} + +void VVX_decode::final() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::final\n"); ); + // Variables + VVX_decode__Syms* __restrict vlSymsp = this->__VlSymsp; + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +} + +void VVX_decode::_eval_settle(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_eval_settle\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->_settle__TOP__2(vlSymsp); +} + +VL_INLINE_OPT QData VVX_decode::_change_request(VVX_decode__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_change_request\n"); ); + VVX_decode* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // Change detection + QData __req = false; // Logically a bool + return __req; +} + +#ifdef VL_DEBUG +void VVX_decode::_eval_debug_assertions() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_eval_debug_assertions\n"); ); + // Body + if (VL_UNLIKELY((clk & 0xfeU))) { + Verilated::overWidthError("clk");} + if (VL_UNLIKELY((in_rd & 0xe0U))) { + Verilated::overWidthError("in_rd");} + if (VL_UNLIKELY((in_wb & 0xfcU))) { + Verilated::overWidthError("in_wb");} + if (VL_UNLIKELY((in_src1_fwd & 0xfeU))) { + Verilated::overWidthError("in_src1_fwd");} + if (VL_UNLIKELY((in_src2_fwd & 0xfeU))) { + Verilated::overWidthError("in_src2_fwd");} +} +#endif // VL_DEBUG + +void VVX_decode::_ctor_var_reset() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_decode::_ctor_var_reset\n"); ); + // Body + clk = VL_RAND_RESET_I(1); + in_instruction = VL_RAND_RESET_I(32); + in_curr_PC = VL_RAND_RESET_I(32); + in_write_data = VL_RAND_RESET_I(32); + in_rd = VL_RAND_RESET_I(5); + in_wb = VL_RAND_RESET_I(2); + in_src1_fwd = VL_RAND_RESET_I(1); + in_src1_fwd_data = VL_RAND_RESET_I(32); + in_src2_fwd = VL_RAND_RESET_I(1); + in_src2_fwd_data = VL_RAND_RESET_I(32); + out_csr_address = VL_RAND_RESET_I(12); + out_is_csr = VL_RAND_RESET_I(1); + out_csr_mask = VL_RAND_RESET_I(32); + out_rd = VL_RAND_RESET_I(5); + out_rs1 = VL_RAND_RESET_I(5); + out_rd1 = VL_RAND_RESET_I(32); + out_rs2 = VL_RAND_RESET_I(5); + out_rd2 = VL_RAND_RESET_I(32); + out_wb = VL_RAND_RESET_I(2); + out_alu_op = VL_RAND_RESET_I(4); + out_rs2_src = VL_RAND_RESET_I(1); + out_itype_immed = VL_RAND_RESET_I(32); + out_mem_read = VL_RAND_RESET_I(3); + out_mem_write = VL_RAND_RESET_I(3); + out_branch_type = VL_RAND_RESET_I(3); + out_branch_stall = VL_RAND_RESET_I(1); + out_jal = VL_RAND_RESET_I(1); + out_jal_offset = VL_RAND_RESET_I(32); + out_upper_immed = VL_RAND_RESET_I(20); + out_PC_next = VL_RAND_RESET_I(32); + VX_decode__DOT__is_itype = VL_RAND_RESET_I(1); + VX_decode__DOT__is_csr = VL_RAND_RESET_I(1); + VX_decode__DOT__jalr_immed = VL_RAND_RESET_I(12); + VX_decode__DOT__alu_tempp = VL_RAND_RESET_I(12); + { int __Vi0=0; for (; __Vi0<32; ++__Vi0) { + VX_decode__DOT__vx_register_file__DOT__registers[__Vi0] = VL_RAND_RESET_I(32); + }} +} diff --git a/rtl/obj_dir/VVX_decode.h b/rtl/obj_dir/VVX_decode.h new file mode 100644 index 00000000..b439480b --- /dev/null +++ b/rtl/obj_dir/VVX_decode.h @@ -0,0 +1,118 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Primary design header +// +// This header should be included by all source files instantiating the design. +// The class here is then constructed to instantiate the design. +// See the Verilator manual for examples. + +#ifndef _VVX_decode_H_ +#define _VVX_decode_H_ + +#include "verilated.h" + +class VVX_decode__Syms; + +//---------- + +VL_MODULE(VVX_decode) { + public: + + // PORTS + // The application code writes and reads these signals to + // propagate new values into/out from the Verilated model. + // Begin mtask footprint all: + VL_IN8(clk,0,0); + VL_IN8(in_rd,4,0); + VL_IN8(in_wb,1,0); + VL_IN8(in_src1_fwd,0,0); + VL_IN8(in_src2_fwd,0,0); + VL_OUT8(out_is_csr,0,0); + VL_OUT8(out_rd,4,0); + VL_OUT8(out_rs1,4,0); + VL_OUT8(out_rs2,4,0); + VL_OUT8(out_wb,1,0); + VL_OUT8(out_alu_op,3,0); + VL_OUT8(out_rs2_src,0,0); + VL_OUT8(out_mem_read,2,0); + VL_OUT8(out_mem_write,2,0); + VL_OUT8(out_branch_type,2,0); + VL_OUT8(out_branch_stall,0,0); + VL_OUT8(out_jal,0,0); + VL_OUT16(out_csr_address,11,0); + VL_IN(in_instruction,31,0); + VL_IN(in_curr_PC,31,0); + VL_IN(in_write_data,31,0); + VL_IN(in_src1_fwd_data,31,0); + VL_IN(in_src2_fwd_data,31,0); + VL_OUT(out_csr_mask,31,0); + VL_OUT(out_rd1,31,0); + VL_OUT(out_rd2,31,0); + VL_OUT(out_itype_immed,31,0); + VL_OUT(out_jal_offset,31,0); + VL_OUT(out_upper_immed,19,0); + VL_OUT(out_PC_next,31,0); + + // LOCAL SIGNALS + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG8(VX_decode__DOT__is_itype,0,0); + VL_SIG8(VX_decode__DOT__is_csr,0,0); + VL_SIG16(VX_decode__DOT__jalr_immed,11,0); + VL_SIG16(VX_decode__DOT__alu_tempp,11,0); + VL_SIG(VX_decode__DOT__vx_register_file__DOT__registers[32],31,0); + + // LOCAL VARIABLES + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG8(__Vclklast__TOP__clk,0,0); + + // INTERNAL VARIABLES + // Internals; generally not touched by application code + VVX_decode__Syms* __VlSymsp; // Symbol table + + // PARAMETERS + // Parameters marked /*verilator public*/ for use by application code + + // CONSTRUCTORS + private: + VL_UNCOPYABLE(VVX_decode); ///< Copying not allowed + public: + /// Construct the model; called by application code + /// The special name may be used to make a wrapper with a + /// single model invisible with respect to DPI scope names. + VVX_decode(const char* name="TOP"); + /// Destroy the model; called (often implicitly) by application code + ~VVX_decode(); + + // API METHODS + /// Evaluate the model. Application must call when inputs change. + void eval(); + /// Simulation complete, run final blocks. Application must call on completion. + void final(); + + // INTERNAL METHODS + private: + static void _eval_initial_loop(VVX_decode__Syms* __restrict vlSymsp); + public: + void __Vconfigure(VVX_decode__Syms* symsp, bool first); + private: + static QData _change_request(VVX_decode__Syms* __restrict vlSymsp); + public: + static void _combo__TOP__1(VVX_decode__Syms* __restrict vlSymsp); + static void _combo__TOP__4(VVX_decode__Syms* __restrict vlSymsp); + private: + void _ctor_var_reset(); + public: + static void _eval(VVX_decode__Syms* __restrict vlSymsp); + private: +#ifdef VL_DEBUG + void _eval_debug_assertions(); +#endif // VL_DEBUG + public: + static void _eval_initial(VVX_decode__Syms* __restrict vlSymsp); + static void _eval_settle(VVX_decode__Syms* __restrict vlSymsp); + static void _sequent__TOP__3(VVX_decode__Syms* __restrict vlSymsp); + static void _settle__TOP__2(VVX_decode__Syms* __restrict vlSymsp); +} VL_ATTR_ALIGNED(128); + +#endif // guard diff --git a/rtl/obj_dir/VVX_decode.mk b/rtl/obj_dir/VVX_decode.mk new file mode 100644 index 00000000..2cf73106 --- /dev/null +++ b/rtl/obj_dir/VVX_decode.mk @@ -0,0 +1,53 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Makefile for building Verilated archive or executable +# +# Execute this makefile from the object directory: +# make -f VVX_decode.mk + +default: VVX_decode__ALL.a + +### Constants... +# Perl executable (from $PERL) +PERL = perl +# Path to Verilator kit (from $VERILATOR_ROOT) +VERILATOR_ROOT = /usr/local/Cellar/verilator/4.010/share/verilator +# SystemC include directory with systemc.h (from $SYSTEMC_INCLUDE) +SYSTEMC_INCLUDE ?= +# SystemC library directory with libsystemc.a (from $SYSTEMC_LIBDIR) +SYSTEMC_LIBDIR ?= + +### Switches... +# SystemC output mode? 0/1 (from --sc) +VM_SC = 0 +# Legacy or SystemC output mode? 0/1 (from --sc) +VM_SP_OR_SC = $(VM_SC) +# Deprecated +VM_PCLI = 1 +# Deprecated: SystemC architecture to find link library path (from $SYSTEMC_ARCH) +VM_SC_TARGET_ARCH = linux + +### Vars... +# Design prefix (from --prefix) +VM_PREFIX = VVX_decode +# Module prefix (from --prefix) +VM_MODPREFIX = VVX_decode +# User CFLAGS (from -CFLAGS on Verilator command line) +VM_USER_CFLAGS = \ + +# User LDLIBS (from -LDFLAGS on Verilator command line) +VM_USER_LDLIBS = \ + +# User .cpp files (from .cpp's on Verilator command line) +VM_USER_CLASSES = \ + +# User .cpp directories (from .cpp's on Verilator command line) +VM_USER_DIR = \ + + +### Default rules... +# Include list of all generated classes +include VVX_decode_classes.mk +# Include global rules +include $(VERILATOR_ROOT)/include/verilated.mk + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/VVX_decode__Syms.cpp b/rtl/obj_dir/VVX_decode__Syms.cpp new file mode 100644 index 00000000..e53318ee --- /dev/null +++ b/rtl/obj_dir/VVX_decode__Syms.cpp @@ -0,0 +1,19 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table implementation internals + +#include "VVX_decode__Syms.h" +#include "VVX_decode.h" + +// FUNCTIONS +VVX_decode__Syms::VVX_decode__Syms(VVX_decode* topp, const char* namep) + // Setup locals + : __Vm_namep(namep) + , __Vm_didInit(false) + // Setup submodule names +{ + // Pointer to top level + TOPp = topp; + // Setup each module's pointers to their submodules + // Setup each module's pointer back to symbol table (for public functions) + TOPp->__Vconfigure(this, true); +} diff --git a/rtl/obj_dir/VVX_decode__Syms.h b/rtl/obj_dir/VVX_decode__Syms.h new file mode 100644 index 00000000..cc253e91 --- /dev/null +++ b/rtl/obj_dir/VVX_decode__Syms.h @@ -0,0 +1,34 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table internal header +// +// Internal details; most calling programs do not need this header + +#ifndef _VVX_decode__Syms_H_ +#define _VVX_decode__Syms_H_ + +#include "verilated.h" + +// INCLUDE MODULE CLASSES +#include "VVX_decode.h" + +// SYMS CLASS +class VVX_decode__Syms : public VerilatedSyms { + public: + + // LOCAL STATE + const char* __Vm_namep; + bool __Vm_didInit; + + // SUBCELL STATE + VVX_decode* TOPp; + + // CREATORS + VVX_decode__Syms(VVX_decode* topp, const char* namep); + ~VVX_decode__Syms() {} + + // METHODS + inline const char* name() { return __Vm_namep; } + +} VL_ATTR_ALIGNED(64); + +#endif // guard diff --git a/rtl/obj_dir/VVX_decode__ver.d b/rtl/obj_dir/VVX_decode__ver.d new file mode 100644 index 00000000..74c6bceb --- /dev/null +++ b/rtl/obj_dir/VVX_decode__ver.d @@ -0,0 +1 @@ +obj_dir/VVX_decode.cpp obj_dir/VVX_decode.h obj_dir/VVX_decode.mk obj_dir/VVX_decode__Syms.cpp obj_dir/VVX_decode__Syms.h obj_dir/VVX_decode__ver.d obj_dir/VVX_decode_classes.mk : /usr/local/Cellar/verilator/4.010/bin/verilator_bin /usr/local/Cellar/verilator/4.010/bin/verilator_bin VX_decode.v VX_register_file.v diff --git a/rtl/obj_dir/VVX_decode__verFiles.dat b/rtl/obj_dir/VVX_decode__verFiles.dat new file mode 100644 index 00000000..ebf887f0 --- /dev/null +++ b/rtl/obj_dir/VVX_decode__verFiles.dat @@ -0,0 +1,13 @@ +# DESCRIPTION: Verilator output: Timestamp data for --skip-identical. Delete at will. +C "-Wall -cc VX_decode.v VX_register_file.v" +S 4608404 12889046060 1553037052 0 1548678579 0 "/usr/local/Cellar/verilator/4.010/bin/verilator_bin" +S 9277 12889063385 1553149232 0 1553149232 0 "VX_decode.v" +S 726 12889070228 1553138880 0 1553138880 0 "VX_register_file.v" +T 30372 12889070221 1553149234 0 1553149234 0 "obj_dir/VVX_decode.cpp" +T 3820 12889070220 1553149234 0 1553149234 0 "obj_dir/VVX_decode.h" +T 1476 12889070223 1553149234 0 1553149234 0 "obj_dir/VVX_decode.mk" +T 545 12889070219 1553149234 0 1553149234 0 "obj_dir/VVX_decode__Syms.cpp" +T 732 12889070218 1553149234 0 1553149234 0 "obj_dir/VVX_decode__Syms.h" +T 319 12889070301 1553149234 0 1553149234 0 "obj_dir/VVX_decode__ver.d" +T 0 0 1553149234 0 1553149234 0 "obj_dir/VVX_decode__verFiles.dat" +T 1168 12889070222 1553149234 0 1553149234 0 "obj_dir/VVX_decode_classes.mk" diff --git a/rtl/obj_dir/VVX_decode_classes.mk b/rtl/obj_dir/VVX_decode_classes.mk new file mode 100644 index 00000000..d4f4e2bf --- /dev/null +++ b/rtl/obj_dir/VVX_decode_classes.mk @@ -0,0 +1,38 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Make include file with class lists +# +# This file lists generated Verilated files, for including in higher level makefiles. +# See VVX_decode.mk for the caller. + +### Switches... +# Coverage output mode? 0/1 (from --coverage) +VM_COVERAGE = 0 +# Threaded output mode? 0/1/N threads (from --threads) +VM_THREADS = 0 +# Tracing output mode? 0/1 (from --trace) +VM_TRACE = 0 + +### Object file lists... +# Generated module classes, fast-path, compile with highest optimization +VM_CLASSES_FAST += \ + VVX_decode \ + +# Generated module classes, non-fast-path, compile with low/medium optimization +VM_CLASSES_SLOW += \ + +# Generated support classes, fast-path, compile with highest optimization +VM_SUPPORT_FAST += \ + +# Generated support classes, non-fast-path, compile with low/medium optimization +VM_SUPPORT_SLOW += \ + VVX_decode__Syms \ + +# Global classes, need linked once per executable, fast-path, compile with highest optimization +VM_GLOBAL_FAST += \ + verilated \ + +# Global classes, need linked once per executable, non-fast-path, compile with low/medium optimization +VM_GLOBAL_SLOW += \ + + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/VVX_register_file.cpp b/rtl/obj_dir/VVX_register_file.cpp new file mode 100644 index 00000000..917863e8 --- /dev/null +++ b/rtl/obj_dir/VVX_register_file.cpp @@ -0,0 +1,200 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Design implementation internals +// See VVX_register_file.h for the primary calling header + +#include "VVX_register_file.h" +#include "VVX_register_file__Syms.h" + + +//-------------------- +// STATIC VARIABLES + + +//-------------------- + +VL_CTOR_IMP(VVX_register_file) { + VVX_register_file__Syms* __restrict vlSymsp = __VlSymsp = new VVX_register_file__Syms(this, name()); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Reset internal values + + // Reset structure values + _ctor_var_reset(); +} + +void VVX_register_file::__Vconfigure(VVX_register_file__Syms* vlSymsp, bool first) { + if (0 && first) {} // Prevent unused + this->__VlSymsp = vlSymsp; +} + +VVX_register_file::~VVX_register_file() { + delete __VlSymsp; __VlSymsp=NULL; +} + +//-------------------- + + +void VVX_register_file::eval() { + VL_DEBUG_IF(VL_DBG_MSGF("+++++TOP Evaluate VVX_register_file::eval\n"); ); + VVX_register_file__Syms* __restrict vlSymsp = this->__VlSymsp; // Setup global symbol table + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +#ifdef VL_DEBUG + // Debug assertions + _eval_debug_assertions(); +#endif // VL_DEBUG + // Initialize + if (VL_UNLIKELY(!vlSymsp->__Vm_didInit)) _eval_initial_loop(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + VL_DEBUG_IF(VL_DBG_MSGF("+ Clock loop\n");); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +void VVX_register_file::_eval_initial_loop(VVX_register_file__Syms* __restrict vlSymsp) { + vlSymsp->__Vm_didInit = true; + _eval_initial(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + _eval_settle(vlSymsp); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't DC converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +//-------------------- +// Internal Methods + +VL_INLINE_OPT void VVX_register_file::_sequent__TOP__1(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_sequent__TOP__1\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Variables + // Begin mtask footprint all: + VL_SIG8(__Vdlyvdim0__VX_register_file__DOT__registers__v0,4,0); + VL_SIG8(__Vdlyvset__VX_register_file__DOT__registers__v0,0,0); + VL_SIG(__Vdlyvval__VX_register_file__DOT__registers__v0,31,0); + // Body + __Vdlyvset__VX_register_file__DOT__registers__v0 = 0U; + // ALWAYS at VX_register_file.v:30 + if (((IData)(vlTOPp->in_write_register) & (0U != (IData)(vlTOPp->in_rd)))) { + __Vdlyvval__VX_register_file__DOT__registers__v0 + = vlTOPp->in_data; + __Vdlyvset__VX_register_file__DOT__registers__v0 = 1U; + __Vdlyvdim0__VX_register_file__DOT__registers__v0 + = vlTOPp->in_rd; + } + // ALWAYSPOST at VX_register_file.v:32 + if (__Vdlyvset__VX_register_file__DOT__registers__v0) { + vlTOPp->VX_register_file__DOT__registers[__Vdlyvdim0__VX_register_file__DOT__registers__v0] + = __Vdlyvval__VX_register_file__DOT__registers__v0; + } +} + +VL_INLINE_OPT void VVX_register_file::_settle__TOP__2(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_settle__TOP__2\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->out_src1_data = vlTOPp->VX_register_file__DOT__registers + [vlTOPp->in_src1]; + vlTOPp->out_src2_data = vlTOPp->VX_register_file__DOT__registers + [vlTOPp->in_src2]; +} + +void VVX_register_file::_eval(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_eval\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + if (((IData)(vlTOPp->clk) & (~ (IData)(vlTOPp->__Vclklast__TOP__clk)))) { + vlTOPp->_sequent__TOP__1(vlSymsp); + } + vlTOPp->_settle__TOP__2(vlSymsp); + // Final + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; +} + +void VVX_register_file::_eval_initial(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_eval_initial\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; +} + +void VVX_register_file::final() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::final\n"); ); + // Variables + VVX_register_file__Syms* __restrict vlSymsp = this->__VlSymsp; + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +} + +void VVX_register_file::_eval_settle(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_eval_settle\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->_settle__TOP__2(vlSymsp); +} + +VL_INLINE_OPT QData VVX_register_file::_change_request(VVX_register_file__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_change_request\n"); ); + VVX_register_file* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // Change detection + QData __req = false; // Logically a bool + return __req; +} + +#ifdef VL_DEBUG +void VVX_register_file::_eval_debug_assertions() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_eval_debug_assertions\n"); ); + // Body + if (VL_UNLIKELY((clk & 0xfeU))) { + Verilated::overWidthError("clk");} + if (VL_UNLIKELY((in_write_register & 0xfeU))) { + Verilated::overWidthError("in_write_register");} + if (VL_UNLIKELY((in_rd & 0xe0U))) { + Verilated::overWidthError("in_rd");} + if (VL_UNLIKELY((in_src1 & 0xe0U))) { + Verilated::overWidthError("in_src1");} + if (VL_UNLIKELY((in_src2 & 0xe0U))) { + Verilated::overWidthError("in_src2");} +} +#endif // VL_DEBUG + +void VVX_register_file::_ctor_var_reset() { + VL_DEBUG_IF(VL_DBG_MSGF("+ VVX_register_file::_ctor_var_reset\n"); ); + // Body + clk = VL_RAND_RESET_I(1); + in_write_register = VL_RAND_RESET_I(1); + in_rd = VL_RAND_RESET_I(5); + in_data = VL_RAND_RESET_I(32); + in_src1 = VL_RAND_RESET_I(5); + in_src2 = VL_RAND_RESET_I(5); + out_src1_data = VL_RAND_RESET_I(32); + out_src2_data = VL_RAND_RESET_I(32); + { int __Vi0=0; for (; __Vi0<32; ++__Vi0) { + VX_register_file__DOT__registers[__Vi0] = VL_RAND_RESET_I(32); + }} +} diff --git a/rtl/obj_dir/VVX_register_file.h b/rtl/obj_dir/VVX_register_file.h new file mode 100644 index 00000000..4a73c470 --- /dev/null +++ b/rtl/obj_dir/VVX_register_file.h @@ -0,0 +1,88 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Primary design header +// +// This header should be included by all source files instantiating the design. +// The class here is then constructed to instantiate the design. +// See the Verilator manual for examples. + +#ifndef _VVX_register_file_H_ +#define _VVX_register_file_H_ + +#include "verilated.h" + +class VVX_register_file__Syms; + +//---------- + +VL_MODULE(VVX_register_file) { + public: + + // PORTS + // The application code writes and reads these signals to + // propagate new values into/out from the Verilated model. + // Begin mtask footprint all: + VL_IN8(clk,0,0); + VL_IN8(in_write_register,0,0); + VL_IN8(in_rd,4,0); + VL_IN8(in_src1,4,0); + VL_IN8(in_src2,4,0); + VL_IN(in_data,31,0); + VL_OUT(out_src1_data,31,0); + VL_OUT(out_src2_data,31,0); + + // LOCAL SIGNALS + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG(VX_register_file__DOT__registers[32],31,0); + + // LOCAL VARIABLES + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG8(__Vclklast__TOP__clk,0,0); + + // INTERNAL VARIABLES + // Internals; generally not touched by application code + VVX_register_file__Syms* __VlSymsp; // Symbol table + + // PARAMETERS + // Parameters marked /*verilator public*/ for use by application code + + // CONSTRUCTORS + private: + VL_UNCOPYABLE(VVX_register_file); ///< Copying not allowed + public: + /// Construct the model; called by application code + /// The special name may be used to make a wrapper with a + /// single model invisible with respect to DPI scope names. + VVX_register_file(const char* name="TOP"); + /// Destroy the model; called (often implicitly) by application code + ~VVX_register_file(); + + // API METHODS + /// Evaluate the model. Application must call when inputs change. + void eval(); + /// Simulation complete, run final blocks. Application must call on completion. + void final(); + + // INTERNAL METHODS + private: + static void _eval_initial_loop(VVX_register_file__Syms* __restrict vlSymsp); + public: + void __Vconfigure(VVX_register_file__Syms* symsp, bool first); + private: + static QData _change_request(VVX_register_file__Syms* __restrict vlSymsp); + void _ctor_var_reset(); + public: + static void _eval(VVX_register_file__Syms* __restrict vlSymsp); + private: +#ifdef VL_DEBUG + void _eval_debug_assertions(); +#endif // VL_DEBUG + public: + static void _eval_initial(VVX_register_file__Syms* __restrict vlSymsp); + static void _eval_settle(VVX_register_file__Syms* __restrict vlSymsp); + static void _sequent__TOP__1(VVX_register_file__Syms* __restrict vlSymsp); + static void _settle__TOP__2(VVX_register_file__Syms* __restrict vlSymsp); +} VL_ATTR_ALIGNED(128); + +#endif // guard diff --git a/rtl/obj_dir/VVX_register_file.mk b/rtl/obj_dir/VVX_register_file.mk new file mode 100644 index 00000000..9582c9dd --- /dev/null +++ b/rtl/obj_dir/VVX_register_file.mk @@ -0,0 +1,53 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Makefile for building Verilated archive or executable +# +# Execute this makefile from the object directory: +# make -f VVX_register_file.mk + +default: VVX_register_file__ALL.a + +### Constants... +# Perl executable (from $PERL) +PERL = perl +# Path to Verilator kit (from $VERILATOR_ROOT) +VERILATOR_ROOT = /usr/local/Cellar/verilator/4.010/share/verilator +# SystemC include directory with systemc.h (from $SYSTEMC_INCLUDE) +SYSTEMC_INCLUDE ?= +# SystemC library directory with libsystemc.a (from $SYSTEMC_LIBDIR) +SYSTEMC_LIBDIR ?= + +### Switches... +# SystemC output mode? 0/1 (from --sc) +VM_SC = 0 +# Legacy or SystemC output mode? 0/1 (from --sc) +VM_SP_OR_SC = $(VM_SC) +# Deprecated +VM_PCLI = 1 +# Deprecated: SystemC architecture to find link library path (from $SYSTEMC_ARCH) +VM_SC_TARGET_ARCH = linux + +### Vars... +# Design prefix (from --prefix) +VM_PREFIX = VVX_register_file +# Module prefix (from --prefix) +VM_MODPREFIX = VVX_register_file +# User CFLAGS (from -CFLAGS on Verilator command line) +VM_USER_CFLAGS = \ + +# User LDLIBS (from -LDFLAGS on Verilator command line) +VM_USER_LDLIBS = \ + +# User .cpp files (from .cpp's on Verilator command line) +VM_USER_CLASSES = \ + +# User .cpp directories (from .cpp's on Verilator command line) +VM_USER_DIR = \ + + +### Default rules... +# Include list of all generated classes +include VVX_register_file_classes.mk +# Include global rules +include $(VERILATOR_ROOT)/include/verilated.mk + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/VVX_register_file__Syms.cpp b/rtl/obj_dir/VVX_register_file__Syms.cpp new file mode 100644 index 00000000..7e308ad4 --- /dev/null +++ b/rtl/obj_dir/VVX_register_file__Syms.cpp @@ -0,0 +1,19 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table implementation internals + +#include "VVX_register_file__Syms.h" +#include "VVX_register_file.h" + +// FUNCTIONS +VVX_register_file__Syms::VVX_register_file__Syms(VVX_register_file* topp, const char* namep) + // Setup locals + : __Vm_namep(namep) + , __Vm_didInit(false) + // Setup submodule names +{ + // Pointer to top level + TOPp = topp; + // Setup each module's pointers to their submodules + // Setup each module's pointer back to symbol table (for public functions) + TOPp->__Vconfigure(this, true); +} diff --git a/rtl/obj_dir/VVX_register_file__Syms.h b/rtl/obj_dir/VVX_register_file__Syms.h new file mode 100644 index 00000000..5a894634 --- /dev/null +++ b/rtl/obj_dir/VVX_register_file__Syms.h @@ -0,0 +1,34 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table internal header +// +// Internal details; most calling programs do not need this header + +#ifndef _VVX_register_file__Syms_H_ +#define _VVX_register_file__Syms_H_ + +#include "verilated.h" + +// INCLUDE MODULE CLASSES +#include "VVX_register_file.h" + +// SYMS CLASS +class VVX_register_file__Syms : public VerilatedSyms { + public: + + // LOCAL STATE + const char* __Vm_namep; + bool __Vm_didInit; + + // SUBCELL STATE + VVX_register_file* TOPp; + + // CREATORS + VVX_register_file__Syms(VVX_register_file* topp, const char* namep); + ~VVX_register_file__Syms() {} + + // METHODS + inline const char* name() { return __Vm_namep; } + +} VL_ATTR_ALIGNED(64); + +#endif // guard diff --git a/rtl/obj_dir/VVX_register_file__ver.d b/rtl/obj_dir/VVX_register_file__ver.d new file mode 100644 index 00000000..22986176 --- /dev/null +++ b/rtl/obj_dir/VVX_register_file__ver.d @@ -0,0 +1 @@ +obj_dir/VVX_register_file.cpp obj_dir/VVX_register_file.h obj_dir/VVX_register_file.mk obj_dir/VVX_register_file__Syms.cpp obj_dir/VVX_register_file__Syms.h obj_dir/VVX_register_file__ver.d obj_dir/VVX_register_file_classes.mk : /usr/local/Cellar/verilator/4.010/bin/verilator_bin /usr/local/Cellar/verilator/4.010/bin/verilator_bin VX_register_file.v diff --git a/rtl/obj_dir/VVX_register_file__verFiles.dat b/rtl/obj_dir/VVX_register_file__verFiles.dat new file mode 100644 index 00000000..cf49288e --- /dev/null +++ b/rtl/obj_dir/VVX_register_file__verFiles.dat @@ -0,0 +1,12 @@ +# DESCRIPTION: Verilator output: Timestamp data for --skip-identical. Delete at will. +C "-Wall -cc VX_register_file.v" +S 4608404 12889046060 1553037052 0 1548678579 0 "/usr/local/Cellar/verilator/4.010/bin/verilator_bin" +S 726 12889070228 1553138880 0 1553138880 0 "VX_register_file.v" +T 7234 12889070262 1553138884 0 1553138884 0 "obj_dir/VVX_register_file.cpp" +T 2914 12889070261 1553138884 0 1553138884 0 "obj_dir/VVX_register_file.h" +T 1511 12889070264 1553138884 0 1553138884 0 "obj_dir/VVX_register_file.mk" +T 580 12889070260 1553138884 0 1553138884 0 "obj_dir/VVX_register_file__Syms.cpp" +T 781 12889070259 1553138884 0 1553138884 0 "obj_dir/VVX_register_file__Syms.h" +T 356 12889070265 1553138884 0 1553138884 0 "obj_dir/VVX_register_file__ver.d" +T 0 0 1553138884 0 1553138884 0 "obj_dir/VVX_register_file__verFiles.dat" +T 1189 12889070263 1553138884 0 1553138884 0 "obj_dir/VVX_register_file_classes.mk" diff --git a/rtl/obj_dir/VVX_register_file_classes.mk b/rtl/obj_dir/VVX_register_file_classes.mk new file mode 100644 index 00000000..b22b228d --- /dev/null +++ b/rtl/obj_dir/VVX_register_file_classes.mk @@ -0,0 +1,38 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Make include file with class lists +# +# This file lists generated Verilated files, for including in higher level makefiles. +# See VVX_register_file.mk for the caller. + +### Switches... +# Coverage output mode? 0/1 (from --coverage) +VM_COVERAGE = 0 +# Threaded output mode? 0/1/N threads (from --threads) +VM_THREADS = 0 +# Tracing output mode? 0/1 (from --trace) +VM_TRACE = 0 + +### Object file lists... +# Generated module classes, fast-path, compile with highest optimization +VM_CLASSES_FAST += \ + VVX_register_file \ + +# Generated module classes, non-fast-path, compile with low/medium optimization +VM_CLASSES_SLOW += \ + +# Generated support classes, fast-path, compile with highest optimization +VM_SUPPORT_FAST += \ + +# Generated support classes, non-fast-path, compile with low/medium optimization +VM_SUPPORT_SLOW += \ + VVX_register_file__Syms \ + +# Global classes, need linked once per executable, fast-path, compile with highest optimization +VM_GLOBAL_FAST += \ + verilated \ + +# Global classes, need linked once per executable, non-fast-path, compile with low/medium optimization +VM_GLOBAL_SLOW += \ + + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/Vvortex b/rtl/obj_dir/Vvortex new file mode 100755 index 0000000000000000000000000000000000000000..ddd33aa946ea41843a910072a33af3c9cef5d672 GIT binary patch literal 277588 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�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 + // Reset internal values + + // Reset structure values + _ctor_var_reset(); +} + +void Vvortex::__Vconfigure(Vvortex__Syms* vlSymsp, bool first) { + if (0 && first) {} // Prevent unused + this->__VlSymsp = vlSymsp; +} + +Vvortex::~Vvortex() { + delete __VlSymsp; __VlSymsp=NULL; +} + +//-------------------- + + +void Vvortex::eval() { + VL_DEBUG_IF(VL_DBG_MSGF("+++++TOP Evaluate Vvortex::eval\n"); ); + Vvortex__Syms* __restrict vlSymsp = this->__VlSymsp; // Setup global symbol table + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +#ifdef VL_DEBUG + // Debug assertions + _eval_debug_assertions(); +#endif // VL_DEBUG + // Initialize + if (VL_UNLIKELY(!vlSymsp->__Vm_didInit)) _eval_initial_loop(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + VL_DEBUG_IF(VL_DBG_MSGF("+ Clock loop\n");); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +void Vvortex::_eval_initial_loop(Vvortex__Syms* __restrict vlSymsp) { + vlSymsp->__Vm_didInit = true; + _eval_initial(vlSymsp); + // Evaluate till stable + int __VclockLoop = 0; + QData __Vchange = 1; + do { + _eval_settle(vlSymsp); + _eval(vlSymsp); + if (VL_UNLIKELY(++__VclockLoop > 100)) { + // About to fail, so enable debug to see what's not settling. + // Note you must run make with OPT=-DVL_DEBUG for debug prints. + int __Vsaved_debug = Verilated::debug(); + Verilated::debug(1); + __Vchange = _change_request(vlSymsp); + Verilated::debug(__Vsaved_debug); + VL_FATAL_MT(__FILE__,__LINE__,__FILE__,"Verilated model didn't DC converge"); + } else { + __Vchange = _change_request(vlSymsp); + } + } while (VL_UNLIKELY(__Vchange)); +} + +//-------------------- +// Internal Methods + +void Vvortex::_settle__TOP__1(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_settle__TOP__1\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->fe_delay = 0U; + vlTOPp->de_instruction = vlTOPp->vortex__DOT__vx_f_d_reg__DOT__instruction; +} + +VL_INLINE_OPT void Vvortex::_sequent__TOP__2(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_sequent__TOP__2\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__delay_reg = 0U; + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__stall_reg = 0U; + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__JAL_reg = ((IData)(vlTOPp->reset) + ? 0U + : 4U); + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__BR_reg = ((IData)(vlTOPp->reset) + ? 0U + : 4U); + // ALWAYS at VX_fetch.v:128 + 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 + vlTOPp->vortex__DOT__vx_fetch__DOT__old = ((IData)(vlTOPp->reset) + ? 0U + : vlTOPp->vortex__DOT__vx_fetch__DOT__PC_to_use); + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__state = ((IData)(vlTOPp->reset) + ? 0U + : + ((IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__prev_debug) + ? 4U + : 0U)); + // ALWAYS at VX_fetch.v:128 + vlTOPp->vortex__DOT__vx_fetch__DOT__prev_debug = 0U; + // ALWAYS at VX_fetch.v:71 + vlTOPp->vortex__DOT__vx_fetch__DOT__PC_to_use = + ((IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__delay_reg) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__old + : ((IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__stall_reg) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__old + : ((0x10U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((8U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((4U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? ((2U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((1U + & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U + : vlTOPp->vortex__DOT__vx_fetch__DOT__old)) + : ((2U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? ((1U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__real_PC + : vlTOPp->vortex__DOT__vx_fetch__DOT__BR_reg) + : ((1U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__JAL_reg + : vlTOPp->vortex__DOT__vx_fetch__DOT__real_PC))))))); + vlTOPp->curr_PC = vlTOPp->vortex__DOT__vx_fetch__DOT__PC_to_use; +} + +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_f_d_reg.v:17 + VL_WRITEF("Fetch Inst: %10#\tDecode Inst: %10#\n", + 32,vlTOPp->fe_instruction,32,vlTOPp->vortex__DOT__vx_f_d_reg__DOT__instruction); +} + +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_fetch.v:44 + vlTOPp->vortex__DOT__vx_fetch__DOT__stall_reg = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__delay_reg = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__old = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__state = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__real_PC = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__JAL_reg = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__BR_reg = 0U; + vlTOPp->vortex__DOT__vx_fetch__DOT__prev_debug = 0U; +} + +VL_INLINE_OPT void Vvortex::_sequent__TOP__5(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_sequent__TOP__5\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__instruction + = ((IData)(vlTOPp->reset) ? 0U : vlTOPp->fe_instruction); + vlTOPp->de_instruction = vlTOPp->vortex__DOT__vx_f_d_reg__DOT__instruction; +} + +void Vvortex::_settle__TOP__6(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_settle__TOP__6\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // ALWAYS at VX_fetch.v:71 + vlTOPp->vortex__DOT__vx_fetch__DOT__PC_to_use = + ((IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__delay_reg) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__old + : ((IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__stall_reg) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__old + : ((0x10U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((8U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((4U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? ((2U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U : ((1U + & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? 0U + : vlTOPp->vortex__DOT__vx_fetch__DOT__old)) + : ((2U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? ((1U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__real_PC + : vlTOPp->vortex__DOT__vx_fetch__DOT__BR_reg) + : ((1U & (IData)(vlTOPp->vortex__DOT__vx_fetch__DOT__state)) + ? vlTOPp->vortex__DOT__vx_fetch__DOT__JAL_reg + : vlTOPp->vortex__DOT__vx_fetch__DOT__real_PC))))))); + vlTOPp->curr_PC = vlTOPp->vortex__DOT__vx_fetch__DOT__PC_to_use; +} + +void Vvortex::_eval(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_eval\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + if ((((IData)(vlTOPp->clk) & (~ (IData)(vlTOPp->__Vclklast__TOP__clk))) + | ((IData)(vlTOPp->reset) & (~ (IData)(vlTOPp->__Vclklast__TOP__reset))))) { + 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); + } + // Final + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; + vlTOPp->__Vclklast__TOP__reset = vlTOPp->reset; +} + +void Vvortex::_eval_initial(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_eval_initial\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + vlTOPp->__Vclklast__TOP__clk = vlTOPp->clk; + vlTOPp->__Vclklast__TOP__reset = vlTOPp->reset; + vlTOPp->_initial__TOP__4(vlSymsp); +} + +void Vvortex::final() { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::final\n"); ); + // Variables + Vvortex__Syms* __restrict vlSymsp = this->__VlSymsp; + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; +} + +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__1(vlSymsp); + vlTOPp->_settle__TOP__6(vlSymsp); +} + +VL_INLINE_OPT QData Vvortex::_change_request(Vvortex__Syms* __restrict vlSymsp) { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_change_request\n"); ); + Vvortex* __restrict vlTOPp VL_ATTR_UNUSED = vlSymsp->TOPp; + // Body + // Change detection + QData __req = false; // Logically a bool + return __req; +} + +#ifdef VL_DEBUG +void Vvortex::_eval_debug_assertions() { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_eval_debug_assertions\n"); ); + // Body + if (VL_UNLIKELY((clk & 0xfeU))) { + Verilated::overWidthError("clk");} + if (VL_UNLIKELY((reset & 0xfeU))) { + Verilated::overWidthError("reset");} +} +#endif // VL_DEBUG + +void Vvortex::_ctor_var_reset() { + VL_DEBUG_IF(VL_DBG_MSGF("+ Vvortex::_ctor_var_reset\n"); ); + // Body + clk = VL_RAND_RESET_I(1); + reset = VL_RAND_RESET_I(1); + fe_instruction = VL_RAND_RESET_I(32); + curr_PC = VL_RAND_RESET_I(32); + de_instruction = VL_RAND_RESET_I(32); + fe_delay = VL_RAND_RESET_I(1); + vortex__DOT__vx_fetch__DOT__stall_reg = VL_RAND_RESET_I(1); + vortex__DOT__vx_fetch__DOT__delay_reg = VL_RAND_RESET_I(1); + vortex__DOT__vx_fetch__DOT__old = VL_RAND_RESET_I(32); + vortex__DOT__vx_fetch__DOT__state = VL_RAND_RESET_I(5); + vortex__DOT__vx_fetch__DOT__real_PC = VL_RAND_RESET_I(32); + vortex__DOT__vx_fetch__DOT__JAL_reg = VL_RAND_RESET_I(32); + vortex__DOT__vx_fetch__DOT__BR_reg = VL_RAND_RESET_I(32); + vortex__DOT__vx_fetch__DOT__prev_debug = VL_RAND_RESET_I(1); + vortex__DOT__vx_fetch__DOT__PC_to_use = VL_RAND_RESET_I(32); + vortex__DOT__vx_f_d_reg__DOT__instruction = VL_RAND_RESET_I(32); +} diff --git a/rtl/obj_dir/Vvortex.h b/rtl/obj_dir/Vvortex.h new file mode 100644 index 00000000..543ae44c --- /dev/null +++ b/rtl/obj_dir/Vvortex.h @@ -0,0 +1,100 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Primary design header +// +// This header should be included by all source files instantiating the design. +// The class here is then constructed to instantiate the design. +// See the Verilator manual for examples. + +#ifndef _Vvortex_H_ +#define _Vvortex_H_ + +#include "verilated_heavy.h" + +class Vvortex__Syms; + +//---------- + +VL_MODULE(Vvortex) { + public: + + // PORTS + // The application code writes and reads these signals to + // propagate new values into/out from the Verilated model. + // Begin mtask footprint all: + VL_IN8(clk,0,0); + VL_IN8(reset,0,0); + VL_OUT8(fe_delay,0,0); + VL_IN(fe_instruction,31,0); + VL_OUT(curr_PC,31,0); + VL_OUT(de_instruction,31,0); + + // LOCAL SIGNALS + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG8(vortex__DOT__vx_fetch__DOT__stall_reg,0,0); + VL_SIG8(vortex__DOT__vx_fetch__DOT__delay_reg,0,0); + VL_SIG8(vortex__DOT__vx_fetch__DOT__state,4,0); + VL_SIG8(vortex__DOT__vx_fetch__DOT__prev_debug,0,0); + VL_SIG(vortex__DOT__vx_fetch__DOT__old,31,0); + VL_SIG(vortex__DOT__vx_fetch__DOT__real_PC,31,0); + VL_SIG(vortex__DOT__vx_fetch__DOT__JAL_reg,31,0); + VL_SIG(vortex__DOT__vx_fetch__DOT__BR_reg,31,0); + VL_SIG(vortex__DOT__vx_fetch__DOT__PC_to_use,31,0); + VL_SIG(vortex__DOT__vx_f_d_reg__DOT__instruction,31,0); + + // LOCAL VARIABLES + // Internals; generally not touched by application code + // Begin mtask footprint all: + VL_SIG8(__Vclklast__TOP__clk,0,0); + VL_SIG8(__Vclklast__TOP__reset,0,0); + + // INTERNAL VARIABLES + // Internals; generally not touched by application code + Vvortex__Syms* __VlSymsp; // Symbol table + + // PARAMETERS + // Parameters marked /*verilator public*/ for use by application code + + // CONSTRUCTORS + private: + VL_UNCOPYABLE(Vvortex); ///< Copying not allowed + public: + /// Construct the model; called by application code + /// The special name may be used to make a wrapper with a + /// single model invisible with respect to DPI scope names. + Vvortex(const char* name="TOP"); + /// Destroy the model; called (often implicitly) by application code + ~Vvortex(); + + // API METHODS + /// Evaluate the model. Application must call when inputs change. + void eval(); + /// Simulation complete, run final blocks. Application must call on completion. + void final(); + + // INTERNAL METHODS + private: + static void _eval_initial_loop(Vvortex__Syms* __restrict vlSymsp); + public: + void __Vconfigure(Vvortex__Syms* symsp, bool first); + private: + static QData _change_request(Vvortex__Syms* __restrict vlSymsp); + void _ctor_var_reset(); + public: + static void _eval(Vvortex__Syms* __restrict vlSymsp); + private: +#ifdef VL_DEBUG + void _eval_debug_assertions(); +#endif // VL_DEBUG + public: + static void _eval_initial(Vvortex__Syms* __restrict vlSymsp); + static void _eval_settle(Vvortex__Syms* __restrict vlSymsp); + static void _initial__TOP__4(Vvortex__Syms* __restrict vlSymsp); + static void _sequent__TOP__2(Vvortex__Syms* __restrict vlSymsp); + static void _sequent__TOP__3(Vvortex__Syms* __restrict vlSymsp); + static void _sequent__TOP__5(Vvortex__Syms* __restrict vlSymsp); + static void _settle__TOP__1(Vvortex__Syms* __restrict vlSymsp); + static void _settle__TOP__6(Vvortex__Syms* __restrict vlSymsp); +} VL_ATTR_ALIGNED(128); + +#endif // guard diff --git a/rtl/obj_dir/Vvortex.mk b/rtl/obj_dir/Vvortex.mk new file mode 100644 index 00000000..16ce24fa --- /dev/null +++ b/rtl/obj_dir/Vvortex.mk @@ -0,0 +1,66 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Makefile for building Verilated archive or executable +# +# Execute this makefile from the object directory: +# make -f Vvortex.mk + +default: Vvortex + +### Constants... +# Perl executable (from $PERL) +PERL = perl +# Path to Verilator kit (from $VERILATOR_ROOT) +VERILATOR_ROOT = /usr/local/Cellar/verilator/4.010/share/verilator +# SystemC include directory with systemc.h (from $SYSTEMC_INCLUDE) +SYSTEMC_INCLUDE ?= +# SystemC library directory with libsystemc.a (from $SYSTEMC_LIBDIR) +SYSTEMC_LIBDIR ?= + +### Switches... +# SystemC output mode? 0/1 (from --sc) +VM_SC = 0 +# Legacy or SystemC output mode? 0/1 (from --sc) +VM_SP_OR_SC = $(VM_SC) +# Deprecated +VM_PCLI = 1 +# Deprecated: SystemC architecture to find link library path (from $SYSTEMC_ARCH) +VM_SC_TARGET_ARCH = linux + +### Vars... +# Design prefix (from --prefix) +VM_PREFIX = Vvortex +# Module prefix (from --prefix) +VM_MODPREFIX = Vvortex +# User CFLAGS (from -CFLAGS on Verilator command line) +VM_USER_CFLAGS = \ + +# User LDLIBS (from -LDFLAGS on Verilator command line) +VM_USER_LDLIBS = \ + +# User .cpp files (from .cpp's on Verilator command line) +VM_USER_CLASSES = \ + test_bench \ + +# User .cpp directories (from .cpp's on Verilator command line) +VM_USER_DIR = \ + . \ + + +### Default rules... +# Include list of all generated classes +include Vvortex_classes.mk +# Include global rules +include $(VERILATOR_ROOT)/include/verilated.mk + +### Executable rules... (from --exe) +VPATH += $(VM_USER_DIR) + +test_bench.o: test_bench.cpp + $(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $< + +### Link rules... (from --exe) +Vvortex: $(VK_USER_OBJS) $(VK_GLOBAL_OBJS) $(VM_PREFIX)__ALL.a + $(LINK) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@ $(LIBS) $(SC_LIBS) + + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/Vvortex__ALL.a b/rtl/obj_dir/Vvortex__ALL.a new file mode 100644 index 0000000000000000000000000000000000000000..b01d2b923b7a215055c40403b02c29d8e8963870 GIT binary patch literal 11608 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 O&T0Xi!SXe;73sf2kS*~5 literal 0 HcmV?d00001 diff --git a/rtl/obj_dir/Vvortex__ALLcls.cpp b/rtl/obj_dir/Vvortex__ALLcls.cpp new file mode 100644 index 00000000..e5902852 --- /dev/null +++ b/rtl/obj_dir/Vvortex__ALLcls.cpp @@ -0,0 +1,3 @@ +// DESCRIPTION: Generated by verilator_includer via makefile +#define VL_INCLUDE_OPT include +#include "Vvortex.cpp" diff --git a/rtl/obj_dir/Vvortex__ALLcls.d b/rtl/obj_dir/Vvortex__ALLcls.d new file mode 100644 index 00000000..31e5a639 --- /dev/null +++ b/rtl/obj_dir/Vvortex__ALLcls.d @@ -0,0 +1,5 @@ +Vvortex__ALLcls.o: Vvortex__ALLcls.cpp Vvortex.cpp Vvortex.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_heavy.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilatedos.h \ + Vvortex__Syms.h diff --git a/rtl/obj_dir/Vvortex__ALLsup.cpp b/rtl/obj_dir/Vvortex__ALLsup.cpp new file mode 100644 index 00000000..0ec3080d --- /dev/null +++ b/rtl/obj_dir/Vvortex__ALLsup.cpp @@ -0,0 +1,3 @@ +// DESCRIPTION: Generated by verilator_includer via makefile +#define VL_INCLUDE_OPT include +#include "Vvortex__Syms.cpp" diff --git a/rtl/obj_dir/Vvortex__ALLsup.d b/rtl/obj_dir/Vvortex__ALLsup.d new file mode 100644 index 00000000..4864e08b --- /dev/null +++ b/rtl/obj_dir/Vvortex__ALLsup.d @@ -0,0 +1,5 @@ +Vvortex__ALLsup.o: Vvortex__ALLsup.cpp Vvortex__Syms.cpp Vvortex__Syms.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_heavy.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilatedos.h \ + Vvortex.h diff --git a/rtl/obj_dir/Vvortex__Syms.cpp b/rtl/obj_dir/Vvortex__Syms.cpp new file mode 100644 index 00000000..3d28ef93 --- /dev/null +++ b/rtl/obj_dir/Vvortex__Syms.cpp @@ -0,0 +1,19 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table implementation internals + +#include "Vvortex__Syms.h" +#include "Vvortex.h" + +// FUNCTIONS +Vvortex__Syms::Vvortex__Syms(Vvortex* topp, const char* namep) + // Setup locals + : __Vm_namep(namep) + , __Vm_didInit(false) + // Setup submodule names +{ + // Pointer to top level + TOPp = topp; + // Setup each module's pointers to their submodules + // Setup each module's pointer back to symbol table (for public functions) + TOPp->__Vconfigure(this, true); +} diff --git a/rtl/obj_dir/Vvortex__Syms.h b/rtl/obj_dir/Vvortex__Syms.h new file mode 100644 index 00000000..c1a5b28d --- /dev/null +++ b/rtl/obj_dir/Vvortex__Syms.h @@ -0,0 +1,34 @@ +// Verilated -*- C++ -*- +// DESCRIPTION: Verilator output: Symbol table internal header +// +// Internal details; most calling programs do not need this header + +#ifndef _Vvortex__Syms_H_ +#define _Vvortex__Syms_H_ + +#include "verilated_heavy.h" + +// INCLUDE MODULE CLASSES +#include "Vvortex.h" + +// SYMS CLASS +class Vvortex__Syms : public VerilatedSyms { + public: + + // LOCAL STATE + const char* __Vm_namep; + bool __Vm_didInit; + + // SUBCELL STATE + Vvortex* TOPp; + + // CREATORS + Vvortex__Syms(Vvortex* topp, const char* namep); + ~Vvortex__Syms() {} + + // METHODS + inline const char* name() { return __Vm_namep; } + +} VL_ATTR_ALIGNED(64); + +#endif // guard diff --git a/rtl/obj_dir/Vvortex__ver.d b/rtl/obj_dir/Vvortex__ver.d new file mode 100644 index 00000000..ac6d3fa0 --- /dev/null +++ b/rtl/obj_dir/Vvortex__ver.d @@ -0,0 +1 @@ +obj_dir/Vvortex.cpp obj_dir/Vvortex.h obj_dir/Vvortex.mk obj_dir/Vvortex__Syms.cpp obj_dir/Vvortex__Syms.h obj_dir/Vvortex__ver.d obj_dir/Vvortex_classes.mk : /usr/local/Cellar/verilator/4.010/bin/verilator_bin /usr/local/Cellar/verilator/4.010/bin/verilator_bin VX_f_d_reg.v VX_fetch.v vortex.v diff --git a/rtl/obj_dir/Vvortex__verFiles.dat b/rtl/obj_dir/Vvortex__verFiles.dat new file mode 100644 index 00000000..e19d07f5 --- /dev/null +++ b/rtl/obj_dir/Vvortex__verFiles.dat @@ -0,0 +1,14 @@ +# DESCRIPTION: Verilator output: Timestamp data for --skip-identical. Delete at will. +C "-Wall -cc vortex.v VX_f_d_reg.v VX_fetch.v --exe test_bench.cpp" +S 4608404 12889046060 1553037052 0 1548678579 0 "/usr/local/Cellar/verilator/4.010/bin/verilator_bin" +S 960 12889050060 1553112201 0 1553112201 0 "VX_f_d_reg.v" +S 3337 12889047675 1553112414 0 1553112414 0 "VX_fetch.v" +T 11853 12889064939 1553112478 0 1553112478 0 "obj_dir/Vvortex.cpp" +T 3513 12889064938 1553112478 0 1553112478 0 "obj_dir/Vvortex.h" +T 1800 12889064941 1553112478 0 1553112478 0 "obj_dir/Vvortex.mk" +T 530 12889064937 1553112478 0 1553112478 0 "obj_dir/Vvortex__Syms.cpp" +T 717 12889064936 1553112478 0 1553112478 0 "obj_dir/Vvortex__Syms.h" +T 300 12889064942 1553112478 0 1553112478 0 "obj_dir/Vvortex__ver.d" +T 0 0 1553112478 0 1553112478 0 "obj_dir/Vvortex__verFiles.dat" +T 1159 12889064940 1553112478 0 1553112478 0 "obj_dir/Vvortex_classes.mk" +S 1826 12889050092 1553109861 0 1553109861 0 "vortex.v" diff --git a/rtl/obj_dir/Vvortex_classes.mk b/rtl/obj_dir/Vvortex_classes.mk new file mode 100644 index 00000000..a7635d5c --- /dev/null +++ b/rtl/obj_dir/Vvortex_classes.mk @@ -0,0 +1,38 @@ +# Verilated -*- Makefile -*- +# DESCRIPTION: Verilator output: Make include file with class lists +# +# This file lists generated Verilated files, for including in higher level makefiles. +# See Vvortex.mk for the caller. + +### Switches... +# Coverage output mode? 0/1 (from --coverage) +VM_COVERAGE = 0 +# Threaded output mode? 0/1/N threads (from --threads) +VM_THREADS = 0 +# Tracing output mode? 0/1 (from --trace) +VM_TRACE = 0 + +### Object file lists... +# Generated module classes, fast-path, compile with highest optimization +VM_CLASSES_FAST += \ + Vvortex \ + +# Generated module classes, non-fast-path, compile with low/medium optimization +VM_CLASSES_SLOW += \ + +# Generated support classes, fast-path, compile with highest optimization +VM_SUPPORT_FAST += \ + +# Generated support classes, non-fast-path, compile with low/medium optimization +VM_SUPPORT_SLOW += \ + Vvortex__Syms \ + +# Global classes, need linked once per executable, fast-path, compile with highest optimization +VM_GLOBAL_FAST += \ + verilated \ + +# Global classes, need linked once per executable, non-fast-path, compile with low/medium optimization +VM_GLOBAL_SLOW += \ + + +# Verilated -*- Makefile -*- diff --git a/rtl/obj_dir/test_bench.d b/rtl/obj_dir/test_bench.d new file mode 100644 index 00000000..047c73b6 --- /dev/null +++ b/rtl/obj_dir/test_bench.d @@ -0,0 +1,4 @@ +test_bench.o: ../test_bench.cpp Vvortex.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_heavy.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilatedos.h diff --git a/rtl/obj_dir/verilated.d b/rtl/obj_dir/verilated.d new file mode 100644 index 00000000..8fb42837 --- /dev/null +++ b/rtl/obj_dir/verilated.d @@ -0,0 +1,9 @@ +verilated.o: \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated.cpp \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilatedos.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_imp.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_heavy.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_syms.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_sym_props.h \ + /usr/local/Cellar/verilator/4.010/share/verilator/include/verilated_config.h diff --git a/rtl/test_bench.cpp b/rtl/test_bench.cpp new file mode 100644 index 00000000..2875cf99 --- /dev/null +++ b/rtl/test_bench.cpp @@ -0,0 +1,42 @@ +#include "Vvortex.h" +#include "verilated.h" + +#include + +unsigned inst_array[10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; + +int main(int argc, char **argv) +{ + Verilated::commandArgs(argc, argv); + + Vvortex * vortex = new Vvortex; + + vortex->clk = 0; + vortex->reset = 1; + vortex->eval(); + + vortex->reset = 0; + + for (int i = 0; i < 10; i++) + { + + vortex->fe_instruction = inst_array[(vortex->curr_PC) / 4]; + + vortex->clk = 1; + vortex->eval(); + + vortex->clk = 0; + vortex->eval(); + + + } + + + delete vortex; + + return 0; + +} + + + diff --git a/rtl/vortex.v b/rtl/vortex.v new file mode 100644 index 00000000..2d3fd6c3 --- /dev/null +++ b/rtl/vortex.v @@ -0,0 +1,94 @@ + +// `include "vx_fetch.v" +// `include "vx_f_d_reg.v" + +module vortex( + input wire clk, + input wire reset, + input wire[31:0] fe_instruction, + output wire[31:0] curr_PC, + output wire[31:0] de_instruction, + output wire fe_delay + ); + +wire branch_dir; +assign branch_dir = 0; + +wire freeze; +assign freeze = 0; + +wire[31:0] branch_dest; +wire branch_stall; +wire fwd_stall; +wire branch_stall_exe; +wire jal; +wire[31:0] jal_dest; +wire interrupt; +wire debug; + +assign branch_dest = 32'h0; +assign branch_stall = 1'b0; +assign fwd_stall = 1'b0; +assign branch_stall_exe = 1'b0; +assign jal = 1'b0; +assign jal_dest = 32'h0; +assign interrupt = 1'b0; +assign debug = 1'b0; + + +wire[31:0] f_instruction; +wire f_delay; /* verilator lint_off UNUSED */ +wire[31:0] f_curr_pc; +wire f_valid; + +assign curr_PC = f_curr_pc; +assign fe_delay = f_delay; + +VX_fetch vx_fetch ( + .clk(clk), + .reset(reset), + .in_branch_dir(branch_dir), + .in_freeze(freeze), + .in_branch_dest(branch_dest), + .in_branch_stall(branch_stall), + .in_fwd_stall(fwd_stall), + .in_branch_stall_exe(branch_stall_exe), + .in_jal(jal), + .in_jal_dest(jal_dest), + .in_interrupt(interrupt), + .in_debug(debug), + .in_instruction(fe_instruction), + + .out_instruction(f_instruction), + .out_delay(f_delay), + .out_curr_PC(f_curr_pc), + .out_valid(f_valid) +); + + +wire[31:0] d_curr_pc; +wire[31:0] d_instruction; +wire d_valid; + +VX_f_d_reg vx_f_d_reg ( + .clk(clk), + .reset(reset), + .in_instruction(f_instruction), + .in_valid(f_valid), + .in_curr_PC(f_curr_pc), + .in_fwd_stall(fwd_stall), + .in_freeze(freeze), + .out_instruction(d_instruction), + .out_curr_PC(d_curr_pc), + .out_valid(d_valid) + ); + +assign de_instruction = d_instruction; + + +endmodule // Vortex + + + + + diff --git a/src/vortex_software/.DS_Store b/src/vortex_software/.DS_Store index 476708ba1f5b061f4894586be39ce6987b9dc8f8..8f25690de3fdd476ee89fc33d976528435b6a321 100644 GIT binary patch delta 112 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$SAZiU^g?P&}JS1O~%P{1$j4@ y32tPX*dVf)or6P=8K@En1h|2OD@fDE!tczJ`DHvoMldizj04%gusNP*4l@8v1rnG5 delta 138 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD7-OXH}hr%jz7$c**Q2SHn1=X zZ{}gqWRy)~C}PNG$YUsB&|^sU%*jtq%E?ax>11GFUcFh4^(xb5b)M(UToT+sL06E8 cn*}+(Gf(Ch@to|>!@5Ukb<4lmizaK1qB50>K$jQs%RPK*v0M8$9;zw7=?s~?EVo?v1k)zDKj zJzX4&IZ2fY733LFKbVt1VFgM?KpV>)8j7aAhPZ;osXIx-6%RU}(?ipV3hFd&* z=U?xK-F820x!-+E?D#>7N&zV#1*Cu!kOIF_z-upUxk}V11*Cu!_)@^X4~_2F7mkVX z>EIA80CB-^80XPT5Ss^xec_nM2+fj8OsZ9jVM%AaRbF2>CMF#gH}jmj*{VaaxSjD9 z>99UgqZE(=Qw2_Q*?IlHqW{qUPf1!y0V(jW6tKnSX0zs#sv0CkYhP>JxGe5p_CyHD3ysU&5#dN zngUc@*LRyo;&RcNvfD<2!fIgs#V2i7fYjB|iY j-O0aLSMV^J0GUP*2TX2Y6WM%-&6ROt!-UQ39Dn%%J6b--