mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 00:55:32 +00:00
verilog: fix size and signedness of array querying functions
genrtlil.cc and simplify.cc had inconsistent and slightly broken handling of signedness for array querying functions. These functions are defined to return a signed result. Simplify always produced an unsigned and genrtlil always a signed 32-bit result ignoring the context. Includes tests for the the relvant edge cases for context dependent conversions.
This commit is contained in:
parent
ce24208a8b
commit
4bfaaea0d5
4 changed files with 56 additions and 3 deletions
52
tests/verilog/sign_array_query.ys
Normal file
52
tests/verilog/sign_array_query.ys
Normal file
|
@ -0,0 +1,52 @@
|
|||
logger -expect-no-warnings
|
||||
|
||||
read_verilog -formal <<EOT
|
||||
module top(input clk);
|
||||
reg [-1:-1] x;
|
||||
reg good = 0;
|
||||
reg signed [31:0] zero = 0;
|
||||
|
||||
always @(posedge clk) begin
|
||||
case ($left(x) + zero) 36'shfffffffff: good = 1; 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 [-1:-1] x;
|
||||
reg good = 0;
|
||||
|
||||
always @(posedge clk) begin
|
||||
case ($left(x)) 36'sh0ffffffff: good = 1; (32'h0 + $left(good)): ; 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 [-1:-1] x;
|
||||
reg good = 1;
|
||||
|
||||
always @(posedge clk) begin
|
||||
case (36'sh100000000 + $left(x)) -1: good = 0; endcase
|
||||
assert (good);
|
||||
end
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
prep -top top
|
||||
sim -n 3 -clock clk
|
Loading…
Add table
Add a link
Reference in a new issue