976 lines
30 KiB
C++
976 lines
30 KiB
C++
// 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);
|
|
}}
|
|
}
|