mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Generalise structs and add support for packed unions.
This commit is contained in:
		
							parent
							
								
									0b6b47ca67
								
							
						
					
					
						commit
						f482c9c016
					
				
					 8 changed files with 209 additions and 59 deletions
				
			
		
							
								
								
									
										61
									
								
								tests/svtypes/union_simple.sv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								tests/svtypes/union_simple.sv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
module top;
 | 
			
		||||
 | 
			
		||||
	typedef struct packed {
 | 
			
		||||
		byte a,b,c,d;
 | 
			
		||||
	} byte4_t;
 | 
			
		||||
 | 
			
		||||
	typedef union packed {
 | 
			
		||||
		int	x;
 | 
			
		||||
		byte4_t	y;
 | 
			
		||||
	} w_t;
 | 
			
		||||
 | 
			
		||||
	w_t w;
 | 
			
		||||
 | 
			
		||||
	assign w.x = 'h42;
 | 
			
		||||
	always_comb begin
 | 
			
		||||
		assert(w.y.d == 8'h42);
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	typedef logic[4:0] reg_addr_t;
 | 
			
		||||
	typedef logic[6:0] opcode_t;
 | 
			
		||||
 | 
			
		||||
	typedef struct packed {
 | 
			
		||||
		bit [6:0]  func7;
 | 
			
		||||
		reg_addr_t rs2;
 | 
			
		||||
		reg_addr_t rs1;
 | 
			
		||||
		bit [2:0]  func3;
 | 
			
		||||
		reg_addr_t rd;
 | 
			
		||||
		opcode_t   opcode;
 | 
			
		||||
	} R_t;
 | 
			
		||||
 | 
			
		||||
	typedef struct packed {
 | 
			
		||||
		bit[11:0]  imm;
 | 
			
		||||
		reg_addr_t rs1;
 | 
			
		||||
		bit[2:0]   func3;
 | 
			
		||||
		reg_addr_t rd;
 | 
			
		||||
		opcode_t   opcode;
 | 
			
		||||
	} I_t;
 | 
			
		||||
 | 
			
		||||
	typedef struct packed {
 | 
			
		||||
		bit[19:0]  imm;
 | 
			
		||||
		reg_addr_t rd;
 | 
			
		||||
		opcode_t   opcode;
 | 
			
		||||
	} U_t;
 | 
			
		||||
 | 
			
		||||
	typedef union packed {
 | 
			
		||||
		R_t	r;
 | 
			
		||||
		I_t	i;
 | 
			
		||||
		U_t	u;
 | 
			
		||||
	} instruction_t;
 | 
			
		||||
 | 
			
		||||
	instruction_t ir1;
 | 
			
		||||
	assign ir1 = 32'h0AA01EB7;          //	lui t4,0xAA01
 | 
			
		||||
	always_comb begin
 | 
			
		||||
		assert(ir1.u.opcode == 'h37);
 | 
			
		||||
		assert(ir1.r.opcode == 'h37);
 | 
			
		||||
		assert(ir1.u.rd == 'd29);
 | 
			
		||||
		assert(ir1.r.rd == 'd29);
 | 
			
		||||
		assert(ir1.u.imm == 'hAA01);
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue