diff options
Diffstat (limited to 'tests/verilog')
28 files changed, 795 insertions, 3 deletions
| diff --git a/tests/verilog/.gitignore b/tests/verilog/.gitignore index 34da23437..96ebe20ba 100644 --- a/tests/verilog/.gitignore +++ b/tests/verilog/.gitignore @@ -3,3 +3,4 @@  /run-test.mk  /const_arst.v  /const_sr.v +/doubleslash.v diff --git a/tests/verilog/always_comb_latch_1.ys b/tests/verilog/always_comb_latch_1.ys new file mode 100644 index 000000000..c98c79fa2 --- /dev/null +++ b/tests/verilog/always_comb_latch_1.ys @@ -0,0 +1,13 @@ +read_verilog -sv <<EOF +module top; +logic x; +always_comb begin +    logic y; +    if (x) +        y = 1; +    x = y; +end +endmodule +EOF +logger -expect error "^Latch inferred for signal `\\top\.\$unnamed_block\$1\.y' from always_comb process" 1 +proc diff --git a/tests/verilog/always_comb_latch_2.ys b/tests/verilog/always_comb_latch_2.ys new file mode 100644 index 000000000..567205a53 --- /dev/null +++ b/tests/verilog/always_comb_latch_2.ys @@ -0,0 +1,15 @@ +read_verilog -sv <<EOF +module top; +logic x; +always_comb begin +    logic y; +    if (x) +        x = 1; +    else +        y = 1; +    x = y; +end +endmodule +EOF +logger -expect error "^Latch inferred for signal `\\top\.\$unnamed_block\$1\.y' from always_comb process" 1 +proc diff --git a/tests/verilog/always_comb_latch_3.ys b/tests/verilog/always_comb_latch_3.ys new file mode 100644 index 000000000..b9b028ac7 --- /dev/null +++ b/tests/verilog/always_comb_latch_3.ys @@ -0,0 +1,20 @@ +read_verilog -sv <<EOF +module top; +logic x; +logic z; +assign z = 1'b1; +always_comb begin +    logic y; +    case (x) +    1'b0: +        y = 1; +    endcase +    if (z) +        x = y; +    else +        x = 1'b0; +end +endmodule +EOF +logger -expect error "^Latch inferred for signal `\\top\.\$unnamed_block\$1\.y' from always_comb process" 1 +proc diff --git a/tests/verilog/always_comb_latch_4.ys b/tests/verilog/always_comb_latch_4.ys new file mode 100644 index 000000000..46b78801b --- /dev/null +++ b/tests/verilog/always_comb_latch_4.ys @@ -0,0 +1,17 @@ +read_verilog -sv <<EOF +module top; +parameter AVOID_LATCH = 0; +logic x, z; +assign z = 1'b1; +always_comb begin +    logic y; +    if (z) +        y = 0; +    for (int i = 1; i == AVOID_LATCH; i++) +        y = 1; +    x = z ? y : 1'b0; +end +endmodule +EOF +logger -expect error "^Latch inferred for signal `\\top\.\$unnamed_block\$3\.y' from always_comb process" 1 +proc diff --git a/tests/verilog/always_comb_nolatch_1.ys b/tests/verilog/always_comb_nolatch_1.ys new file mode 100644 index 000000000..4d1952b52 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_1.ys @@ -0,0 +1,16 @@ +read_verilog -sv <<EOF +module top; +logic [4:0] x; +logic z; +assign z = 1'b1; +always_comb begin +    x = '0; +    if (z) begin +        for (int i = 0; i < 5; i++) begin +            x[i] = 1'b1; +        end +    end +end +endmodule +EOF +proc diff --git a/tests/verilog/always_comb_nolatch_2.ys b/tests/verilog/always_comb_nolatch_2.ys new file mode 100644 index 000000000..2ec6ca0f4 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_2.ys @@ -0,0 +1,17 @@ +read_verilog -sv <<EOF +module top; +logic [4:0] x; +logic z; +assign z = 1'b1; +always_comb begin +    x = '0; +    if (z) begin +        int i; +        for (i = 0; i < 5; i++) begin +            x[i] = 1'b1; +        end +    end +end +endmodule +EOF +proc diff --git a/tests/verilog/always_comb_nolatch_3.ys b/tests/verilog/always_comb_nolatch_3.ys new file mode 100644 index 000000000..33f9833a2 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_3.ys @@ -0,0 +1,21 @@ +read_verilog -sv <<EOF +module top; +logic x; +logic z; +assign z = 1'b1; +always_comb begin +    logic y; +    case (x) +    1'b0: +        y = 1; +    default: +        y = 0; +    endcase +    if (z) +        x = y; +    else +        x = 1'b0; +end +endmodule +EOF +proc diff --git a/tests/verilog/always_comb_nolatch_4.ys b/tests/verilog/always_comb_nolatch_4.ys new file mode 100644 index 000000000..bc29b2771 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_4.ys @@ -0,0 +1,16 @@ +read_verilog -sv <<EOF +module top; +parameter AVOID_LATCH = 1; +logic x, z; +assign z = 1'b1; +always_comb begin +    logic y; +    if (z) +        y = 0; +    for (int i = 1; i == AVOID_LATCH; i++) +        y = 1; +    x = z ? y : 1'b0; +end +endmodule +EOF +proc diff --git a/tests/verilog/always_comb_nolatch_5.ys b/tests/verilog/always_comb_nolatch_5.ys new file mode 100644 index 000000000..132878626 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_5.ys @@ -0,0 +1,15 @@ +read_verilog -sv <<EOF +module top; +logic [4:0] x; +logic z; +assign z = 1'b1; +always_comb begin : foo +    x = '0; +    if (z) begin : bar +        for (int i = 0; i < 5; i++) +            x[i] = 1'b1; +    end +end +endmodule +EOF +proc diff --git a/tests/verilog/always_comb_nolatch_6.ys b/tests/verilog/always_comb_nolatch_6.ys new file mode 100644 index 000000000..90ee78a68 --- /dev/null +++ b/tests/verilog/always_comb_nolatch_6.ys @@ -0,0 +1,15 @@ +read_verilog -sv <<EOF +module top(input wire x, y, output reg z); +function automatic f; +    input inp; +    for (int i = 0; i < 1; i++) +        f = inp + 0; +endfunction +always_comb +    if (y) +        z = f(x); +    else +        z = 0; +endmodule +EOF +proc diff --git a/tests/verilog/delay_time_scale.ys b/tests/verilog/delay_time_scale.ys new file mode 100644 index 000000000..f45ba7b26 --- /dev/null +++ b/tests/verilog/delay_time_scale.ys @@ -0,0 +1,25 @@ +logger -expect-no-warnings +read_verilog -sv <<EOT +module top; +wand x; +`define TEST(time_scale) if (1) assign #time_scale x = 1; + +`TEST(1s) +`TEST(1ms) +`TEST(1us) +`TEST(1ns) +`TEST(1ps) +`TEST(1fs) + +`TEST((1s)) +`TEST(( 1s)) +`TEST((1s )) +`TEST(( 1s )) + +`TEST(1.0s) +`TEST(1.1s) +`TEST(1.0e-1s) +`TEST(1e-1s) + +endmodule +EOT diff --git a/tests/verilog/doubleslash.ys b/tests/verilog/doubleslash.ys new file mode 100644 index 000000000..c41673ee5 --- /dev/null +++ b/tests/verilog/doubleslash.ys @@ -0,0 +1,21 @@ +read_verilog -sv <<EOT +module doubleslash +  (input  logic   a, +   input  logic   b, +   output logic   z); + +  logic \a//b ; + +  assign \a//b = a & b; +  assign z = ~\a//b ; + +endmodule : doubleslash +EOT + +hierarchy +proc +opt -full + +write_verilog doubleslash.v +design -reset +read_verilog doubleslash.v diff --git a/tests/verilog/dynamic_range_lhs.sh b/tests/verilog/dynamic_range_lhs.sh new file mode 100755 index 000000000..618204aed --- /dev/null +++ b/tests/verilog/dynamic_range_lhs.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +run() { +    alt=$1 +    span=$2 +    left=$3 +    right=$4 +    echo "a=$alt s=$span l=$left r=$right" + +    ../../yosys -q \ +        -DALT=$alt \ +        -DSPAN=$span \ +        -DLEFT=$left \ +        -DRIGHT=$right \ +        -p "read_verilog dynamic_range_lhs.v" \ +        -p "proc" \ +        -p "equiv_make gold gate equiv" \ +        -p "equiv_simple" \ +        -p "equiv_status -assert" +} + +trap 'echo "ERROR in dynamic_range_lhs.sh span=$span left=$left right=$right" >&2; exit 1' ERR + +for alt in `seq 0 1`; do +for span in `seq 1 4`; do +for left in `seq -4 4`; do +for right in `seq $(expr $left + -3) $(expr $left + 3)`; do +    run $alt $span $left $right +done +done +done +done diff --git a/tests/verilog/dynamic_range_lhs.v b/tests/verilog/dynamic_range_lhs.v new file mode 100644 index 000000000..ae291374d --- /dev/null +++ b/tests/verilog/dynamic_range_lhs.v @@ -0,0 +1,76 @@ +module gate( +    output reg [`LEFT:`RIGHT] out_u, out_s, +    (* nowrshmsk = `ALT *) +    input wire data, +    input wire [1:0] sel1, sel2 +); +always @* begin +    out_u = 0; +    out_s = 0; +    case (`SPAN) +    1: begin +        out_u[sel1*sel2] = data; +        out_s[$signed(sel1*sel2)] = data; +    end +    2: begin +        out_u[sel1*sel2+:2] = {data, data}; +        out_s[$signed(sel1*sel2)+:2] = {data, data}; +    end +    3: begin +        out_u[sel1*sel2+:3] = {data, data, data}; +        out_s[$signed(sel1*sel2)+:3] = {data, data, data}; +    end +    4: begin +        out_u[sel1*sel2+:4] = {data, data, data, data}; +        out_s[$signed(sel1*sel2)+:4] = {data, data, data, data}; +    end +    endcase +end +endmodule + +module gold( +    output reg [`LEFT:`RIGHT] out_u, out_s, +    input wire data, +    input wire [1:0] sel1, sel2 +); +task set; +    input integer a, b; +    localparam LOW = `LEFT > `RIGHT ? `RIGHT : `LEFT; +    localparam HIGH = `LEFT > `RIGHT ? `LEFT : `RIGHT; +    if (LOW <= a && a <= HIGH) +        out_u[a] = data; +    if (LOW <= b && b <= HIGH) +        out_s[b] = data; +endtask +always @* begin +    out_u = 0; +    out_s = 0; +    case (sel1*sel2) +        2'b00: set(0, 0); +        2'b01: set(1, 1); +        2'b10: set(2, -2); +        2'b11: set(3, -1); +    endcase +    if (`SPAN >= 2) +        case (sel1*sel2) +            2'b00: set(1, 1); +            2'b01: set(2, 2); +            2'b10: set(3, -1); +            2'b11: set(4, 0); +        endcase +    if (`SPAN >= 3) +        case (sel1*sel2) +            2'b00: set(2, 2); +            2'b01: set(3, 3); +            2'b10: set(4, 0); +            2'b11: set(5, 1); +        endcase +    if (`SPAN >= 4) +        case (sel1*sel2) +            2'b00: set(3, 3); +            2'b01: set(4, 4); +            2'b10: set(5, 1); +            2'b11: set(6, 2); +        endcase +end +endmodule diff --git a/tests/verilog/func_upto.sv b/tests/verilog/func_upto.sv new file mode 100644 index 000000000..547e5d325 --- /dev/null +++ b/tests/verilog/func_upto.sv @@ -0,0 +1,77 @@ +`default_nettype none + +module evil; +    parameter HI = 3; +    parameter LO = 0; +    parameter SPAN = 1; +    parameter [HI:LO] A_VAL = 4'b0110; +    parameter [HI:LO] B_VAL = 4'b1100; +    parameter [2:0] SWAPS = 0; + +    localparam D_LEFT  = !(SWAPS[0]) ? HI : LO; +    localparam D_RIGHT =  (SWAPS[0]) ? HI : LO; +    localparam E_LEFT  = !(SWAPS[1]) ? HI : LO; +    localparam E_RIGHT =  (SWAPS[1]) ? HI : LO; +    localparam F_LEFT  = !(SWAPS[2]) ? HI : LO; +    localparam F_RIGHT =  (SWAPS[2]) ? HI : LO; + +    localparam [HI:LO] A_CONST = A_VAL; +    localparam [HI:LO] B_CONST = B_VAL; +    localparam [HI:LO] C_CONST = F(A_CONST, B_CONST); + +    reg [HI:LO] C_WIRE, C_FUNC; +    always @* begin +        assert (C_CONST == C_WIRE); +        assert (C_CONST == C_FUNC); +    end + +    initial begin : blk +        reg [HI:LO] A_WIRE; +        reg [HI:LO] B_WIRE; +        reg [D_LEFT:D_RIGHT] D; +        reg [E_LEFT:E_RIGHT] E; +        reg [F_LEFT:F_RIGHT] F_WIRE; +        reg [31:0] i; +        A_WIRE = A_VAL; +        B_WIRE = B_VAL; +        D = A_WIRE; +        E = B_WIRE; +        F_WIRE = 0; +        for (i = LO; i + SPAN < HI; i = i + SPAN) +            if (SPAN == 1) +                F_WIRE[i] = D[i] && E[i]; +            else +                F_WIRE[i+:SPAN] = D[i+:SPAN] && E[i+:SPAN]; +        C_WIRE = F_WIRE; +        C_FUNC = F(A_WIRE, B_WIRE); +    end + +    function automatic [F_LEFT:F_RIGHT] F( +        input [D_LEFT:D_RIGHT] D, +        input [E_LEFT:E_RIGHT] E); +        reg [31:0] i; +        F = 0; +        for (i = LO; i + SPAN < HI; i = i + SPAN) +            if (SPAN == 1) +                F[i] = D[i] && E[i]; +            else +                F[i+:SPAN] = D[i+:SPAN] && E[i+:SPAN]; +    endfunction +endmodule + +module top; +    for (genvar hi = 0; hi < 3; hi++) +    for (genvar lo = 0; lo <= hi; lo++) +    for (genvar span = 1; span <= hi - lo + 1; span++) +    for (genvar a_val = 0; a_val < 2 ** (hi - lo + 1); a_val++) +    for (genvar b_val = 0; b_val < 2 ** (hi - lo + 1); b_val++) +    for (genvar swaps = 0; swaps < 2 ** 3; swaps++) +        evil #( +            .HI(hi), +            .LO(lo), +            .SPAN(span), +            .A_VAL(a_val), +            .B_VAL(b_val), +            .SWAPS(swaps) +        ) e(); +endmodule diff --git a/tests/verilog/func_upto.ys b/tests/verilog/func_upto.ys new file mode 100644 index 000000000..7a8c53506 --- /dev/null +++ b/tests/verilog/func_upto.ys @@ -0,0 +1,7 @@ +read_verilog -sv func_upto.sv +hierarchy -top top +proc +flatten +opt -full +select -module top +sat -verify -seq 1 -prove-asserts -enable_undef diff --git a/tests/verilog/net_types.sv b/tests/verilog/net_types.sv new file mode 100644 index 000000000..7226a7ee5 --- /dev/null +++ b/tests/verilog/net_types.sv @@ -0,0 +1,34 @@ +module top; +    wire logic wire_logic_0; assign wire_logic_0 = 0; +    wire logic wire_logic_1; assign wire_logic_1 = 1; +    wand logic wand_logic_0; assign wand_logic_0 = 0; assign wand_logic_0 = 1; +    wand logic wand_logic_1; assign wand_logic_1 = 1; assign wand_logic_1 = 1; +    wor logic wor_logic_0; assign wor_logic_0 = 0; assign wor_logic_0 = 0; +    wor logic wor_logic_1; assign wor_logic_1 = 1; assign wor_logic_1 = 0; + +    wire integer wire_integer; assign wire_integer = 4'b1001; +    wand integer wand_integer; assign wand_integer = 4'b1001; assign wand_integer = 4'b1010; +    wor integer wor_integer; assign wor_integer = 4'b1001; assign wor_integer = 4'b1010; + +    typedef logic [3:0] typename; +    wire typename wire_typename; assign wire_typename = 4'b1001; +    wand typename wand_typename; assign wand_typename = 4'b1001; assign wand_typename = 4'b1010; +    wor typename wor_typename; assign wor_typename = 4'b1001; assign wor_typename = 4'b1010; + +    always @* begin +        assert (wire_logic_0 == 0); +        assert (wire_logic_1 == 1); +        assert (wand_logic_0 == 0); +        assert (wand_logic_1 == 1); +        assert (wor_logic_0 == 0); +        assert (wor_logic_1 == 1); + +        assert (wire_integer == 4'b1001); +        assert (wand_integer == 4'b1000); +        assert (wor_integer == 4'b1011); + +        assert (wire_typename == 4'b1001); +        assert (wand_typename == 4'b1000); +        assert (wor_typename == 4'b1011); +    end +endmodule diff --git a/tests/verilog/net_types.ys b/tests/verilog/net_types.ys new file mode 100644 index 000000000..9f75812ea --- /dev/null +++ b/tests/verilog/net_types.ys @@ -0,0 +1,5 @@ +read_verilog -sv net_types.sv +hierarchy +proc +opt -full +sat -verify -prove-asserts -show-all diff --git a/tests/verilog/past_signedness.ys b/tests/verilog/past_signedness.ys new file mode 100644 index 000000000..91f32328b --- /dev/null +++ b/tests/verilog/past_signedness.ys @@ -0,0 +1,35 @@ +logger -expect-no-warnings + +read_verilog -formal <<EOT +module top(input clk); +    reg signed [3:0] value = -1; +    reg ready = 0; + +    always @(posedge clk) begin +        if (ready) +            assert ($past(value) == -1); +        ready <= 1; +    end +endmodule +EOT + +prep -top top +sim -n 3 -clock clk + +design -reset + +read_verilog -formal <<EOT +module top(input clk); +    reg signed [3:0] value = -1; +    reg ready = 0; + +    always @(posedge clk) begin +        if (ready) +            assert ($past(value + 4'b0000) == 15); +        ready <= 1; +    end +endmodule +EOT + +prep -top top +sim -n 3 -clock clk diff --git a/tests/verilog/prefix.sv b/tests/verilog/prefix.sv new file mode 100644 index 000000000..2d7fbb134 --- /dev/null +++ b/tests/verilog/prefix.sv @@ -0,0 +1,95 @@ +module top; +    genvar i, j; +    if (1) begin : blk1 +        integer a = 1; +        for (i = 0; i < 2; i = i + 1) begin : blk2 +            integer b = i; +            for (j = 0; j < 2; j = j + 1) begin : blk3 +                integer c = j; +                localparam x = i; +                localparam y = j; +                always @* begin +                    assert (1 == a); +                    assert (1 == blk1.a); +                    assert (1 == top.blk1.a); +                    assert (i == b); +                    assert (i == blk2[i].b); +                    assert (i == blk1.blk2[i].b); +                    assert (i == top.blk1.blk2[i].b); +                    assert (i == blk2[x].b); +                    assert (i == blk1.blk2[x].b); +                    assert (i == top.blk1.blk2[x].b); +                    assert (j == c); +                    assert (j == blk3[j].c); +                    assert (j == blk2[x].blk3[j].c); +                    assert (j == blk1.blk2[x].blk3[j].c); +                    assert (j == top.blk1.blk2[x].blk3[j].c); +                    assert (j == c); +                    assert (j == blk3[y].c); +                    assert (j == blk2[x].blk3[y].c); +                    assert (j == blk1.blk2[x].blk3[y].c); +                    assert (j == top.blk1.blk2[x].blk3[y].c); +                    assert (j == top.blk1.blk2[x].blk3[y].c[0]); +                    assert (0 == top.blk1.blk2[x].blk3[y].c[1]); +                    assert (0 == top.blk1.blk2[x].blk3[y].c[j]); +                end +            end +            always @* begin +                assert (1 == a); +                assert (1 == blk1.a); +                assert (1 == top.blk1.a); +                assert (i == b); +                assert (i == blk2[i].b); +                assert (i == blk1.blk2[i].b); +                assert (i == top.blk1.blk2[i].b); +                assert (0 == blk3[0].c); +                assert (0 == blk2[i].blk3[0].c); +                assert (0 == blk1.blk2[i].blk3[0].c); +                assert (0 == top.blk1.blk2[i].blk3[0].c); +                assert (1 == blk3[1].c); +                assert (1 == blk2[i].blk3[1].c); +                assert (1 == blk1.blk2[i].blk3[1].c); +                assert (1 == top.blk1.blk2[i].blk3[1].c); +            end +        end +        always @* begin +            assert (1 == a); +            assert (1 == blk1.a); +            assert (1 == top.blk1.a); +            assert (0 == blk2[0].b); +            assert (0 == blk1.blk2[0].b); +            assert (0 == top.blk1.blk2[0].b); +            assert (1 == blk2[1].b); +            assert (1 == blk1.blk2[1].b); +            assert (1 == top.blk1.blk2[1].b); +            assert (0 == blk2[0].blk3[0].c); +            assert (0 == blk1.blk2[0].blk3[0].c); +            assert (0 == top.blk1.blk2[0].blk3[0].c); +            assert (1 == blk2[0].blk3[1].c); +            assert (1 == blk1.blk2[0].blk3[1].c); +            assert (1 == top.blk1.blk2[0].blk3[1].c); +            assert (0 == blk2[1].blk3[0].c); +            assert (0 == blk1.blk2[1].blk3[0].c); +            assert (0 == top.blk1.blk2[1].blk3[0].c); +            assert (1 == blk2[1].blk3[1].c); +            assert (1 == blk1.blk2[1].blk3[1].c); +            assert (1 == top.blk1.blk2[1].blk3[1].c); +        end +    end +    always @* begin +        assert (1 == blk1.a); +        assert (1 == top.blk1.a); +        assert (0 == blk1.blk2[0].b); +        assert (0 == top.blk1.blk2[0].b); +        assert (1 == blk1.blk2[1].b); +        assert (1 == top.blk1.blk2[1].b); +        assert (0 == blk1.blk2[0].blk3[0].c); +        assert (0 == top.blk1.blk2[0].blk3[0].c); +        assert (1 == blk1.blk2[0].blk3[1].c); +        assert (1 == top.blk1.blk2[0].blk3[1].c); +        assert (0 == blk1.blk2[1].blk3[0].c); +        assert (0 == top.blk1.blk2[1].blk3[0].c); +        assert (1 == blk1.blk2[1].blk3[1].c); +        assert (1 == top.blk1.blk2[1].blk3[1].c); +    end +endmodule diff --git a/tests/verilog/prefix.ys b/tests/verilog/prefix.ys new file mode 100644 index 000000000..ed3b3a111 --- /dev/null +++ b/tests/verilog/prefix.ys @@ -0,0 +1,5 @@ +read_verilog -sv prefix.sv +hierarchy +proc +select -module top +sat -verify -seq 1 -prove-asserts -show-all diff --git a/tests/verilog/size_cast.sv b/tests/verilog/size_cast.sv new file mode 100644 index 000000000..1636f8d70 --- /dev/null +++ b/tests/verilog/size_cast.sv @@ -0,0 +1,140 @@ +module top; +    logic L1b0 = 0; +    logic L1b1 = 1; + +    logic signed L1sb0 = 0; +    logic signed L1sb1 = 1; + +    logic [1:0] L2b00 = 0; +    logic [1:0] L2b01 = 1; +    logic [1:0] L2b10 = 2; +    logic [1:0] L2b11 = 3; + +    logic signed [1:0] L2sb00 = 0; +    logic signed [1:0] L2sb01 = 1; +    logic signed [1:0] L2sb10 = 2; +    logic signed [1:0] L2sb11 = 3; + +    logic y = 1; + +    always @* begin + +        assert (1'(L1b0  ) == 1'b0); +        assert (1'(L1b1  ) == 1'b1); +        assert (1'(L1sb0 ) == 1'b0); +        assert (1'(L1sb1 ) == 1'b1); +        assert (1'(L2b00 ) == 1'b0); +        assert (1'(L2b01 ) == 1'b1); +        assert (1'(L2b10 ) == 1'b0); +        assert (1'(L2b11 ) == 1'b1); +        assert (1'(L2sb00) == 1'b0); +        assert (1'(L2sb01) == 1'b1); +        assert (1'(L2sb10) == 1'b0); +        assert (1'(L2sb11) == 1'b1); + +        assert (2'(L1b0  ) == 2'b00); +        assert (2'(L1b1  ) == 2'b01); +        assert (2'(L1sb0 ) == 2'b00); +        assert (2'(L1sb1 ) == 2'b11); +        assert (2'(L2b00 ) == 2'b00); +        assert (2'(L2b01 ) == 2'b01); +        assert (2'(L2b10 ) == 2'b10); +        assert (2'(L2b11 ) == 2'b11); +        assert (2'(L2sb00) == 2'b00); +        assert (2'(L2sb01) == 2'b01); +        assert (2'(L2sb10) == 2'b10); +        assert (2'(L2sb11) == 2'b11); + +        assert (3'(L1b0  ) == 3'b000); +        assert (3'(L1b1  ) == 3'b001); +        assert (3'(L1sb0 ) == 3'b000); +        assert (3'(L1sb1 ) == 3'b111); +        assert (3'(L2b00 ) == 3'b000); +        assert (3'(L2b01 ) == 3'b001); +        assert (3'(L2b10 ) == 3'b010); +        assert (3'(L2b11 ) == 3'b011); +        assert (3'(L2sb00) == 3'b000); +        assert (3'(L2sb01) == 3'b001); +        assert (3'(L2sb10) == 3'b110); +        assert (3'(L2sb11) == 3'b111); + +        assert (3'(L1b0   | '1) == 3'b111); +        assert (3'(L1b1   | '1) == 3'b111); +        assert (3'(L1sb0  | '1) == 3'b111); +        assert (3'(L1sb1  | '1) == 3'b111); +        assert (3'(L2b00  | '1) == 3'b111); +        assert (3'(L2b01  | '1) == 3'b111); +        assert (3'(L2b10  | '1) == 3'b111); +        assert (3'(L2b11  | '1) == 3'b111); +        assert (3'(L2sb00 | '1) == 3'b111); +        assert (3'(L2sb01 | '1) == 3'b111); +        assert (3'(L2sb10 | '1) == 3'b111); +        assert (3'(L2sb11 | '1) == 3'b111); + +        assert (3'(L1b0   | '0) == 3'b000); +        assert (3'(L1b1   | '0) == 3'b001); +        assert (3'(L1sb0  | '0) == 3'b000); +        assert (3'(L1sb1  | '0) == 3'b001); +        assert (3'(L2b00  | '0) == 3'b000); +        assert (3'(L2b01  | '0) == 3'b001); +        assert (3'(L2b10  | '0) == 3'b010); +        assert (3'(L2b11  | '0) == 3'b011); +        assert (3'(L2sb00 | '0) == 3'b000); +        assert (3'(L2sb01 | '0) == 3'b001); +        assert (3'(L2sb10 | '0) == 3'b010); +        assert (3'(L2sb11 | '0) == 3'b011); + +        assert (3'(y ? L1b0   : '1) == 3'b000); +        assert (3'(y ? L1b1   : '1) == 3'b001); +        assert (3'(y ? L1sb0  : '1) == 3'b000); +        assert (3'(y ? L1sb1  : '1) == 3'b001); +        assert (3'(y ? L2b00  : '1) == 3'b000); +        assert (3'(y ? L2b01  : '1) == 3'b001); +        assert (3'(y ? L2b10  : '1) == 3'b010); +        assert (3'(y ? L2b11  : '1) == 3'b011); +        assert (3'(y ? L2sb00 : '1) == 3'b000); +        assert (3'(y ? L2sb01 : '1) == 3'b001); +        assert (3'(y ? L2sb10 : '1) == 3'b010); +        assert (3'(y ? L2sb11 : '1) == 3'b011); + +        assert (3'(y ? L1b0   : '0) == 3'b000); +        assert (3'(y ? L1b1   : '0) == 3'b001); +        assert (3'(y ? L1sb0  : '0) == 3'b000); +        assert (3'(y ? L1sb1  : '0) == 3'b001); +        assert (3'(y ? L2b00  : '0) == 3'b000); +        assert (3'(y ? L2b01  : '0) == 3'b001); +        assert (3'(y ? L2b10  : '0) == 3'b010); +        assert (3'(y ? L2b11  : '0) == 3'b011); +        assert (3'(y ? L2sb00 : '0) == 3'b000); +        assert (3'(y ? L2sb01 : '0) == 3'b001); +        assert (3'(y ? L2sb10 : '0) == 3'b010); +        assert (3'(y ? L2sb11 : '0) == 3'b011); + +        assert (3'(y ? L1b0   : 1'sb0) == 3'b000); +        assert (3'(y ? L1b1   : 1'sb0) == 3'b001); +        assert (3'(y ? L1sb0  : 1'sb0) == 3'b000); +        assert (3'(y ? L1sb1  : 1'sb0) == 3'b111); +        assert (3'(y ? L2b00  : 1'sb0) == 3'b000); +        assert (3'(y ? L2b01  : 1'sb0) == 3'b001); +        assert (3'(y ? L2b10  : 1'sb0) == 3'b010); +        assert (3'(y ? L2b11  : 1'sb0) == 3'b011); +        assert (3'(y ? L2sb00 : 1'sb0) == 3'b000); +        assert (3'(y ? L2sb01 : 1'sb0) == 3'b001); +        assert (3'(y ? L2sb10 : 1'sb0) == 3'b110); +        assert (3'(y ? L2sb11 : 1'sb0) == 3'b111); + +        assert (3'(y ? L1b0   : 1'sb1) == 3'b000); +        assert (3'(y ? L1b1   : 1'sb1) == 3'b001); +        assert (3'(y ? L1sb0  : 1'sb1) == 3'b000); +        assert (3'(y ? L1sb1  : 1'sb1) == 3'b111); +        assert (3'(y ? L2b00  : 1'sb1) == 3'b000); +        assert (3'(y ? L2b01  : 1'sb1) == 3'b001); +        assert (3'(y ? L2b10  : 1'sb1) == 3'b010); +        assert (3'(y ? L2b11  : 1'sb1) == 3'b011); +        assert (3'(y ? L2sb00 : 1'sb1) == 3'b000); +        assert (3'(y ? L2sb01 : 1'sb1) == 3'b001); +        assert (3'(y ? L2sb10 : 1'sb1) == 3'b110); +        assert (3'(y ? L2sb11 : 1'sb1) == 3'b111); + +    end +endmodule diff --git a/tests/verilog/size_cast.ys b/tests/verilog/size_cast.ys new file mode 100644 index 000000000..6890cd2d5 --- /dev/null +++ b/tests/verilog/size_cast.ys @@ -0,0 +1,5 @@ +read_verilog -sv size_cast.sv +proc +opt -full +select -module top +sat -verify -prove-asserts -show-all diff --git a/tests/verilog/struct_access.sv b/tests/verilog/struct_access.sv index f13b8dd51..bc91e3f01 100644 --- a/tests/verilog/struct_access.sv +++ b/tests/verilog/struct_access.sv @@ -77,9 +77,8 @@ module top;          `CHECK(s.y.a, 1, 0)          `CHECK(s.y.b, 1, 1) -        // TODO(zachjs): support access to whole sub-structs and unions -        // `CHECK(s.x, 2, 0) -        // `CHECK(s.y, 2, 1) +        `CHECK(s.x, 2, 0) +        `CHECK(s.y, 2, 1)          assert (fail === 0);      end diff --git a/tests/verilog/unbased_unsized_tern.sv b/tests/verilog/unbased_unsized_tern.sv new file mode 100644 index 000000000..ad8493394 --- /dev/null +++ b/tests/verilog/unbased_unsized_tern.sv @@ -0,0 +1,31 @@ +module pass_through #( +	parameter WIDTH = 1 +) ( +	input logic [WIDTH-1:0] inp, +	output logic [WIDTH-1:0] out +); +	assign out = inp; +endmodule + +module gate ( +	input logic inp, +	output logic [63:0] +		out1, out2, out3, out4 +); +	pass_through #(40) pt1('1, out1); +	pass_through #(40) pt2(inp ? '1 : '0, out2); +	pass_through #(40) pt3(inp ? '1 : 2'b10, out3); +	pass_through #(40) pt4(inp ? '1 : inp, out4); +endmodule + +module gold ( +	input logic inp, +	output logic [63:0] +		out1, out2, out3, out4 +); +	localparam ONES = 40'hFF_FFFF_FFFF; +	pass_through #(40) pt1(ONES, out1); +	pass_through #(40) pt2(inp ? ONES : 0, out2); +	pass_through #(40) pt3(inp ? ONES : 2'sb10, out3); +	pass_through #(40) pt4(inp ? ONES : inp, out4); +endmodule diff --git a/tests/verilog/unbased_unsized_tern.ys b/tests/verilog/unbased_unsized_tern.ys new file mode 100644 index 000000000..5ef63c559 --- /dev/null +++ b/tests/verilog/unbased_unsized_tern.ys @@ -0,0 +1,6 @@ +read_verilog -sv unbased_unsized_tern.sv +hierarchy +proc +equiv_make gold gate equiv +equiv_simple +equiv_status -assert diff --git a/tests/verilog/unreachable_case_sign.ys b/tests/verilog/unreachable_case_sign.ys new file mode 100644 index 000000000..25bc0c6f0 --- /dev/null +++ b/tests/verilog/unreachable_case_sign.ys @@ -0,0 +1,33 @@ +logger -expect-no-warnings + +read_verilog -formal <<EOT +module top(input clk); +    reg good = 0; + +    always @(posedge clk) begin +        case (4'sb1111) 15: good = 1; 4'b0000: ; endcase +        assert (good); +    end +endmodule +EOT + +prep -top top +sim -n 3 -clock clk + +design -reset + +read_verilog -formal <<EOT +module top(input clk); +    reg good = 1; +    reg signed [1:0] case_value = -1; + +    always @(posedge clk) begin +        case (4'sb1111) 4'b0000: ; case_value: good = 0; endcase +        assert (good); +    end +endmodule +EOT + +prep -top top +sim -n 3 -clock clk + | 
