feat: init mlkem project with Verilator test framework

- sync_rtl/common/: skid_buffer, pipeline_reg, defines (valid/ready)
- sync_rtl/mod_add/: modular adder example with Verilator C++ TB
- test_framework/: Python-driven Verilator compile/sim/compare pipeline
- test_framework/modules/mod_add/: 50-vector test plan, full鏈路 PASS
- .trellis/spec/: RTL and test_framework conventions documented
This commit is contained in:
2026-06-24 19:43:29 +08:00
commit 8fdf944555
216 changed files with 24140 additions and 0 deletions

View File

@@ -0,0 +1,299 @@
// Verilated -*- C++ -*-
// DESCRIPTION: Verilator output: Design implementation internals
// See Vmod_add_sync.h for the primary calling header
#include "Vmod_add_sync__pch.h"
void Vmod_add_sync___024root___eval_triggers_vec__ico(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_triggers_vec__ico\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
vlSelfRef.__VicoTriggered[0U] = ((0xfffffffffffffffeULL
& vlSelfRef.__VicoTriggered[0U])
| (IData)((IData)(vlSelfRef.__VicoFirstIteration)));
}
bool Vmod_add_sync___024root___trigger_anySet__ico(const VlUnpacked<QData/*63:0*/, 1> &in) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___trigger_anySet__ico\n"); );
// Locals
IData/*31:0*/ n;
// Body
n = 0U;
do {
if (in[n]) {
return (1U);
}
n = ((IData)(1U) + n);
} while ((1U > n));
return (0U);
}
void Vmod_add_sync___024root___ico_sequent__TOP__0(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___ico_sequent__TOP__0\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
vlSelfRef.mod_add_sync__DOT__add_raw = (0x00001fffU
& ((IData)(vlSelfRef.a)
+ (IData)(vlSelfRef.b)));
vlSelfRef.ready_o = (1U & ((~ (IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r))
| (IData)(vlSelfRef.ready_i)));
}
void Vmod_add_sync___024root___eval_ico(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_ico\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
if ((1ULL & vlSelfRef.__VicoTriggered[0U])) {
vlSelfRef.mod_add_sync__DOT__add_raw = (0x00001fffU
& ((IData)(vlSelfRef.a)
+ (IData)(vlSelfRef.b)));
vlSelfRef.ready_o = (1U & ((~ (IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r))
| (IData)(vlSelfRef.ready_i)));
}
}
#ifdef VL_DEBUG
VL_ATTR_COLD void Vmod_add_sync___024root___dump_triggers__ico(const VlUnpacked<QData/*63:0*/, 1> &triggers, const std::string &tag);
#endif // VL_DEBUG
bool Vmod_add_sync___024root___eval_phase__ico(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_phase__ico\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Locals
CData/*0:0*/ __VicoExecute;
// Body
Vmod_add_sync___024root___eval_triggers_vec__ico(vlSelf);
#ifdef VL_DEBUG
if (VL_UNLIKELY(vlSymsp->_vm_contextp__->debug())) {
Vmod_add_sync___024root___dump_triggers__ico(vlSelfRef.__VicoTriggered, "ico"s);
}
#endif
__VicoExecute = Vmod_add_sync___024root___trigger_anySet__ico(vlSelfRef.__VicoTriggered);
if (__VicoExecute) {
Vmod_add_sync___024root___eval_ico(vlSelf);
}
return (__VicoExecute);
}
void Vmod_add_sync___024root___eval_triggers_vec__act(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_triggers_vec__act\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
vlSelfRef.__VactTriggered[0U] = (QData)((IData)(
((((~ (IData)(vlSelfRef.rst_n))
& (IData)(vlSelfRef.__Vtrigprevexpr___TOP__rst_n__0))
<< 1U)
| ((IData)(vlSelfRef.clk)
& (~ (IData)(vlSelfRef.__Vtrigprevexpr___TOP__clk__0))))));
vlSelfRef.__Vtrigprevexpr___TOP__clk__0 = vlSelfRef.clk;
vlSelfRef.__Vtrigprevexpr___TOP__rst_n__0 = vlSelfRef.rst_n;
}
bool Vmod_add_sync___024root___trigger_anySet__act(const VlUnpacked<QData/*63:0*/, 1> &in) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___trigger_anySet__act\n"); );
// Locals
IData/*31:0*/ n;
// Body
n = 0U;
do {
if (in[n]) {
return (1U);
}
n = ((IData)(1U) + n);
} while ((1U > n));
return (0U);
}
void Vmod_add_sync___024root___nba_sequent__TOP__0(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___nba_sequent__TOP__0\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
if (vlSelfRef.rst_n) {
if (((IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r)
& (IData)(vlSelfRef.ready_i))) {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 0U;
}
if (((IData)(vlSelfRef.valid_i) & (IData)(vlSelfRef.ready_o))) {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 1U;
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r
= (0x00000fffU & ((0x0d01U > (IData)(vlSelfRef.mod_add_sync__DOT__add_raw))
? (IData)(vlSelfRef.mod_add_sync__DOT__add_raw)
: ((IData)(vlSelfRef.mod_add_sync__DOT__add_raw)
- (IData)(0x0d01U))));
}
} else {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 0U;
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r = 0U;
}
vlSelfRef.valid_o = vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r;
vlSelfRef.ready_o = (1U & ((~ (IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r))
| (IData)(vlSelfRef.ready_i)));
vlSelfRef.sum = vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r;
}
void Vmod_add_sync___024root___eval_nba(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_nba\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
if ((3ULL & vlSelfRef.__VnbaTriggered[0U])) {
if (vlSelfRef.rst_n) {
if (((IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r)
& (IData)(vlSelfRef.ready_i))) {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 0U;
}
if (((IData)(vlSelfRef.valid_i) & (IData)(vlSelfRef.ready_o))) {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 1U;
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r
= (0x00000fffU & ((0x0d01U > (IData)(vlSelfRef.mod_add_sync__DOT__add_raw))
? (IData)(vlSelfRef.mod_add_sync__DOT__add_raw)
: ((IData)(vlSelfRef.mod_add_sync__DOT__add_raw)
- (IData)(0x0d01U))));
}
} else {
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r = 0U;
vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r = 0U;
}
vlSelfRef.valid_o = vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r;
vlSelfRef.ready_o = (1U & ((~ (IData)(vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__valid_r))
| (IData)(vlSelfRef.ready_i)));
vlSelfRef.sum = vlSelfRef.mod_add_sync__DOT__u_pipe__DOT__data_r;
}
}
void Vmod_add_sync___024root___trigger_orInto__act_vec_vec(VlUnpacked<QData/*63:0*/, 1> &out, const VlUnpacked<QData/*63:0*/, 1> &in) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___trigger_orInto__act_vec_vec\n"); );
// Locals
IData/*31:0*/ n;
// Body
n = 0U;
do {
out[n] = (out[n] | in[n]);
n = ((IData)(1U) + n);
} while ((0U >= n));
}
#ifdef VL_DEBUG
VL_ATTR_COLD void Vmod_add_sync___024root___dump_triggers__act(const VlUnpacked<QData/*63:0*/, 1> &triggers, const std::string &tag);
#endif // VL_DEBUG
bool Vmod_add_sync___024root___eval_phase__act(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_phase__act\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
Vmod_add_sync___024root___eval_triggers_vec__act(vlSelf);
#ifdef VL_DEBUG
if (VL_UNLIKELY(vlSymsp->_vm_contextp__->debug())) {
Vmod_add_sync___024root___dump_triggers__act(vlSelfRef.__VactTriggered, "act"s);
}
#endif
Vmod_add_sync___024root___trigger_orInto__act_vec_vec(vlSelfRef.__VnbaTriggered, vlSelfRef.__VactTriggered);
return (0U);
}
void Vmod_add_sync___024root___trigger_clear__act(VlUnpacked<QData/*63:0*/, 1> &out) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___trigger_clear__act\n"); );
// Locals
IData/*31:0*/ n;
// Body
n = 0U;
do {
out[n] = 0ULL;
n = ((IData)(1U) + n);
} while ((1U > n));
}
bool Vmod_add_sync___024root___eval_phase__nba(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_phase__nba\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Locals
CData/*0:0*/ __VnbaExecute;
// Body
__VnbaExecute = Vmod_add_sync___024root___trigger_anySet__act(vlSelfRef.__VnbaTriggered);
if (__VnbaExecute) {
Vmod_add_sync___024root___eval_nba(vlSelf);
Vmod_add_sync___024root___trigger_clear__act(vlSelfRef.__VnbaTriggered);
}
return (__VnbaExecute);
}
void Vmod_add_sync___024root___eval(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Locals
IData/*31:0*/ __VicoIterCount;
IData/*31:0*/ __VnbaIterCount;
// Body
__VicoIterCount = 0U;
vlSelfRef.__VicoFirstIteration = 1U;
do {
if (VL_UNLIKELY(((0x00000064U < __VicoIterCount)))) {
#ifdef VL_DEBUG
Vmod_add_sync___024root___dump_triggers__ico(vlSelfRef.__VicoTriggered, "ico"s);
#endif
VL_FATAL_MT("sync_rtl/mod_add/mod_add_sync.v", 14, "", "DIDNOTCONVERGE: Input combinational region did not converge after '--converge-limit' of 100 tries");
}
__VicoIterCount = ((IData)(1U) + __VicoIterCount);
vlSelfRef.__VicoPhaseResult = Vmod_add_sync___024root___eval_phase__ico(vlSelf);
vlSelfRef.__VicoFirstIteration = 0U;
} while (vlSelfRef.__VicoPhaseResult);
__VnbaIterCount = 0U;
do {
if (VL_UNLIKELY(((0x00000064U < __VnbaIterCount)))) {
#ifdef VL_DEBUG
Vmod_add_sync___024root___dump_triggers__act(vlSelfRef.__VnbaTriggered, "nba"s);
#endif
VL_FATAL_MT("sync_rtl/mod_add/mod_add_sync.v", 14, "", "DIDNOTCONVERGE: NBA region did not converge after '--converge-limit' of 100 tries");
}
__VnbaIterCount = ((IData)(1U) + __VnbaIterCount);
vlSelfRef.__VactIterCount = 0U;
do {
if (VL_UNLIKELY(((0x00000064U < vlSelfRef.__VactIterCount)))) {
#ifdef VL_DEBUG
Vmod_add_sync___024root___dump_triggers__act(vlSelfRef.__VactTriggered, "act"s);
#endif
VL_FATAL_MT("sync_rtl/mod_add/mod_add_sync.v", 14, "", "DIDNOTCONVERGE: Active region did not converge after '--converge-limit' of 100 tries");
}
vlSelfRef.__VactIterCount = ((IData)(1U)
+ vlSelfRef.__VactIterCount);
vlSelfRef.__VactPhaseResult = Vmod_add_sync___024root___eval_phase__act(vlSelf);
} while (vlSelfRef.__VactPhaseResult);
vlSelfRef.__VnbaPhaseResult = Vmod_add_sync___024root___eval_phase__nba(vlSelf);
} while (vlSelfRef.__VnbaPhaseResult);
}
#ifdef VL_DEBUG
void Vmod_add_sync___024root___eval_debug_assertions(Vmod_add_sync___024root* vlSelf) {
VL_DEBUG_IF(VL_DBG_MSGF("+ Vmod_add_sync___024root___eval_debug_assertions\n"); );
Vmod_add_sync__Syms* const __restrict vlSymsp VL_ATTR_UNUSED = vlSelf->vlSymsp;
auto& vlSelfRef = std::ref(*vlSelf).get();
// Body
if (VL_UNLIKELY(((vlSelfRef.clk & 0xfeU)))) {
Verilated::overWidthError("clk");
}
if (VL_UNLIKELY(((vlSelfRef.rst_n & 0xfeU)))) {
Verilated::overWidthError("rst_n");
}
if (VL_UNLIKELY(((vlSelfRef.a & 0xf000U)))) {
Verilated::overWidthError("a");
}
if (VL_UNLIKELY(((vlSelfRef.b & 0xf000U)))) {
Verilated::overWidthError("b");
}
if (VL_UNLIKELY(((vlSelfRef.valid_i & 0xfeU)))) {
Verilated::overWidthError("valid_i");
}
if (VL_UNLIKELY(((vlSelfRef.ready_i & 0xfeU)))) {
Verilated::overWidthError("ready_i");
}
}
#endif // VL_DEBUG