11module converter (input signed [7 : 0 ] si, input unsigned [7 : 0 ] ui);
22
3+ // 1800-2017 10.7 Assignment extension and truncation
4+
35 // enlarge
6+ // The RHS is padded or sign extended.
47 wire signed [31 : 0 ] sw1 = ui; // unsigned 8 to signed 32
58 wire signed [31 : 0 ] sw2 = si; // signed 8 to signed 32
69 wire unsigned [31 : 0 ] uw1 = ui; // unsigned 8 to unsigned 32
710 wire unsigned [31 : 0 ] uw2 = si; // signed 8 to unsigned 32
811
912 // shrink
13+ // The RHS is truncated.
14+ // Icarus Verilog yields 'z' for this, but the standard requires
15+ // truncation. VCS, Questa, Xcelium, Riviera implement this.
1016 wire signed [3 : 0 ] sn1 = ui; // unsigned 8 to signed 4
1117 wire signed [3 : 0 ] sn2 = si; // signed 8 to signed 4
1218 wire unsigned [3 : 0 ] un1 = ui; // unsigned 8 to unsigned 4
@@ -22,20 +28,20 @@ endmodule
2228
2329module main ;
2430
25- converter c (8'sb1000_0000 , 8'b1000_0000 );
26-
27- assert final (c.sw1 == 128 );
28- assert final (c.sw2 == - 128 );
29- assert final (c.uw1 == 128 );
30- assert final (c.uw2 == 4294967168 );
31- assert final (c.sn1 == 'z );
32- assert final (c.sn2 == 'z );
33- assert final (c.un1 == 'z );
34- assert final (c.un2 == 'z );
35- assert final (c.sb1 == - 128 );
36- assert final (c.sb2 == - 128 );
37- assert final (c.ub1 == 128 );
38- assert final (c.ub2 == 128 );
31+ converter c (8'sb1000_1000 , 8'b1000_1000 );
32+
33+ assert final (c.sw1 == 136 );
34+ assert final (c.sw2 == - 120 );
35+ assert final (c.uw1 == 136 );
36+ assert final (c.uw2 == 4294967176 );
37+ assert final (c.sn1 == - 8 );
38+ assert final (c.sn2 == - 8 );
39+ assert final (c.un1 == 8 );
40+ assert final (c.un2 == 8 );
41+ assert final (c.sb1 == - 120 );
42+ assert final (c.sb2 == - 120 );
43+ assert final (c.ub1 == 136 );
44+ assert final (c.ub2 == 136 );
3945
4046 initial begin
4147 $display (" c.sw1 == " , c.sw1);
0 commit comments