nickg / nvc

VHDL compiler and simulator
https://www.nickg.me.uk/nvc/
GNU General Public License v3.0
589 stars 75 forks source link

nvc error creating instance of generic package given a constant as parameter #894

Closed tmeissner closed 1 month ago

tmeissner commented 1 month ago

I have a strange error when creating an instance of a generic package. When I give a parameter an integer literal, it works. When I give the parameter an constant of the same integer, it creates an nvc error like this:

nvc --std=19 -L ./ -e --cover=statement,branch,expression,fsm-state,functional axiqueuedmat

Name       WORK.AXIQUEUEDMATP.ADDCMPJOB(32WORK.AXIQUEUEDMATP.T_QUEUE_RANGE34WORK.AXIQUEUEDMATP.T_JOB_SIZE_BYTE32WORK.AXIQUEUEDMATP.MEMORY.T_DICT35WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUEsLs32WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2Ss28WORK.AXIQUEUEDMAP.T_AXIS_S2M)
Kind       procedure
Context    WORK.AXIQUEUEDMATP
Blocks     7
Registers  274
Types      108
  WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S$     {$<0..8>, $<0..8>, $<0..8>, WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S${}}
  WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S$ {$<0..8>, $<0..8>, $<0..8>, $<0..8>}
  WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S      {0..8, 0..8, [512] : 0..8, WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S{}}
  WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S {[11] : 0..8, [2] : 0..8, [2] : 0..8, [16] : 0..8}
  WORK.AXIQUEUEDMAP.T_AXIS_S2M$         {$<0..8>}
  WORK.AXIQUEUEDMAP.T_AXIS_S2M          {0..8}
Variables  11
  QUEUE                                 // -2^63..2^63-1 => 0..3
  LEN                                   // -2^63..2^63-1 => 0..65535
  MEMORY                                // @<P<WORK.AXIQUEUEDMATP.MEMORY.T_DICT>> => P<WORK.AXIQUEUEDMATP.MEMORY.T_DICT>
  CMPQUEUE                              // @<P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>> => P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>
  CLK                                   // $<0..8> => 0..8
  AXISM2S                               // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S${}> => WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S{}
  AXISS2M                               // @<WORK.AXIQUEUEDMAP.T_AXIS_S2M${}> => WORK.AXIQUEUEDMAP.T_AXIS_S2M{}
  V_DATA                                // [512] : 0..8 => 0..8, heap
  V_DATA_CNT                            // -2^63..2^63-1 => 0..2^63-1
  V_RANDOM                              // P<OSVVM.RANDOMPKG.RANDOMPTYPE>
  tmp266                                // WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S{}, temp
Parameters 8
  r0    context                         // P<WORK.AXIQUEUEDMATP>
  r1    QUEUE                           // -2^63..2^63-1 => 0..3
  r2    LEN                             // -2^63..2^63-1 => 0..65535
  r3    MEMORY                          // @<P<WORK.AXIQUEUEDMATP.MEMORY.T_DICT>> => P<WORK.AXIQUEUEDMATP.MEMORY.T_DICT>
  r4    CMPQUEUE                        // @<P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>> => P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>
  r5    CLK                             // $<0..8> => 0..8
  r6    AXISM2S                         // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S${}> => WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S{}
  r7    AXISS2M                         // @<WORK.AXIQUEUEDMAP.T_AXIS_S2M${}> => WORK.AXIQUEUEDMAP.T_AXIS_S2M{}
