aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJannis Harder <me@jix.one>2022-05-24 14:32:14 +0200
committerZachary Snow <zachary.j.snow@gmail.com>2022-05-24 23:03:31 -0400
commitcffec1f95f0ac4bad1deb24bf7f921bd93145a16 (patch)
treec66eeb0e812b0519e8f72791c70e2b6dc44d7df3
parentc525b5f91925bd51194ead99a4ecace313f9945c (diff)
downloadyosys-cffec1f95f0ac4bad1deb24bf7f921bd93145a16.tar.gz
yosys-cffec1f95f0ac4bad1deb24bf7f921bd93145a16.tar.bz2
yosys-cffec1f95f0ac4bad1deb24bf7f921bd93145a16.zip
verilog: fix signedness when removing unreachable cases
-rw-r--r--CHANGELOG5
-rw-r--r--frontends/ast/simplify.cc1
-rw-r--r--tests/verilog/unreachable_case_sign.ys33
3 files changed, 39 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 4004c534b..ff7ce49a2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,11 @@ List of major changes and improvements between releases
Yosys 0.17 .. Yosys 0.17-dev
--------------------------
+ * Verilog
+ - Fixed an issue where simplifying case statements by removing unreachable
+ cases could result in the wrong signedness being used for comparison with
+ the remaining cases
+
Yosys 0.16 .. Yosys 0.17
--------------------------
* New commands and options
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index bd3e09c4b..4d7c4f522 100644
--- a/frontends/ast/simplify.cc
+++ b/frontends/ast/simplify.cc
@@ -1531,6 +1531,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
detectSignWidth(width_hint, sign_hint);
while (children[0]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
if (children[0]->type == AST_CONSTANT && children[0]->bits_only_01()) {
+ children[0]->is_signed = sign_hint;
RTLIL::Const case_expr = children[0]->bitsAsConst(width_hint, sign_hint);
std::vector<AstNode*> new_children;
new_children.push_back(children[0]);
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
+