117 líneas
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			117 líneas
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| import "RV32I.core_desc"
 | |
| 
 | |
| InsructionSet RV64I extends RV32I {
 | |
|     instructions{
 | |
|         LWU { //    80000104: 0000ef03            lwu t5,0(ra)
 | |
|             encoding: imm[11:0]s | rs1[4:0] | b110 | rd[4:0] | b0000011;
 | |
|             args_disass:"{name(rd)}, {imm}({name(rs1)})";
 | |
|             val offs[XLEN] <= X[rs1]'s+imm;
 | |
|             if(rd!=0) X[rd]<=zext(MEM[offs]{32});
 | |
|         }
 | |
|         LD{
 | |
|             encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0000011;
 | |
|             args_disass:"{name(rd)}, {imm}({name(rs1)})";
 | |
|             val offs[XLEN] <= X[rs1]'s + imm;
 | |
|             if(rd!=0) X[rd]<=sext(MEM[offs]{64});
 | |
|         }
 | |
|         SD{
 | |
|             encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b011 | imm[4:0]s | b0100011;
 | |
|             args_disass:"{name(rs2)}, {imm}({name(rs1)})";
 | |
|             val offs[XLEN] <= X[rs1]'s + imm;
 | |
|             MEM[offs]{64} <= X[rs2];
 | |
|         }
 | |
|         SLLI {
 | |
|             encoding: b000000 | shamt[5:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0) X[rd] <= shll(X[rs1], shamt);
 | |
|         }
 | |
|         SRLI {
 | |
|             encoding: b000000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
 | |
|         }
 | |
|         SRAI {
 | |
|             encoding: b010000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0) X[rd] <= shra(X[rs1], shamt);
 | |
|         }
 | |
|         ADDIW {
 | |
|             encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0011011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {imm}";
 | |
|             if(rd != 0){
 | |
|                 val res[32] <= X[rs1]{32}'s + imm;
 | |
|                 X[rd] <= sext(res);
 | |
|             } 
 | |
|         }
 | |
|         SLLIW {
 | |
|             encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0011011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0){
 | |
|                 val sh_val[32] <= shll(X[rs1]{32}, shamt);
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             } 
 | |
|         }
 | |
|         SRLIW {
 | |
|             encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0){
 | |
|                 val sh_val[32] <= shrl(X[rs1]{32}, shamt);
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             } 
 | |
|         }
 | |
|         SRAIW {
 | |
|             encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
 | |
|             if(rd != 0){
 | |
|                 val sh_val[32] <= shra(X[rs1]{32}, shamt);    
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             }
 | |
|         }
 | |
|         ADDW {
 | |
|             encoding: b0000000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
 | |
|             if(rd != 0){
 | |
|                 val res[32] <= X[rs1]{32} + X[rs2]{32};
 | |
|                 X[rd] <= sext(res);
 | |
|             } 
 | |
|         }
 | |
|         SUBW {
 | |
|             encoding: b0100000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
 | |
|             if(rd != 0){
 | |
|                 val res[32] <= X[rs1]{32} - X[rs2]{32};
 | |
|                 X[rd] <= sext(res);
 | |
|             } 
 | |
|         }
 | |
|         SLLW {
 | |
|             encoding: b0000000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0111011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
 | |
|             if(rd != 0){
 | |
|                 val mask[32] <= 0x1f;
 | |
|                 val count[32] <= X[rs2]{32} & mask;
 | |
|                 val sh_val[32] <= shll(X[rs1]{32}, count);
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             } 
 | |
|         }
 | |
|         SRLW {
 | |
|             encoding: b0000000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
 | |
|             if(rd != 0){
 | |
|                 val mask[32] <= 0x1f;
 | |
|                 val count[32] <= X[rs2]{32} & mask;
 | |
|                 val sh_val[32] <= shrl(X[rs1]{32}, count);
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             } 
 | |
|         }
 | |
|         SRAW {
 | |
|             encoding: b0100000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
 | |
|             args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
 | |
|             if(rd != 0){
 | |
|                 val mask[32] <= 0x1f;
 | |
|                 val count[32] <= X[rs2]{32} & mask;
 | |
|                 val sh_val[32] <= shra(X[rs1]{32}, count);
 | |
|                 X[rd] <= sext(sh_val);
 | |
|             } 
 | |
|         }
 | |
|     }    
 | |
| }
 | |
| 
 |