mirror of
https://github.com/YosysHQ/yosys
synced 2025-08-18 09:12:18 +00:00
Merge pull request #2529 from zachjs/unnamed-genblk
verilog: significant block scoping improvements
This commit is contained in:
commit
baf1875307
33 changed files with 783 additions and 262 deletions
33
tests/simple/func_block.v
Normal file
33
tests/simple/func_block.v
Normal file
|
@ -0,0 +1,33 @@
|
|||
`default_nettype none
|
||||
|
||||
module top(inp, out1, out2, out3);
|
||||
input wire [31:0] inp;
|
||||
|
||||
function automatic [31:0] func1;
|
||||
input [31:0] inp;
|
||||
reg [31:0] idx;
|
||||
for (idx = 0; idx < 32; idx = idx + 1) begin : blk
|
||||
func1[idx] = (idx & 1'b1) ^ inp[idx];
|
||||
end
|
||||
endfunction
|
||||
|
||||
function automatic [31:0] func2;
|
||||
input [31:0] inp;
|
||||
reg [31:0] idx;
|
||||
for (idx = 0; idx < 32; idx = idx + 1) begin : blk
|
||||
func2[idx] = (idx & 1'b1) ^ inp[idx];
|
||||
end
|
||||
endfunction
|
||||
|
||||
function automatic [31:0] func3;
|
||||
localparam A = 32 - 1;
|
||||
parameter B = 1 - 0;
|
||||
input [31:0] inp;
|
||||
func3[A:B] = inp[A:B];
|
||||
endfunction
|
||||
|
||||
output wire [31:0] out1, out2, out3;
|
||||
assign out1 = func1(inp);
|
||||
assign out2 = func2(inp);
|
||||
assign out3 = func3(inp);
|
||||
endmodule
|
25
tests/simple/func_recurse.v
Normal file
25
tests/simple/func_recurse.v
Normal file
|
@ -0,0 +1,25 @@
|
|||
module top(
|
||||
input wire [3:0] inp,
|
||||
output wire [3:0] out1, out2
|
||||
);
|
||||
function automatic [3:0] pow_a;
|
||||
input [3:0] base, exp;
|
||||
begin
|
||||
pow_a = 1;
|
||||
if (exp > 0)
|
||||
pow_a = base * pow_a(base, exp - 1);
|
||||
end
|
||||
endfunction
|
||||
|
||||
function automatic [3:0] pow_b;
|
||||
input [3:0] base, exp;
|
||||
begin
|
||||
pow_b = 1;
|
||||
if (exp > 0)
|
||||
pow_b = base * pow_b(base, exp - 1);
|
||||
end
|
||||
endfunction
|
||||
|
||||
assign out1 = pow_a(inp, 3);
|
||||
assign out2 = pow_b(2, 2);
|
||||
endmodule
|
41
tests/simple/func_width_scope.v
Normal file
41
tests/simple/func_width_scope.v
Normal file
|
@ -0,0 +1,41 @@
|
|||
module top(inp, out1, out2);
|
||||
input wire signed inp;
|
||||
|
||||
localparam WIDTH_A = 5;
|
||||
function automatic [WIDTH_A-1:0] func1;
|
||||
input reg [WIDTH_A-1:0] inp;
|
||||
func1 = ~inp;
|
||||
endfunction
|
||||
wire [func1(0)-1:0] xc;
|
||||
assign xc = 1'sb1;
|
||||
wire [WIDTH_A-1:0] xn;
|
||||
assign xn = func1(inp);
|
||||
|
||||
generate
|
||||
if (1) begin : blk
|
||||
localparam WIDTH_A = 6;
|
||||
function automatic [WIDTH_A-1:0] func2;
|
||||
input reg [WIDTH_A-1:0] inp;
|
||||
func2 = ~inp;
|
||||
endfunction
|
||||
wire [func2(0)-1:0] yc;
|
||||
assign yc = 1'sb1;
|
||||
wire [WIDTH_A-1:0] yn;
|
||||
assign yn = func2(inp);
|
||||
|
||||
localparam WIDTH_B = 7;
|
||||
function automatic [WIDTH_B-1:0] func3;
|
||||
input reg [WIDTH_B-1:0] inp;
|
||||
func3 = ~inp;
|
||||
endfunction
|
||||
wire [func3(0)-1:0] zc;
|
||||
assign zc = 1'sb1;
|
||||
wire [WIDTH_B-1:0] zn;
|
||||
assign zn = func3(inp);
|
||||
end
|
||||
endgenerate
|
||||
|
||||
output wire [1023:0] out1, out2;
|
||||
assign out1 = {xc, 1'b0, blk.yc, 1'b0, blk.zc};
|
||||
assign out2 = {xn, 1'b0, blk.yn, 1'b0, blk.zn};
|
||||
endmodule
|
27
tests/simple/genblk_collide.v
Normal file
27
tests/simple/genblk_collide.v
Normal file
|
@ -0,0 +1,27 @@
|
|||
`default_nettype none
|
||||
|
||||
module top1;
|
||||
generate
|
||||
if (1) begin : foo
|
||||
if (1) begin : bar
|
||||
wire x;
|
||||
end
|
||||
assign bar.x = 1;
|
||||
wire y;
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
||||
|
||||
module top2;
|
||||
genvar i;
|
||||
generate
|
||||
if (1) begin : foo
|
||||
wire x;
|
||||
for (i = 0; i < 1; i = i + 1) begin : foo
|
||||
if (1) begin : foo
|
||||
assign x = 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
21
tests/simple/genblk_dive.v
Normal file
21
tests/simple/genblk_dive.v
Normal file
|
@ -0,0 +1,21 @@
|
|||
`default_nettype none
|
||||
module top(output wire x);
|
||||
generate
|
||||
if (1) begin : Z
|
||||
if (1) begin : A
|
||||
wire x;
|
||||
if (1) begin : B
|
||||
wire x;
|
||||
if (1) begin : C
|
||||
wire x;
|
||||
assign B.x = 0;
|
||||
wire z = A.B.C.x;
|
||||
end
|
||||
assign A.x = A.B.C.x;
|
||||
end
|
||||
assign B.C.x = B.x;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
assign x = Z.A.x;
|
||||
endmodule
|
18
tests/simple/genblk_order.v
Normal file
18
tests/simple/genblk_order.v
Normal file
|
@ -0,0 +1,18 @@
|
|||
`default_nettype none
|
||||
module top(
|
||||
output wire out1,
|
||||
output wire out2
|
||||
);
|
||||
generate
|
||||
if (1) begin : outer
|
||||
if (1) begin : foo
|
||||
wire x = 0;
|
||||
if (1) begin : foo
|
||||
wire x = 1;
|
||||
assign out1 = foo.x;
|
||||
end
|
||||
assign out2 = foo.x;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
|
@ -260,3 +260,66 @@ module gen_test8;
|
|||
`ASSERT(gen_test8.A.C.x == 1)
|
||||
`ASSERT(gen_test8.A.B.x == 0)
|
||||
endmodule
|
||||
|
||||
// ------------------------------------------
|
||||
|
||||
module gen_test9;
|
||||
|
||||
// `define VERIFY
|
||||
`ifdef VERIFY
|
||||
`define ASSERT(expr) assert property (expr);
|
||||
`else
|
||||
`define ASSERT(expr)
|
||||
`endif
|
||||
|
||||
wire [1:0] w = 2'b11;
|
||||
generate
|
||||
begin : A
|
||||
wire [1:0] x;
|
||||
begin : B
|
||||
wire [1:0] y = 2'b00;
|
||||
`ASSERT(w == 3)
|
||||
`ASSERT(x == 2)
|
||||
`ASSERT(y == 0)
|
||||
`ASSERT(A.x == 2)
|
||||
`ASSERT(A.C.z == 1)
|
||||
`ASSERT(A.B.y == 0)
|
||||
`ASSERT(gen_test9.w == 3)
|
||||
`ASSERT(gen_test9.A.x == 2)
|
||||
`ASSERT(gen_test9.A.C.z == 1)
|
||||
`ASSERT(gen_test9.A.B.y == 0)
|
||||
end
|
||||
begin : C
|
||||
wire [1:0] z = 2'b01;
|
||||
`ASSERT(w == 3)
|
||||
`ASSERT(x == 2)
|
||||
`ASSERT(z == 1)
|
||||
`ASSERT(A.x == 2)
|
||||
`ASSERT(A.C.z == 1)
|
||||
`ASSERT(A.B.y == 0)
|
||||
`ASSERT(gen_test9.w == 3)
|
||||
`ASSERT(gen_test9.A.x == 2)
|
||||
`ASSERT(gen_test9.A.C.z == 1)
|
||||
`ASSERT(gen_test9.A.B.y == 0)
|
||||
end
|
||||
assign x = B.y ^ 2'b11 ^ C.z;
|
||||
`ASSERT(x == 2)
|
||||
`ASSERT(A.x == 2)
|
||||
`ASSERT(A.C.z == 1)
|
||||
`ASSERT(A.B.y == 0)
|
||||
`ASSERT(gen_test9.w == 3)
|
||||
`ASSERT(gen_test9.A.x == 2)
|
||||
`ASSERT(gen_test9.A.C.z == 1)
|
||||
`ASSERT(gen_test9.A.B.y == 0)
|
||||
end
|
||||
endgenerate
|
||||
|
||||
`ASSERT(w == 3)
|
||||
`ASSERT(A.x == 2)
|
||||
`ASSERT(A.C.z == 1)
|
||||
`ASSERT(A.B.y == 0)
|
||||
`ASSERT(gen_test9.w == 3)
|
||||
`ASSERT(gen_test9.A.x == 2)
|
||||
`ASSERT(gen_test9.A.C.z == 1)
|
||||
`ASSERT(gen_test9.A.B.y == 0)
|
||||
endmodule
|
||||
|
|
11
tests/simple/local_loop_var.sv
Normal file
11
tests/simple/local_loop_var.sv
Normal file
|
@ -0,0 +1,11 @@
|
|||
module top(out);
|
||||
output integer out;
|
||||
initial begin
|
||||
integer i;
|
||||
for (i = 0; i < 5; i = i + 1)
|
||||
if (i == 0)
|
||||
out = 1;
|
||||
else
|
||||
out += 2 ** i;
|
||||
end
|
||||
endmodule
|
15
tests/simple/loop_var_shadow.v
Normal file
15
tests/simple/loop_var_shadow.v
Normal file
|
@ -0,0 +1,15 @@
|
|||
module top(out);
|
||||
genvar i;
|
||||
generate
|
||||
for (i = 0; i < 2; i = i + 1) begin : loop
|
||||
localparam j = i + 1;
|
||||
if (1) begin : blk
|
||||
localparam i = j + 1;
|
||||
wire [i:0] x;
|
||||
assign x = 1'sb1;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
output wire [63:0] out;
|
||||
assign out = {loop[0].blk.x, loop[1].blk.x};
|
||||
endmodule
|
27
tests/simple/named_genblk.v
Normal file
27
tests/simple/named_genblk.v
Normal file
|
@ -0,0 +1,27 @@
|
|||
`default_nettype none
|
||||
module top;
|
||||
generate
|
||||
if (1) begin
|
||||
wire t;
|
||||
begin : foo
|
||||
wire x;
|
||||
end
|
||||
wire u;
|
||||
end
|
||||
begin : bar
|
||||
wire x;
|
||||
wire y;
|
||||
begin : baz
|
||||
wire x;
|
||||
wire z;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
assign genblk1.t = 1;
|
||||
assign genblk1.foo.x = 1;
|
||||
assign genblk1.u = 1;
|
||||
assign bar.x = 1;
|
||||
assign bar.y = 1;
|
||||
assign bar.baz.x = 1;
|
||||
assign bar.baz.z = 1;
|
||||
endmodule
|
14
tests/simple/nested_genblk_resolve.v
Normal file
14
tests/simple/nested_genblk_resolve.v
Normal file
|
@ -0,0 +1,14 @@
|
|||
`default_nettype none
|
||||
module top;
|
||||
generate
|
||||
if (1) begin
|
||||
wire x;
|
||||
genvar i;
|
||||
for (i = 0; i < 1; i = i + 1) begin
|
||||
if (1) begin
|
||||
assign x = 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
17
tests/simple/unnamed_block_decl.sv
Normal file
17
tests/simple/unnamed_block_decl.sv
Normal file
|
@ -0,0 +1,17 @@
|
|||
module top(z);
|
||||
output integer z;
|
||||
initial begin
|
||||
integer x;
|
||||
x = 1;
|
||||
begin
|
||||
integer y;
|
||||
y = x + 1;
|
||||
begin
|
||||
integer z;
|
||||
z = y + 1;
|
||||
y = z + 1;
|
||||
end
|
||||
z = y + 1;
|
||||
end
|
||||
end
|
||||
endmodule
|
Loading…
Add table
Add a link
Reference in a new issue