Begin
   0: QUEUE := store r1
      LEN := store r2
      MEMORY := store r3
      CMPQUEUE := store r4
      CLK := store r5
      AXISM2S := store r6
      AXISS2M := store r7
      r8 := const 512                   // # => 512
      r9 := index V_DATA                // @<0..8> => 0..8
      r10 := const 0                    // 0..8 => 0
      r9 := memset r10 length r8
      r11 := debug locus WORK.AXIQUEUEDMATP-body+12690 // D<>
      r12 := const 0                    // -2^63..2^63-1 => 0
      r13 := const 9223372036854775807  // -2^63..2^63-1 => 2^63-1
      r14 := const 0                    // 0..1 => 0
      r15 := const 511                  // -2^63..2^63-1 => 511
      r16 := const 1                    // 0..1 => 1
      r17 := debug locus WORK.AXIQUEUEDMATP-body+12682 // D<>
      V_DATA_CNT := store r12
      r18 := var upref 1, path_name     // @<[*] : 0..255> => 0..255
      r19 := load indirect r18          // [*] : 0..255 => 0..255
      r20 := const 58                   // 0..255 => 58
      r21 := const 97                   // 0..255 => 97
      r22 := const 100                  // 0..255 => 100
      r23 := const 99                   // 0..255 => 99
      r24 := const 109                  // 0..255 => 109
      r25 := const 112                  // 0..255 => 112
      r26 := const 106                  // 0..255 => 106
      r27 := const 111                  // 0..255 => 111
      r28 := const 98                   // 0..255 => 98
      r29 := const 91                   // 0..255 => 91
      r30 := const 116                  // 0..255 => 116
      r31 := const 95                   // 0..255 => 95
      r32 := const 113                  // 0..255 => 113
      r33 := const 117                  // 0..255 => 117
      r34 := const 101                  // 0..255 => 101
      r35 := const 114                  // 0..255 => 114
      r36 := const 110                  // 0..255 => 110
      r37 := const 103                  // 0..255 => 103
      r38 := const 44                   // 0..255 => 44
      r39 := const 32                   // 0..255 => 32
      r40 := const 115                  // 0..255 => 115
      r41 := const 105                  // 0..255 => 105
      r42 := const 122                  // 0..255 => 122
      r43 := const 121                  // 0..255 => 121
      r44 := const 108                  // 0..255 => 108
      r45 := const 120                  // 0..255 => 120
      r46 := const 50                   // 0..255 => 50
      r47 := const 93                   // 0..255 => 93
      r48 := const 118                  // 0..255 => 118
      r49 := const [r20,r21,r22,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31,r32,r33,r34,r33,r34,r31,r35,r21,r36,r37,r34,r38,r39,r30,r31,r26,r27,r28,r31,r40,r41,r42,r34,r31,r28,r43,r30,r34,r38,r39,r30,r31,r22,r41,r23,r30,r38,r39,r30,r31,r32,r33,r34,r33,r34,r38,r39,r40,r30,r22,r31,r44,r27,r37,r41,r23,r38,r39,r30,r31,r21,r45,r41,r40,r31,r23,r24,r25,r31,r24,r46,r40,r38,r39,r30,r31,r21,r45,r41,r40,r31,r40,r46,r24,r47,r20,r48,r31,r35,r21,r36,r22,r27,r24] // [107] : 0..255 => 0..255
      r50 := uarray len r19 dim 0       // #
      r51 := const 107                  // # => 107
      r52 := add r50 + r51              // # => -9223372036854775701..2^63-1
      r53 := alloc r52                  // @<0..255> => 0..255
      r54 := array ref r53 offset r50   // @<0..255> => 0..255
      r55 := unwrap r19                 // @<0..255> => 0..255
      r53 := copy r55 count r50
      r56 := address of r49             // @<0..255> => 0..255
      r54 := copy r56 count r51
      r57 := const 1                    // # => 1
      r58 := wrap r53 [r57 r52 r14]     // [*] : 0..255
      r59 := var upref 1, instance_name // @<[*] : 0..255> => 0..255
      r60 := load indirect r59          // [*] : 0..255 => 0..255
      r61 := uarray len r60 dim 0       // #
      r62 := add r61 + r51              // # => -9223372036854775701..2^63-1
      r63 := alloc r62                  // @<0..255> => 0..255
      r64 := array ref r63 offset r61   // @<0..255> => 0..255
      r65 := unwrap r60                 // @<0..255> => 0..255
      r63 := copy r65 count r61
      r64 := copy r56 count r51
      r66 := wrap r63 [r57 r62 r14]     // [*] : 0..255
      r67 := link package OSVVM.RANDOMPKG // P<OSVVM.RANDOMPKG>
      r68 := protected init OSVVM.RANDOMPKG.RANDOMPTYPE context r67 path r58 instance r66 // P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      V_RANDOM := store r68
      r69 := index V_RANDOM             // @<P<OSVVM.RANDOMPKG.RANDOMPTYPE>> => P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      r70 := load indirect r69          // P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      r71 := load indirect r59          // [*] : 0..255 => 0..255
      r72 := uarray len r71 dim 0       // #
      r73 := add r72 + r51              // # => -9223372036854775701..2^63-1
      r74 := alloc r73                  // @<0..255> => 0..255
      r75 := array ref r74 offset r72   // @<0..255> => 0..255
      r76 := unwrap r71                 // @<0..255> => 0..255
      r74 := copy r76 count r72
      r75 := copy r56 count r51
      r77 := wrap r74 [r57 r73 r14]     // [*] : 0..255
      r78 := link package STD.STANDARD  // P<STD.STANDARD>
      r79 := fcall STD.STANDARD.NOW()25STD.STANDARD.DELAY_LENGTH r78 // -2^63..2^63-1
      r80 := const -9223372036854775808 // -2^63..2^63-1 => -2^63
      r81 := fcall STD.STANDARD.TO_STRING(T)S$predef r78, r79 // [*] : 0..255 => 0..255
      r82 := const 0                    // # => 0
      r83 := const -1                   // # => -1
      r84 := const 1                    // -2^63..2^63-1 => 1
      r85 := range length left r57 right r73 dir r14 // #
      r86 := add r83 + r85              // # => -2^63..9223372036854775806
      r87 := uarray len r81 dim 0       // #
      r88 := add r86 + r87              // # => -2^63..2^63-1
      r89 := add r85 + r87              // # => -2^63..2^63-1
      r90 := alloc r89                  // @<0..255> => 0..255
      r91 := cast r88                   // -2^63..2^63-1 => 1..2^63-1
      r92 := add r84 + r91              // -2^63..2^63-1 => 2..2^63-1
      r93 := sub r84 - r91              // -2^63..2^63-1 => -9223372036854775806..0
      r94 := wrap r90 [r84 r92 r14]     // [*] : 0..255
      r95 := array ref r90 offset r82   // @<0..255> => 0..255
      r95 := copy r74 count r85
      r96 := array ref r90 offset r85   // @<0..255> => 0..255
      r97 := unwrap r81                 // @<0..255> => 0..255
      r96 := copy r97 count r87
      pcall OSVVM.RANDOMPKG.RANDOMPTYPE.INITSEED(SB) r70, r94, r14 resume 1
   1: resume OSVVM.RANDOMPKG.RANDOMPTYPE.INITSEED(SB)
      r98 := link package OSVVM.ALERTLOGPKG // P<OSVVM.ALERTLOGPKG>
      r99 := const 65                   // 0..255 => 65
      r100 := const 100                 // 0..255 => 100
      r101 := const 32                  // 0..255 => 32
      r102 := const 74                  // 0..255 => 74
      r103 := const 111                 // 0..255 => 111
      r104 := const 98                  // 0..255 => 98
      r105 := const 97                  // 0..255 => 97
      r106 := const 116                 // 0..255 => 116
      r107 := const 67                  // 0..255 => 67
      r108 := const 77                  // 0..255 => 77
      r109 := const 80                  // 0..255 => 80
      r110 := const 88                  // 0..255 => 88
      r111 := const 73                  // 0..255 => 73
      r112 := const 115                 // 0..255 => 115
      r113 := const 44                  // 0..255 => 44
      r114 := const 81                  // 0..255 => 81
      r115 := const 117                 // 0..255 => 117
      r116 := const 101                 // 0..255 => 101
      r117 := const 58                  // 0..255 => 58
      r118 := const [r99,r100,r100,r101,r102,r103,r104,r101,r100,r105,r106,r105,r101,r105,r106,r101,r107,r108,r109,r101,r99,r110,r111,r112,r113,r101,r114,r115,r116,r115,r116,r117,r101] // [33] : 0..255 => 0..255
      r119 := address of r118           // @<0..255> => 0..255
      r120 := link package STD.STANDARD // P<STD.STANDARD>
      r121 := load QUEUE                // -2^63..2^63-1 => 0..3
      r122 := const -9223372036854775808 // -2^63..2^63-1 => -2^63
      r123 := const 9223372036854775807 // -2^63..2^63-1 => 2^63-1
      r124 := const 0                   // 0..1 => 0
      r125 := fcall STD.STANDARD.TO_STRING(I)S$predef r120, r121 // [*] : 0..255 => 0..255
      r126 := const 0                   // # => 0
      r127 := const -1                  // # => -1
      r128 := const 1                   // -2^63..2^63-1 => 1
      r129 := const 33                  // # => 33
      r130 := const 32                  // # => 32
      r131 := uarray len r125 dim 0     // #
      r132 := add r130 + r131           // # => -9223372036854775776..2^63-1
      r133 := add r129 + r131           // # => -9223372036854775775..2^63-1
      r134 := alloc r133                // @<0..255> => 0..255
      r135 := cast r132                 // -2^63..2^63-1 => 1..2^63-1
      r136 := add r128 + r135           // -2^63..2^63-1 => 2..2^63-1
      r137 := sub r128 - r135           // -2^63..2^63-1 => -9223372036854775806..0
      r138 := wrap r134 [r128 r136 r124] // [*] : 0..255
      r139 := array ref r134 offset r126 // @<0..255> => 0..255
      r139 := copy r119 count r129
      r140 := array ref r134 offset r129 // @<0..255> => 0..255
      r141 := unwrap r125               // @<0..255> => 0..255
      r140 := copy r141 count r131
      r142 := const 0                   // 0..4 => 0
      r143 := const 4                   // 0..4 => 4
      r144 := const 1                   // 0..1 => 1
      pcall OSVVM.ALERTLOGPKG.LOG(S25OSVVM.ALERTLOGPKG.LOGTYPEB) r98, r138, r142, r124 resume 2
   2: resume OSVVM.ALERTLOGPKG.LOG(S25OSVVM.ALERTLOGPKG.LOGTYPEB)
      r145 := const 63                  // -2^63..2^63-1 => 63
      r146 := const 0                   // -2^63..2^63-1 => 0
      r147 := const 1                   // 0..1 => 1
      r148 := const 0                   // 0..1 => 0
      r149 := index V_DATA              // @<0..8> => 0..8
      r150 := const 511                 // -2^63..2^63-1 => 511
      r151 := debug locus WORK.AXIQUEUEDMATP-body+12917 // D<>
      r152 := const 1                   // # => 1
      r153 := const 448                 // -2^63..2^63-1 => 448
      r154 := const 448                 // # => 448
      r155 := array ref r149 offset r154 // @<0..8> => 0..8
      r156 := index V_RANDOM            // @<P<OSVVM.RANDOMPKG.RANDOMPTYPE>> => P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      r157 := load indirect r156        // P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      r158 := const 64                  // -2^63..2^63-1 => 64
      r159 := const 9223372036854775807 // -2^63..2^63-1 => 2^63-1
      r160 := fcall OSVVM.RANDOMPKG.RANDOMPTYPE.RANDSLV(N)V r157, r158 // [*] : 0..8 => 0..8
      r161 := debug locus WORK.AXIQUEUEDMATP-body+12914 // D<>
      r162 := const 64                  // # => 64
      r163 := uarray len r160 dim 0     // #
      length check left r162 == right r163 locus r161
      r164 := unwrap r160               // @<0..8> => 0..8
      r155 := copy r164 count r162
      r165 := debug locus WORK.AXIQUEUEDMATP-body+12961 // D<>
      r166 := load indirect r156        // P<OSVVM.RANDOMPKG.RANDOMPTYPE>
      r167 := fcall OSVVM.RANDOMPKG.RANDOMPTYPE.RANDSLV(N)V r166, r158 // [*] : 0..8 => 0..8
      r168 := debug locus WORK.AXIQUEUEDMATP-body+12958 // D<>
      r169 := uarray len r167 dim 0     // #
      length check left r162 == right r169 locus r168
      r170 := unwrap r167               // @<0..8> => 0..8
      r155 := copy r170 count r162
      r171 := const 19                  // -2^63..2^63-1 => 19
      r172 := const 4                   // -2^63..2^63-1 => 4
      r173 := debug locus WORK.AXIQUEUEDMATP-body+13005 // D<>
      r174 := const 492                 // -2^63..2^63-1 => 492
      r175 := const 492                 // # => 492
      r176 := array ref r149 offset r175 // @<0..8> => 0..8
      r177 := link package IEEE.NUMERIC_STD // P<IEEE.NUMERIC_STD>
      r178 := load LEN                  // -2^63..2^63-1 => 0..65535
      r179 := const 16                  // -2^63..2^63-1 => 16
      r180 := fcall IEEE.NUMERIC_STD.TO_UNSIGNED(NN)36IEEE.NUMERIC_STD.UNRESOLVED_UNSIGNED r177, r178, r179 // [*] : 0..8 => 0..8
      r181 := uarray left r180 dim 0    // #
      r182 := uarray right r180 dim 0   // #
      r183 := uarray dir r180 dim 0     // 0..1
      r184 := unwrap r180               // @<0..8> => 0..8
      r185 := wrap r184 [r181 r182 r183] // [*] : 0..8
      r186 := cast r181                 // -2^63..2^63-1 => 0..2^63-1
      r187 := cast r182                 // -2^63..2^63-1 => 0..2^63-1
      r188 := range null left r186 right r187 dir r183 // 0..1
      cond r188 then 4 else 3
   3: r189 := debug locus STD.STANDARD+3425 // D<>
      r190 := debug locus WORK.AXIQUEUEDMATP-body+13013 // D<>
      jump 4
   4: r191 := debug locus WORK.AXIQUEUEDMATP-body+13002 // D<>
      r192 := const 16                  // # => 16
      r193 := uarray len r185 dim 0     // #
      length check left r192 == right r193 locus r191
      r194 := unwrap r185               // @<0..8> => 0..8
      r176 := copy r194 count r192
      r195 := load AXISM2S              // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S${}> => WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S{}
      r196 := record ref r195 field 0   // @<$<0..8>> => $<0..8>
      r197 := load indirect r196        // $<0..8>
      r198 := const 1                   // # => 1
      r199 := const 0                   // -2^63..2^63-1 => 0
      r200 := const 3                   // 0..8 => 3
      r201 := const 0                   // 0..8 => 0
      r202 := const 8                   // 0..8 => 8
      r203 := const 0                   // 0..1 => 0
      sched waveform r197 count r198 values r200 reject r199 after r199
      r204 := record ref r195 field 3   // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S${}> => WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S${}
      r205 := index tmp266              // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_TUSER_M2S{}>
      r206 := link package IEEE.NUMERIC_STD // P<IEEE.NUMERIC_STD>
      r207 := load QUEUE                // -2^63..2^63-1 => 0..3
      r208 := const 9223372036854775807 // -2^63..2^63-1 => 2^63-1
      r209 := const 11                  // -2^63..2^63-1 => 11
      r210 := fcall IEEE.NUMERIC_STD.TO_UNSIGNED(NN)36IEEE.NUMERIC_STD.UNRESOLVED_UNSIGNED r206, r207, r209 // [*] : 0..8 => 0..8
      r211 := uarray left r210 dim 0    // #
      r212 := uarray right r210 dim 0   // #
      r213 := uarray dir r210 dim 0     // 0..1
      r214 := unwrap r210               // @<0..8> => 0..8
      r215 := wrap r214 [r211 r212 r213] // [*] : 0..8
      r216 := cast r211                 // -2^63..2^63-1 => 0..2^63-1
      r217 := cast r212                 // -2^63..2^63-1 => 0..2^63-1
      r218 := range null left r216 right r217 dir r213 // 0..1
      cond r218 then 6 else 5
   5: r219 := debug locus STD.STANDARD+3425 // D<>
      r220 := debug locus WORK.AXIQUEUEDMATP-body+13072 // D<>
      jump 6
   6: r221 := debug locus WORK.AXIQUEUEDMAP+931 // D<>
      r222 := const 11                  // # => 11
      r223 := uarray len r215 dim 0     // #
      length check left r222 == right r223 locus r221
      r224 := unwrap r215               // @<0..8> => 0..8
      r225 := const 2                   // 0..8 => 2
      r226 := const [r225,r225]         // [2] : 0..8 => 0..8
      r227 := address of r226           // @<0..8> => 0..8
      r228 := debug locus WORK.AXIQUEUEDMAP+953 // D<>
      r229 := const 2                   // # => 2
      r230 := debug locus WORK.AXIQUEUEDMAP+975 // D<>
      r231 := const [r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225,r225] // [16] : 0..8 => 0..8
      r232 := address of r231           // @<0..8> => 0..8
      r233 := debug locus WORK.AXIQUEUEDMAP+997 // D<>
      r234 := const 16                  // # => 16
      r235 := record ref r205 field 0   // @<0..8> => 0..8
      r235 := copy r224 count r222
      r236 := record ref r205 field 1   // @<0..8> => 0..8
      r236 := copy r227 count r229
      r237 := record ref r205 field 2   // @<0..8> => 0..8
      r237 := copy r227 count r229
      r238 := record ref r205 field 3   // @<0..8> => 0..8
      r238 := copy r232 count r234
      r239 := debug locus WORK.AXIQUEUEDMATP-body+13093 // D<>
      r240 := record ref r204 field 0   // @<$<0..8>> => $<0..8>
      r241 := load indirect r240        // $<0..8>
      sched waveform r241 count r222 values r235 reject r199 after r199
      r242 := record ref r204 field 1   // @<$<0..8>> => $<0..8>
      r243 := load indirect r242        // $<0..8>
      sched waveform r243 count r229 values r236 reject r199 after r199
      r244 := record ref r204 field 2   // @<$<0..8>> => $<0..8>
      r245 := load indirect r244        // $<0..8>
      sched waveform r245 count r229 values r237 reject r199 after r199
      r246 := record ref r204 field 3   // @<$<0..8>> => $<0..8>
      r247 := load indirect r246        // $<0..8>
      sched waveform r247 count r234 values r238 reject r199 after r199
      r248 := load AXISM2S              // @<WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S${}> => WORK.AXIQUEUEDMAP.T_AXIS_CMP_M2S{}
      r249 := record ref r248 field 1   // @<$<0..8>> => $<0..8>
      r250 := load indirect r249        // $<0..8>
      r251 := const 1                   // # => 1
      r252 := const 0                   // -2^63..2^63-1 => 0
      r253 := const 3                   // 0..8 => 3
      r254 := const 0                   // 0..8 => 0
      r255 := const 8                   // 0..8 => 8
      r256 := const 0                   // 0..1 => 0
      sched waveform r250 count r251 values r253 reject r252 after r252
      r257 := record ref r248 field 2   // @<$<0..8>> => $<0..8>
      r258 := load indirect r257        // $<0..8>
      r259 := const 512                 // # => 512
      r260 := index V_DATA              // @<0..8> => 0..8
      r261 := debug locus WORK.AXIQUEUEDMATP-body+13158 // D<>
      sched waveform r258 count r259 values r260 reject r252 after r252
      r262 := load CMPQUEUE             // @<P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>> => P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>
      r263 := load indirect r262        // P<WORK.AXIQUEUEDMATP.CMPQUEUE.T_QUEUE>
      r264 := const 63                  // -2^63..2^63-1 => 63
      r265 := const 1                   // 0..1 => 1
      r266 := const 511                 // -2^63..2^63-1 => 511
      r267 := debug locus WORK.AXIQUEUEDMATP-body+13192 // D<>
      r268 := const 448                 // -2^63..2^63-1 => 448
      r269 := const 448                 // # => 448
      r270 := array ref r260 offset r269 // @<0..8> => 0..8
      r271 := debug locus WORK.AXIQUEUEDMATP+9220 // D<>
      r272 := const 64                  // # => 64
      r273 := load QUEUE                // -2^63..2^63-1 => 0..3

** Fatal: missing variable for generic G_QUEUE_COUNT in WORK.AXIQUEUEDMATP
[0x5616e0720854] ../src/diag.c:1014 diag_femit
[0x5616e0720854] ../src/diag.c:1039 diag_emit
[0x5616e0668c9f] ../src/util.c:585 fatal_trace
[0x5616e06eeb11] ../src/lower.c:2915 lower_ref
[0x5616e06eeb11] ../src/lower.c:5159 lower_expr.lto_priv.0
[0x5616e07067e3] ../src/lower.c:12630 lower_rvalue
[0x5616e06e341a] ../src/lower.c:1129 lower_subprogram_arg.lto_priv.0
[0x5616e0708d5e] ../src/lower.c:2207 lower_builtin.part.0.lto_priv.0
[0x5616e06ecc37] ../src/lower.c:5153 lower_expr.lto_priv.0
[0x5616e07067e3] ../src/lower.c:12630 lower_rvalue
[0x5616e06e0d81] ../src/lower.c:916 lower_check_scalar_bounds.lto_priv.0
[0x5616e06e3079] ../src/lower.c:1152 lower_subprogram_arg.lto_priv.0
[0x5616e06f0f76] ../src/lower.c:6480 lower_sequence.lto_priv.0
[0x5616e070153b] ../src/lower.c:10990 lower_proc_body
[0x5616e0702a77] ../src/lower.c:13153 unit_registry_get
[0x5616e06e4537] ../src/lower.c:2433 lower_context_for_call.lto_priv.0
[0x5616e06f0f03] ../src/lower.c:6476 lower_sequence.lto_priv.0
[0x5616e06f0148] ../src/lower.c:6632 lower_sequence.lto_priv.0
[0x5616e06c594d] ../src/lower.c:11353 elab_stmts.lto_priv.0
[0x5616e06bf0bb] ../src/elab.c:1474 elab_architecture.lto_priv.0
[0x5616e0664e11] ../src/elab.c:2226 elab
[0x5616e0664e11] ../src/elab.c:464 elaborate
[0x5616e06611e3] ../src/nvc.c:1922 process_command
[0x5616e065d246] ../src/nvc.c:2060 main

Please report this bug at https://github.com/nickg/nvc/issues

I wasn't able to create a MWE yet. The generic package instances are created in another package, here is an excerpt:

  constant C_QUEUE_COUNT         : positive := 4;
  constant C_QUEUE_MAX_SIZE      : positive := 65535;

  -- This works
  package H2cQueue is new Simulation.QueueP
    generic map (G_QUEUE_COUNT => 4,
                 G_QUEUE_DEPTH => C_QUEUE_MAX_SIZE,
                 G_DATA_TYPE   => t_dma_desc,
                 G_TO_STRING   => to_string
    );

  shared variable sv_h2c_queue : H2cQueue.t_queue;

  -- This not
  package C2hQueue is new Simulation.QueueP
    generic map (G_QUEUE_COUNT => C_QUEUE_COUNT,
                 G_QUEUE_DEPTH => C_QUEUE_MAX_SIZE,
                 G_DATA_TYPE   => t_axi_data,
                 G_TO_STRING   => to_string
    );

  shared variable sv_c2h_queue : H2cQueue.t_queue;

The public part of the QueueP package is as follows:

package QueueP is

  generic (G_QUEUE_COUNT : positive := 1;
           G_QUEUE_DEPTH : positive := 4096 / 8 + 5;
           type G_DATA_TYPE;
           function G_TO_STRING(data : G_DATA_TYPE) return string is to_string
  );

  subtype t_queue_count is natural range 0 to G_QUEUE_COUNT - 1;

  type t_queue is protected

    procedure init (data : in  G_DATA_TYPE; logging : in boolean;
                    parent_name : string := ""; level : LogType := INFO);
    procedure push (data : in  G_DATA_TYPE; queue : in t_queue_count := 0);
    procedure pop  (data : out G_DATA_TYPE; queue : in t_queue_count := 0);
    impure function pop  (queue : in t_queue_count := 0) return G_DATA_TYPE;
    impure function empty     (queue : in t_queue_count := 0) return boolean;
    impure function full      (queue : in t_queue_count := 0) return boolean;
    impure function fillstate (queue : in t_queue_count := 0) return natural;
    impure function freeslots (queue : in t_queue_count := 0) return natural;

  end protected t_queue;

