mirror of
https://github.com/zachjs/sv2v.git
synced 2026-09-03 08:33:46 +02:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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}};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user