mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-27 01:39:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
 | |
| // a simple test case extracted from systemcaes (as included in iwls2005)
 | |
| // this design has latches (or logic loops) for the two temp variables.
 | |
| // this latches (or logic loops) must be removed in the final synthesis results
 | |
| 
 | |
| module aes(
 | |
| 	// inputs
 | |
| 	input [3:0] addroundkey_data_i,
 | |
| 	input [3:0] addroundkey_data_reg,
 | |
| 	input [3:0] addroundkey_round,
 | |
| 	input [3:0] key_i,
 | |
| 	input [3:0] keysched_new_key_o,
 | |
| 	input [3:0] round,
 | |
| 	input addroundkey_start_i,
 | |
| 	input keysched_ready_o,
 | |
| 
 | |
| 	// outputs
 | |
| 	output reg [3:0] keysched_last_key_i,
 | |
| 	output reg [3:0] keysched_round_i,
 | |
| 	output reg [3:0] next_addroundkey_data_reg,
 | |
| 	output reg [3:0] next_addroundkey_round,
 | |
| 	output reg [3:0] round_data_var,
 | |
| 	output reg keysched_start_i,
 | |
| 	output reg next_addroundkey_ready_o
 | |
| );
 | |
| 
 | |
| // temp variables
 | |
| reg [3:0] data_var;
 | |
| reg [3:0] round_key_var;
 | |
| 
 | |
| always @*
 | |
| begin
 | |
| 	keysched_start_i = 0;
 | |
| 	keysched_round_i = addroundkey_round;
 | |
| 	round_data_var = addroundkey_data_reg;
 | |
| 	next_addroundkey_data_reg = addroundkey_data_reg;
 | |
| 	next_addroundkey_ready_o = 0;
 | |
| 	next_addroundkey_round = addroundkey_round;
 | |
| 
 | |
| 	if (addroundkey_round == 1 || addroundkey_round == 0)
 | |
| 		keysched_last_key_i = key_i;
 | |
| 	else
 | |
| 		keysched_last_key_i = keysched_new_key_o;
 | |
| 
 | |
| 	if (round == 0 && addroundkey_start_i)
 | |
| 	begin
 | |
| 		data_var = addroundkey_data_i;
 | |
| 		round_key_var = key_i;
 | |
| 		round_data_var = round_key_var ^ data_var;
 | |
| 		next_addroundkey_data_reg = round_data_var;
 | |
| 		next_addroundkey_ready_o = 1;
 | |
| 	end
 | |
| 	else if (addroundkey_start_i && round != 0)
 | |
| 	begin
 | |
| 		keysched_last_key_i = key_i;
 | |
| 		keysched_start_i = 1;
 | |
| 		keysched_round_i = 1;
 | |
| 		next_addroundkey_round = 1;
 | |
| 	end
 | |
| 	else if (addroundkey_round != round && keysched_ready_o)
 | |
| 	begin
 | |
| 		next_addroundkey_round = addroundkey_round + 1;
 | |
| 		keysched_last_key_i = keysched_new_key_o;
 | |
| 		keysched_start_i = 1;
 | |
| 		keysched_round_i = addroundkey_round + 1;
 | |
| 	end
 | |
| 	else if (addroundkey_round == round && keysched_ready_o)
 | |
| 	begin
 | |
| 		data_var = addroundkey_data_i;
 | |
| 		round_key_var = keysched_new_key_o;
 | |
| 		round_data_var = round_key_var ^ data_var;
 | |
| 		next_addroundkey_data_reg = round_data_var;
 | |
| 		next_addroundkey_ready_o = 1;
 | |
| 		next_addroundkey_round = 0;
 | |
| 	end
 | |
| end
 | |
| 
 | |
| endmodule
 | |
| 
 |