end package QueueP;

nvc Version:

$ nvc --version
nvc 1.13-devel (1.12.0.r41.g3edb4fec) (Using LLVM 14.0.6)
Copyright (C) 2011-2024  Nick Gasson
This program comes with ABSOLUTELY NO WARRANTY. This is free software, and
you are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.

I will post the code of an MWE if I'm successful to create one.

nickg commented 1 month ago

Here's a minimal way to reproduce it:

package QueueP is

    generic (G_QUEUE_COUNT : positive := 1;
             G_QUEUE_DEPTH : positive := 4096 / 8 + 5;
             type G_DATA_TYPE;
             function G_TO_STRING(data : G_DATA_TYPE) return string is to_string);

    subtype t_queue_count is natural range 0 to G_QUEUE_COUNT - 1;

    procedure test (x : t_queue_count);
end package QueueP;

package body QueueP is

    procedure test (x : t_queue_count) is
    begin
    end procedure;

end package body;

-------------------------------------------------------------------------------

package pack is
    constant C_QUEUE_COUNT         : positive := 4;
    constant C_QUEUE_MAX_SIZE      : positive := 65535;

    package C2hQueue is new work.QueueP
        generic map (G_QUEUE_COUNT => C_QUEUE_COUNT,
                     G_QUEUE_DEPTH => C_QUEUE_MAX_SIZE,
                     G_DATA_TYPE   => bit_vector(7 downto 0),
                     G_TO_STRING   => to_string);
end package;

-------------------------------------------------------------------------------

entity issue894 is
end entity;

use work.pack.all;

architecture test of issue894 is
begin

    tb: process is
        variable v : natural;
    begin
        C2hQueue.test(v);
        wait;
    end process;

end architecture;
nickg commented 1 month ago

@tmeissner please test again with the latest master branch.

tmeissner commented 1 month ago

Thanks. The reported error is gone now. Now I get another error with my DUT design, I'll open a separate issue for that.

The strange thing is, that the new error is emitted for a file which is analyzed before the file caused this issue here 🧐 So I'm not really sure if the fix really works, as the file isn't analyzed anymore now.

tmeissner commented 1 month ago

The error I got now with another file, even before analyzing the package above:

nvc --std=19 --work=work -L ./ -a ../../src/QueueHandlingE.vhd
** Fatal: type kind T_INTEGER does not have item I_ELEM
[0x5612f8a3a8e9] ../src/object.c:254 object_lookup_failed
[0x5612f8a34224] ../src/type.c:329 type_elem.cold
[0x5612f8a556cd] ../src/parse.c:1946 get_subtype_for.lto_priv.0
[0x5612f8a5bfcd] ../src/parse.c:1990 apply_subtype_attribute
[0x5612f8a5bfcd] ../src/parse.c:2101 apply_type_attribute
[0x5612f8a5bfcd] ../src/parse.c:3287 p_attribute_name
[0x5612f8a5d3af] ../src/parse.c:3719 p_name.lto_priv.0
[0x5612f8a5add6] ../src/parse.c:4382 p_primary.lto_priv.0
[0x5612f8a5f84e] ../src/parse.c:4480 p_factor
[0x5612f8a5fbb9] ../src/parse.c:4519 p_term
[0x5612f8a5fe8d] ../src/parse.c:4574 p_simple_expression
[0x5612f8a6022a] ../src/parse.c:4612 p_shift_expression
[0x5612f8a606b9] ../src/parse.c:1505 p_relation
[0x5612f8a5a65a] ../src/parse.c:4693 p_expression_with_head.lto_priv.0
[0x5612f8a5aa2a] ../src/parse.c:4731 p_expression
[0x5612f8a5aa2a] ../src/parse.c:4259 p_aggregate_or_expression
[0x5612f8a5af8d] ../src/parse.c:4368 p_primary.lto_priv.0
[0x5612f8a5f84e] ../src/parse.c:4480 p_factor
[0x5612f8a5fbb9] ../src/parse.c:4519 p_term
[0x5612f8a5fe8d] ../src/parse.c:4574 p_simple_expression
[0x5612f8a6022a] ../src/parse.c:4612 p_shift_expression
[0x5612f8a60579] ../src/parse.c:4669 p_relation
[0x5612f8a5a65a] ../src/parse.c:4693 p_expression_with_head.lto_priv.0
[0x5612f8a63a9a] ../src/parse.c:4731 p_expression
[0x5612f8a63a9a] ../src/parse.c:6782 p_condition.lto_priv.0
[0x5612f8a76a5d] ../src/parse.c:9848 p_if_statement
[0x5612f8a76a5d] ../src/parse.c:10286 p_sequential_statement.lto_priv.0
[0x5612f8a6c80f] ../src/parse.c:8059 p_sequence_of_statements.lto_priv.0
[0x5612f8a6e523] ../src/parse.c:8122 p_subprogram_body.lto_priv.0
[0x5612f8a728d7] ../src/parse.c:9285 p_block_declarative_item.lto_priv.0
[0x5612f8a7e549] ../src/parse.c:12585 p_architecture_body
[0x5612f8a7e549] ../src/parse.c:12857 p_secondary_unit
[0x5612f8a7ee07] ../src/parse.c:12883 p_design_unit
[0x5612f8a7ee07] ../src/parse.c:12997 parse
[0x5612f8abb8e2] ../src/common.c:2421 analyse_file.part.0
[0x5612f8a45beb] ../src/nvc.c:2415 analyse
[0x5612f8a45beb] ../src/common.c:1920 process_command
[0x5612f8a414d6] ../src/nvc.c:2060 main

Please report this bug at https://github.com/nickg/nvc/issues

This does not occur with older versions of nvc before the latest commits.

nickg commented 1 month ago

The error I got now with another file, even before analyzing the package above:

I think this should be fixed now, could you test again?

tmeissner commented 1 month ago

This is fixed now, thanks for your efforts 👌