mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +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