Skip to content

Weird undef value in output #980

Description

@zero9178

Given the following C code:

#include "dynamatic/Integration.h"
#include <stdint.h>
#ifdef HLS_FUZZER_VERIFY
constexpr
#endif
    int16_t
    test21(float var2, uint32_t var3, int32_t var4, double var12, float var13,
           double var14, float var15, int8_t var16, uint32_t var17,
           int32_t var18, uint32_t var19, int8_t var20, uint16_t var21,
           uint16_t var22, uint32_t var23, uint16_t var24, int8_t var25,
           int8_t var26, int8_t var27, int8_t var29, uint16_t var30,
           int8_t var31, int16_t var32, int32_t var33, uint8_t var34,
           int8_t var35, uint16_t var36, uint8_t var37, uint8_t var38,
           uint16_t var39, int8_t var40, int16_t var41, uint8_t var42,
           int8_t var43, int32_t var45, uint16_t var46, uint16_t var47,
           uint16_t var48, int16_t var49, uint16_t var0[32], double var1[8],
           uint8_t var28[2], uint8_t var44[2]) {
  for (; var0[0];)
    var1[0] = 0;
  var0[0] = !(var1[0] >= 0);
  return 0;
}
#ifdef HLS_FUZZER_VERIFY
constexpr
#endif
    void
    test_bench() {
  float var2 = 4.020215e-01, var13 = 0, var15 = 0;
  uint32_t var3 = 0;
  int32_t var4 = 0;
  double var12 = 0, var14 = 0;
  int8_t var16 = 0;
  uint32_t var17 = 7;
  int32_t var18 = 0;
  uint32_t var19 = 0;
  int8_t var20 = 0;
  uint16_t var21 = 0;
  uint16_t var22 = 0;
  uint32_t var23 = 0;
  uint16_t var24 = 0;
  int8_t var25 = 0;
  int8_t var26 = 0;
  int8_t var27 = 0;
  int8_t var29 = 0;
  uint16_t var30 = 0;
  int8_t var31 = 0;
  int16_t var32 = 0;
  int32_t var33 = 0;
  uint8_t var34 = 0;
  int8_t var35 = 0;
  uint16_t var36 = 0;
  uint8_t var37 = 0;
  uint8_t var38 = 0;
  uint16_t var39 = 0;
  int8_t var40 = 0;
  int16_t var41 = 0;
  uint8_t var42 = 0;
  int8_t var43 = 0;
  int32_t var45 = 0;
  uint16_t var46 = 0;
  uint16_t var47 = 0;
  uint16_t var48 = 0;
  int16_t var49 = 0;
  uint16_t var0[32] = {};
  double var1[8] = {};
  uint8_t var28[2];
  uint8_t var44[2];
  CALL_KERNEL(test21, var2, var3, var4, var12, var13, var14, var15, var16,
              var17, var18, var19, var20, var21, var22, var23, var24, var25,
              var26, var27, var29, var30, var31, var32, var33, var34, var35,
              var36, var37, var38, var39, var40, var41, var42, var43, var45,
              var46, var47, var48, var49, var0, var1, var28, var44);
}
int main() { test_bench(); }

Running and simulating it with dynamatic yields an undefined value:

dynamatic> compile
[INFO] Copied C source
[INFO] Disabled short-circuiting
[INFO] Compiled to LLVM IR
[INFO] Optimized LLVM IR
[INFO] Applied memory dependency analysis to LLVM IR
[INFO] Converted to std dialect
[INFO] Applied CF transformations
[INFO] Marked memory accesses with the corresponding interfaces in cf
[INFO] Compiled cf to handshake
[INFO] Applied transformations to handshake
[INFO] Running simple buffer placement (on-merges).
[INFO] Placed simple buffers
[INFO] Generated handshake_export
[INFO] Lowered to HW
[INFO] Compilation succeeded
dynamatic> write-hdl
[INFO] Exported RTL (vhdl)
[INFO] HDL generation succeeded
dynamatic> simulate --timeout 1000000
[INFO] Built kernel for IO gen.
[INFO] Ran kernel for IO gen.
[INFO] Launching simulation (vsim)
[FATAL] Simulation failed

cat report.txt
FP32 comparison of [var2] : Pass
Comparison of [var3] : Pass
Comparison of [var4] : Pass
FP64 comparison of [var12] : Pass
FP32 comparison of [var13] : Pass
FP64 comparison of [var14] : Pass
FP32 comparison of [var15] : Pass
Comparison of [var16] : Pass
Comparison of [var17] : Pass
Comparison of [var18] : Pass
Comparison of [var19] : Pass
Comparison of [var20] : Pass
Comparison of [var21] : Pass
Comparison of [var22] : Pass
Comparison of [var23] : Pass
Comparison of [var24] : Pass
Comparison of [var25] : Pass
Comparison of [var26] : Pass
Comparison of [var27] : Pass
Comparison of [var29] : Pass
Comparison of [var30] : Pass
Comparison of [var31] : Pass
Comparison of [var32] : Pass
Comparison of [var33] : Pass
Comparison of [var34] : Pass
Comparison of [var35] : Pass
Comparison of [var36] : Pass
Comparison of [var37] : Pass
Comparison of [var38] : Pass
Comparison of [var39] : Pass
Comparison of [var40] : Pass
Comparison of [var41] : Pass
Comparison of [var42] : Pass
Comparison of [var43] : Pass
Comparison of [var45] : Pass
Comparison of [var46] : Pass
Comparison of [var47] : Pass
Comparison of [var48] : Pass
Comparison of [var49] : Pass
[ERROR COMPARE] Token mismatch: [0x00000000] and [0x000X] are not equal (at transaction id 0).
Comparison of [var0] : Fail

Metadata

Metadata

Assignees

No one assigned

    Labels

    fuzzer-foundBugs found using an automated fuzzermiscompileThe compiler output does not behave as it should

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions