mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 19:52:31 +00:00 
			
		
		
		
	verilog: fix $past's signedness
This commit is contained in:
		
							parent
							
								
									63c9c9be5c
								
							
						
					
					
						commit
						b75fa62e9b
					
				
					 4 changed files with 40 additions and 1 deletions
				
			
		|  | @ -4,6 +4,9 @@ List of major changes and improvements between releases | ||||||
| 
 | 
 | ||||||
| Yosys 0.17 .. Yosys 0.17-dev | 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 |  * Verilog | ||||||
|     - Fixed an issue where simplifying case statements by removing unreachable |     - 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; | 				sub_sign_hint = true; | ||||||
| 				children.at(0)->detectSignWidthWorker(sub_width_hint, sub_sign_hint); | 				children.at(0)->detectSignWidthWorker(sub_width_hint, sub_sign_hint); | ||||||
| 				width_hint = max(width_hint, sub_width_hint); | 				width_hint = max(width_hint, sub_width_hint); | ||||||
| 				sign_hint = false; | 				sign_hint &= sub_sign_hint; | ||||||
| 			} | 			} | ||||||
| 			break; | 			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->str = stringf("$past$%s:%d$%d$%d", filename.c_str(), location.first_line, myidx, i); | ||||||
| 					reg->is_reg = true; | 					reg->is_reg = true; | ||||||
|  | 					reg->is_signed = sign_hint; | ||||||
| 
 | 
 | ||||||
| 					current_ast_mod->children.push_back(reg); | 					current_ast_mod->children.push_back(reg); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								tests/verilog/past_signedness.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								tests/verilog/past_signedness.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue