refactor cast conversion

- delegate cast type and sign resolution to TypeOf conversion
- internal support for injecting data declarations into statements
- fix size and sign of unbased unsized literals used in casts
- avoid generating many unnecessary explicit casts
- support casts which depend on localparams within procedures
- expression traversal correctly visits types within type casts
- fix typeof on expressions of net types
- handle additional edge cases for unsized integer array patterns
- preserve signedness of implicitly flattened unpacked integer arrays
This commit is contained in:
Zachary Snow
2021-02-03 16:28:53 -05:00
parent c656cbb977
commit dd1a9efb40
28 changed files with 647 additions and 312 deletions
+15
View File
@@ -52,4 +52,19 @@ module top;
$display("%b", W'(j));
end
typedef integer T1;
typedef integer signed T2;
typedef integer unsigned T3;
initial begin
$display("T1 %0d", T1'(1'sb1));
$display("T2 %0d", T2'(1'sb1));
$display("T3 %0d", T3'(1'sb1));
$display("T1 %0d", T1'(32'sd1));
$display("T2 %0d", T2'(32'sd1));
$display("T3 %0d", T3'(32'sd1));
$display("T1 %0d", T1'(32'd1));
$display("T2 %0d", T2'(32'd1));
$display("T3 %0d", T3'(32'd1));
end
endmodule
+12
View File
@@ -61,4 +61,16 @@ module top;
$display("%b", j_extended);
end
initial begin
$display("T1 %0d", -1);
$display("T2 %0d", -1);
$display("T3 %0d", 32'hFFFF_FFFF);
$display("T1 %0d", 1);
$display("T2 %0d", 1);
$display("T3 %0d", 1);
$display("T1 %0d", 1);
$display("T2 %0d", 1);
$display("T3 %0d", 1);
end
endmodule
+15
View File
@@ -0,0 +1,15 @@
module top;
reg signed x;
initial x = 1;
parameter ONE = 1;
initial begin
localparam A = ONE * 1;
localparam B = ONE * 2;
localparam C = ONE * 3;
localparam D = ONE * 4;
localparam E = ONE * 5;
$display("%b", 5'(4'(3'(2'(1'(x))))));
$display("%b", E'(D'(C'(B'(A'(x))))));
$display("%b", E'(D'(C'(B'(A'(E'(D'(C'(B'(A'(x)))))))))));
end
endmodule
+12
View File
@@ -0,0 +1,12 @@
module top;
reg signed x;
initial x = 1;
parameter ONE = 1;
initial begin : blk
reg signed [4:0] y;
y = x;
$display("%b", y);
$display("%b", y);
$display("%b", y);
end
endmodule
+25
View File
@@ -0,0 +1,25 @@
`define TEST_CAST(expr, prefix, typ) \
initial begin \
localparam type T = type(prefix``typ); \
logic [63:0] x; \
T y; \
x = T'(expr); \
y = expr; \
r``typ = expr; \
tmp = r``typ; \
$display(`"%b => prefix``typ %b %b %b`", expr, T'(expr), x, y); \
end
module top;
wire foo;
type(foo) bar;
initial bar = 1;
`include "cast_nettype.vh"
`TEST('1)
`TEST('x)
`TEST(1)
`TEST(2)
`TEST(-1)
endmodule
+20
View File
@@ -0,0 +1,20 @@
`define TEST_CAST(expr, prefix, typ) \
initial begin \
r``typ = expr; \
tmp = r``typ; \
$display(`"%b => prefix``typ %b %b %b`", expr, r``typ, tmp, r``typ); \
end
module top;
wire foo;
reg bar;
initial bar = 1;
`include "cast_nettype.vh"
`TEST(1'sb1)
`TEST(1'sbx)
`TEST(1)
`TEST(2)
`TEST(-1)
endmodule
+31
View File
@@ -0,0 +1,31 @@
`define TEST(expr) \
`TEST_CAST(expr, w, t1) \
`TEST_CAST(expr, w, t2) \
`TEST_CAST(expr, w, t3) \
`TEST_CAST(expr, w, s1) \
`TEST_CAST(expr, w, s2) \
`TEST_CAST(expr, w, s3) \
`TEST_CAST(expr, r, t1) \
`TEST_CAST(expr, r, t2) \
`TEST_CAST(expr, r, t3) \
`TEST_CAST(expr, r, s1) \
`TEST_CAST(expr, r, s2) \
`TEST_CAST(expr, r, s3)
wire wt1;
wire signed wt2;
wire unsigned wt3;
wire [1:0] ws1;
wire signed [1:0] ws2;
wire unsigned [1:0] ws3;
reg rt1;
reg signed rt2;
reg unsigned rt3;
reg [1:0] rs1;
reg signed [1:0] rs2;
reg unsigned [1:0] rs3;
reg [63:0] tmp;
+31
View File
@@ -0,0 +1,31 @@
`define EXPR $unsigned(WIDTH'(ONES))
`define TEST(size) \
localparam WIDTH = ONE * size; \
localparam x = $unsigned(WIDTH'(ONES)); \
integer y, z; \
localparam type T = logic [WIDTH-1:0]; \
y = T'(ones); \
z = $unsigned(WIDTH'(ones)); \
$display(`"size: %b %b %b %b`", x, y, z, $unsigned(WIDTH'(ones)));
module top;
parameter ONE = 1;
parameter signed [0:0] ONES = 1'sb1;
logic signed [0:0] ones;
initial ones = 1'sb1;
task t;
`TEST(6)
endtask
function f;
input integer unused;
`TEST(7)
endfunction
initial t;
initial begin
integer a;
a = f(0);
end
initial begin
`TEST(8)
end
endmodule
+32
View File
@@ -0,0 +1,32 @@
`define TEST(size) \
localparam WIDTH = ONE * size; \
localparam [WIDTH-1:0] short = ONES; \
integer long; \
long = short; \
$display(`"size: %b %b %b %b`", short, long, long, short);
module top;
parameter ONE = 1;
parameter signed [0:0] ONES = 1'sb1;
reg signed [0:0] ones;
initial ones = 1'sb1;
task t;
begin : blk1
`TEST(6)
end
endtask
function f;
input integer unused;
begin : blk2
`TEST(7)
end
endfunction
initial t;
initial begin : blk3
integer a;
a = f(0);
end
initial begin : blk4
`TEST(8)
end
endmodule
+14
View File
@@ -0,0 +1,14 @@
module top;
typedef struct packed {
logic x, y;
} S;
typedef struct packed {
S x, y;
} T;
T t;
initial begin
t = 1'sb1;
$display("%b", t);
$display("%b", 5'(t));
end
endmodule
+10
View File
@@ -0,0 +1,10 @@
module top;
reg [3:0] t;
initial begin : blk
reg [4:0] x;
t = 1'sb1;
x = t;
$display("%b", t);
$display("%b", x);
end
endmodule
+2 -6
View File
@@ -1,11 +1,7 @@
module top;
wire b;
wire [1:0] a;
function automatic val;
input inp;
val = inp;
endfunction
assign b = val(1);
assign a = {2 {val(1)}};
assign b = 1'b1;
assign a = {2 {1'b1}};
initial #1 $display("%b %b", a, b);
endmodule
+13
View File
@@ -1,4 +1,5 @@
module top;
parameter ONE = 1;
localparam integer A [4] = { 1, 2, 3, 4 };
localparam byte B [4] = { 1, 2, 3, 4 };
localparam bit C [4] = { 1, 2, 3, 4 };
@@ -8,6 +9,12 @@ module top;
localparam integer G [4] = '{ 1, 2, 3, 4 };
localparam byte H [4] = '{ 1, 2, 3, 4 };
localparam bit I [4] = '{ 1, 2, 3, 4 };
localparam integer J [4] = { ONE * '0, ONE * '1, 5 * ONE, ONE * 6 };
localparam byte K [4] = { ONE * '0, ONE * '1, 5 * ONE, ONE * 6 };
localparam bit L [4] = { '0, ONE * '1, 5 * ONE, ONE * 6 };
localparam integer unsigned M [4] = { ONE * '0, ONE * '1, 5 * ONE, ONE * 6 };
localparam byte unsigned N [4] = { ONE * '0, ONE * '1, 5 * ONE, ONE * 6 };
localparam bit unsigned O [4] = { '0, ONE * '1, 5 * ONE, ONE * 6 };
initial begin
`define PRINT(X) \
$display("%b %2d %2d", {X[0], X[1], X[2], X[3]}, $bits(X), $bits(X[0]));
@@ -20,6 +27,12 @@ module top;
`PRINT(G);
`PRINT(H);
`PRINT(I);
`PRINT(J);
`PRINT(K);
`PRINT(L);
`PRINT(M);
`PRINT(N);
`PRINT(O);
end
localparam [1:0][0:1] P = '{'{default:'d1}, '{default:'d2}};
+12
View File
@@ -8,6 +8,12 @@ module top;
localparam [0:127] G = { 32'h1, 32'h2, 32'h3, 32'h4 };
localparam [0:31] H = { 8'h1, 8'h2, 8'h3, 8'h4 };
localparam [0:3] I = { 1'h1, 1'h0, 1'h1, 1'h0 };
localparam [0:127] J = { 32'h0, 32'hFFFFFFFF, 32'h5, 32'h6 };
localparam [0:31] K = { 8'h0, 8'hFF, 8'h5, 8'h6 };
localparam [0:3] L = { 1'h0, 1'h1, 1'h1, 1'h0 };
localparam [0:127] M = { 32'h0, 32'hFFFFFFFF, 32'h5, 32'h6 };
localparam [0:31] N = { 8'h0, 8'hFF, 8'h5, 8'h6 };
localparam [0:3] O = { 1'h0, 1'h1, 1'h1, 1'h0 };
initial begin
$display("%b %2d %2d", A, $bits(A), 32);
$display("%b %2d %2d", B, $bits(B), 8);
@@ -18,6 +24,12 @@ module top;
$display("%b %2d %2d", G, $bits(G), 32);
$display("%b %2d %2d", H, $bits(H), 8);
$display("%b %2d %2d", I, $bits(I), 1);
$display("%b %2d %2d", J, $bits(J), 32);
$display("%b %2d %2d", K, $bits(K), 8);
$display("%b %2d %2d", L, $bits(L), 1);
$display("%b %2d %2d", M, $bits(M), 32);
$display("%b %2d %2d", N, $bits(N), 8);
$display("%b %2d %2d", O, $bits(O), 1);
end
localparam [3:0] P = 4'b1100;
+12
View File
@@ -3,6 +3,8 @@ module top;
logic [2:0] test;
logic [3:0] foo;
logic [3:0] bar;
integer x;
reg [7:0] y;
initial begin
test = BW'(0);
@@ -11,5 +13,15 @@ module top;
$display(foo);
bar = $bits(bar)'('1);
$display(bar);
x = 1'('1); $display("%b %0d", x, x);
y = 1'('1); $display("%b %0d", y, y);
x = 2'('0); $display("%b %0d", x, x);
y = 2'('0); $display("%b %0d", y, y);
x = 2'('1); $display("%b %0d", x, x);
y = 2'('1); $display("%b %0d", y, y);
x = 2'('x); $display("%b %0d", x, x);
y = 2'('x); $display("%b %0d", y, y);
x = 2'('z); $display("%b %0d", x, x);
y = 2'('z); $display("%b %0d", y, y);
end
endmodule
+12
View File
@@ -2,6 +2,8 @@ module top;
reg [2:0] test;
reg [3:0] foo;
reg [3:0] bar;
integer x;
reg [7:0] y;
initial begin
test = 0;
@@ -10,5 +12,15 @@ module top;
$display(foo);
bar = 4'b1111;
$display(bar);
x = 1'b1; $display("%b %0d", x, x);
y = 1'b1; $display("%b %0d", y, y);
x = 2'b00; $display("%b %0d", x, x);
y = 2'b00; $display("%b %0d", y, y);
x = 2'b11; $display("%b %0d", x, x);
y = 2'b11; $display("%b %0d", y, y);
x = 2'bxx; $display("%b %0d", x, x);
y = 2'bxx; $display("%b %0d", y, y);
x = 2'bzz; $display("%b %0d", x, x);
y = 2'bzz; $display("%b %0d", y, y);
end
endmodule
+4
View File
@@ -192,4 +192,8 @@ module top;
`ASSERT_UNSIGNED(arr[5:0])
`ASSERT_UNSIGNED(arr[1+:2])
`ASSERT_UNSIGNED(arr[1-:2])
`ASSERT_UNSIGNED(integer_signed[0])
`ASSERT_UNSIGNED(integer_signed[1])
`ASSERT_UNSIGNED(integer_unsigned[0])
`ASSERT_UNSIGNED(integer_unsigned[1])
endmodule