Fix X/Z extension with WIDTH param mismatch, bug764.

This commit is contained in:
Wilson Snyder 2014-05-10 21:38:36 -04:00
parent 56b85cc63c
commit f8f53df4ec
2 changed files with 16 additions and 3 deletions

View File

@ -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))] ); }

View File

@ -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