81 líneas
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			81 líneas
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| import "RV32IBase.core_desc"
 | |
| 
 | |
| InsructionSet RV32M extends RV32IBase {
 | |
| 	constants {
 | |
| 		XLEN2
 | |
| 	}
 | |
| 	instructions{       
 | |
| 		MUL{
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		        val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
 | |
| 		    	X[rd]<= zext(res , XLEN);
 | |
| 		    }
 | |
| 		}
 | |
| 		MULH {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		        val res[XLEN2] <= sext(X[rs1], XLEN2) * sext(X[rs2], XLEN2);
 | |
|                 X[rd]<= zext(res >> XLEN, XLEN);
 | |
| 		    }
 | |
| 		}
 | |
| 		MULHSU {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
|                 val res[XLEN2] <= sext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
 | |
|                 X[rd]<= zext(res >> XLEN, XLEN);
 | |
| 		    }
 | |
| 		}
 | |
| 		MULHU {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
|                 val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
 | |
|                 X[rd]<= zext(res >> XLEN, XLEN);
 | |
| 		    }
 | |
| 		}
 | |
| 		DIV {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		    	if(X[rs2]!=0)
 | |
| 		    		X[rd] <= sext(X[rs1], 32) / sext(X[rs2], 32);
 | |
| 		    	else 
 | |
| 		    		X[rd] <= -1;
 | |
| 		    }
 | |
| 		}
 | |
| 		DIVU {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		    	if(X[rs2]!=0)
 | |
| 		    		X[rd] <= zext(X[rs1], 32) / zext(X[rs2], 32);
 | |
| 		    	else 
 | |
| 		    		X[rd] <= -1;
 | |
| 		    }
 | |
| 		}
 | |
| 		REM {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		    	if(X[rs2]!=0)
 | |
| 		    		X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
 | |
| 		    	else 
 | |
| 		    		X[rd] <= X[rs1];
 | |
| 		    }
 | |
| 		}
 | |
| 		REMU {
 | |
| 			encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
 | |
| 		    args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
 | |
| 		    if(rd != 0){
 | |
| 		    	if(X[rs2]!=0)
 | |
| 			    	X[rd] <= zext(X[rs1], 32) % zext(X[rs2], 32);
 | |
| 		    	else 
 | |
| 		    		X[rd] <= X[rs1];
 | |
| 		    }
 | |
| 		}
 | |
| 	}
 | |
| } |