48 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			48 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Checking equivalence of different configurations of PicoRV32 using Yosys and
							 | 
						||
| 
								 | 
							
								SMT solvers (Yices, Z3, CVC4, MathSAT).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The PicoRV32 core provides configuration parameters that change the supported
							 | 
						||
| 
								 | 
							
								ISA and/or the timing of the core. This set of scripts uses model checking
							 | 
						||
| 
								 | 
							
								techniques to proof equivalence of cores in different configurations, thus
							 | 
						||
| 
								 | 
							
								transfering the confidence in the cores gained by running test benches on a few
							 | 
						||
| 
								 | 
							
								configurations to the rest of the configurations.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								async
							 | 
						||
| 
								 | 
							
								-----
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The async test compares two cores with different timings (number of clock
							 | 
						||
| 
								 | 
							
								cycles per operation), but same ISA. The SMT problem models the following
							 | 
						||
| 
								 | 
							
								scenario:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The cores start out with identical memory and register file. In cycle 0 the
							 | 
						||
| 
								 | 
							
								reset input is active, in all other cycles the reset input is inactive. The
							 | 
						||
| 
								 | 
							
								trap output must by active in the last cycle for both cores. I.e. whatever
							 | 
						||
| 
								 | 
							
								the program in memory does, it must terminate in a trap and it must do so
							 | 
						||
| 
								 | 
							
								for both cores within the simulated number of clock cycles.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The script searches for a trace that ends in different memory content and/or
							 | 
						||
| 
								 | 
							
								different register file content in the last cycle, i.e. a trace that exposes
							 | 
						||
| 
								 | 
							
								divergent behavior in the two cores.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync
							 | 
						||
| 
								 | 
							
								----
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The sync test compares two cores same timings but different ISA. The ISA of the
							 | 
						||
| 
								 | 
							
								2nd code (main_b) must be a superset of the ISA of the first core (main_a), and
							 | 
						||
| 
								 | 
							
								catching illegal instructions and illegal memory transfers must be enabled in
							 | 
						||
| 
								 | 
							
								the first core. The SMT problem models the following scenario:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The cores start out with identical memory and register file. In cycle 0 the
							 | 
						||
| 
								 | 
							
								reset input is active, in all other cycles the reset input is inactive. The
							 | 
						||
| 
								 | 
							
								cores are run in parallel for a number of cycles with the first core not going
							 | 
						||
| 
								 | 
							
								into the trap state. I.e. all traces are limited to the ISA supported by the
							 | 
						||
| 
								 | 
							
								first core.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The script searches for a trace that ends in different memory content and/or
							 | 
						||
| 
								 | 
							
								different register file content in the last cycle, i.e. a trace that exposes
							 | 
						||
| 
								 | 
							
								divergent behavior in the two cores.
							 | 
						||
| 
								 | 
							
								
							 |