1
1
module converter (input signed [7 : 0 ] si, input unsigned [7 : 0 ] ui);
2
2
3
+ // 1800-2017 10.7 Assignment extension and truncation
4
+
3
5
// enlarge
6
+ // The RHS is padded or sign extended.
4
7
wire signed [31 : 0 ] sw1 = ui; // unsigned 8 to signed 32
5
8
wire signed [31 : 0 ] sw2 = si; // signed 8 to signed 32
6
9
wire unsigned [31 : 0 ] uw1 = ui; // unsigned 8 to unsigned 32
7
10
wire unsigned [31 : 0 ] uw2 = si; // signed 8 to unsigned 32
8
11
9
12
// 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.
10
16
wire signed [3 : 0 ] sn1 = ui; // unsigned 8 to signed 4
11
17
wire signed [3 : 0 ] sn2 = si; // signed 8 to signed 4
12
18
wire unsigned [3 : 0 ] un1 = ui; // unsigned 8 to unsigned 4
@@ -22,20 +28,20 @@ endmodule
22
28
23
29
module main ;
24
30
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 );
39
45
40
46
initial begin
41
47
$display (" c.sw1 == " , c.sw1);
0 commit comments