mirror of https://github.com/YosysHQ/yosys.git
verilog: fix $past's signedness
This commit is contained in:
parent
63c9c9be5c
commit
b75fa62e9b
|
@ -4,6 +4,9 @@ List of major changes and improvements between releases
|
|||
|
||||
Yosys 0.17 .. Yosys 0.17-dev
|
||||
--------------------------
|
||||
* Formal Verification
|
||||
- Fixed the signedness of $past's return value to be the same as the
|
||||
argument's instead of always unsigned.
|
||||
|
||||
* Verilog
|
||||
- Fixed an issue where simplifying case statements by removing unreachable
|
||||
|
|
|
@ -1084,7 +1084,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
|
|||
sub_sign_hint = true;
|
||||
children.at(0)->detectSignWidthWorker(sub_width_hint, sub_sign_hint);
|
||||
width_hint = max(width_hint, sub_width_hint);
|
||||
sign_hint = false;
|
||||
sign_hint &= sub_sign_hint;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -3230,6 +3230,7 @@ skip_dynamic_range_lvalue_expansion:;
|
|||
|
||||
reg->str = stringf("$past$%s:%d$%d$%d", filename.c_str(), location.first_line, myidx, i);
|
||||
reg->is_reg = true;
|
||||
reg->is_signed = sign_hint;
|
||||
|
||||
current_ast_mod->children.push_back(reg);
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue