diff --git a/src/V3Number.h b/src/V3Number.h index 081644d45..2caba3e20 100644 --- a/src/V3Number.h +++ b/src/V3Number.h @@ -61,10 +61,8 @@ public: private: char bitIs (int bit) const { if (bit>=m_width) { - bit = m_width-1; // We never sign extend - return ( "00zx"[(((m_value[bit/32] & (1UL<<(bit&31)))?1:0) - | ((m_valueX[bit/32] & (1UL<<(bit&31)))?2:0))] ); + return '0'; } return ( "01zx"[(((m_value[bit/32] & (1UL<<(bit&31)))?1:0) | ((m_valueX[bit/32] & (1UL<<(bit&31)))?2:0))] ); } diff --git a/test_regress/t/t_math_arith.v b/test_regress/t/t_math_arith.v index 36f993e6e..f39fa0376 100644 --- a/test_regress/t/t_math_arith.v +++ b/test_regress/t/t_math_arith.v @@ -42,6 +42,10 @@ module t (/*AUTOARG*/ wire one = 1'b1; wire [5:0] rep6 = {6{one}}; + // verilator lint_off WIDTH + localparam [3:0] bug764_p11 = 1'bx; + // verilator lint_on WIDTH + always @ (posedge clk) begin if (!_ranit) begin _ranit <= 1; @@ -119,6 +123,17 @@ module t (/*AUTOARG*/ if ((~& 4'b1101) != 4'b0001) $stop; //verilator lint_on WIDTH + // bug764 + //verilator lint_off WIDTH + // X does not sign extend + if (bug764_p11 !== 4'b000x) $stop; + if (~& bug764_p11 !== 1'b1) $stop; + //verilator lint_on WIDTH + // However IEEE says for constants in 2012 5.7.1 that smaller-sizes do extend + if (4'bx !== 4'bxxxx) $stop; + if (4'bz !== 4'bzzzz) $stop; + if (4'b1 !== 4'b0001) $stop; + $write("*-* All Finished *-*\n"); $finish; end