diff --git a/src/V3Undriven.cpp b/src/V3Undriven.cpp index 36320fb0e..06636dfa8 100644 --- a/src/V3Undriven.cpp +++ b/src/V3Undriven.cpp @@ -75,7 +75,7 @@ public: private: // METHODS - inline bool bitNumOk(int bit) const { return (bit*FLAGS_PER_BIT < (int)m_flags.size()); } + inline bool bitNumOk(int bit) const { return bit>=0 && (bit*FLAGS_PER_BIT < (int)m_flags.size()); } inline bool usedFlag(int bit) const { return m_usedWhole || m_flags[bit*FLAGS_PER_BIT + FLAG_USED]; } inline bool drivenFlag(int bit) const { return m_drivenWhole || m_flags[bit*FLAGS_PER_BIT + FLAG_DRIVEN]; } enum BitNamesWhich { BN_UNUSED, BN_UNDRIVEN, BN_BOTH }; diff --git a/test_regress/t/t_select_runtime_range.v b/test_regress/t/t_select_runtime_range.v index af2a5dc16..85e32018c 100644 --- a/test_regress/t/t_select_runtime_range.v +++ b/test_regress/t/t_select_runtime_range.v @@ -8,8 +8,27 @@ module t (clk); reg [43:0] mi; reg [5:0] index; + integer indexi; reg read; + initial begin + // Static + mi = 44'b01010101010101010101010101010101010101010101; + if (mi[0] !== 1'b1) $stop; + if (mi[1 -: 2] !== 2'b01) $stop; +`ifdef VERILATOR + // verilator lint_off SELRANGE + if (mi[-1] !== 1'bx && mi[-1] !== 1'b0) $stop; + if (mi[0 -: 2] !== 2'b1x && 1'b0) $stop; + if (mi[-1 -: 2] !== 2'bxx && 1'b0) $stop; + // verilator lint_on SELRANGE +`else + if (mi[-1] !== 1'bx) $stop; + if (mi[0 -: 2] !== 2'b1x) $stop; + if (mi[-1 -: 2] !== 2'bxx) $stop; +`endif + end + integer cyc; initial cyc=1; always @ (posedge clk) begin if (cyc!=0) begin @@ -19,18 +38,33 @@ module t (clk); end if (cyc==2) begin index = 6'd43; + indexi = 43; end if (cyc==3) begin read = mi[index]; if (read!==1'b0) $stop; + read = mi[indexi]; + if (read!==1'b0) $stop; end if (cyc==4) begin index = 6'd44; + indexi = 44; end if (cyc==5) begin read = mi[index]; $display("-Illegal read value: %x",read); //if (read!==1'b1 && read!==1'bx) $stop; + read = mi[indexi]; + $display("-Illegal read value: %x",read); + //if (read!==1'b1 && read!==1'bx) $stop; + end + if (cyc==6) begin + indexi = -1; + end + if (cyc==7) begin + read = mi[indexi]; + $display("-Illegal read value: %x",read); + //if (read!==1'b1 && read!==1'bx) $stop; end if (cyc==10) begin $write("*-* All Finished *-*\n");