254 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			254 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | 
 | ||
|  | .definition | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | # invalid rs2=0 | ||
|  | c.add0 =        [1001.....1....10] | ||
|  | c.add1 =        [1001......1...10] | ||
|  | c.add2 =        [1001.......1..10] | ||
|  | c.add3 =        [1001........1.10] | ||
|  | c.add4 =        [1001.........110] | ||
|  | 
 | ||
|  | # invalid rs2=0 | ||
|  | c.mv0 =        [1000.....1....10] | ||
|  | c.mv1 =        [1000......1...10] | ||
|  | c.mv2 =        [1000.......1..10] | ||
|  | c.mv3 =        [1000........1.10] | ||
|  | c.mv4 =        [1000.........110] | ||
|  | 
 | ||
|  | 
 | ||
|  | # invalid if rs1=0 | ||
|  | c.jalr0 =       [10011....0000010] | ||
|  | c.jalr1 =       [1001.1...0000010] | ||
|  | c.jalr2 =       [1001..1..0000010] | ||
|  | c.jalr3 =       [1001...1.0000010] | ||
|  | c.jalr4 =       [1001....10000010] | ||
|  | 
 | ||
|  | c.addi  =        [000...........01] | ||
|  | 
 | ||
|  | # invalid imm=0 | ||
|  | c.addi16sp0 =   [011100010.....01] | ||
|  | c.addi16sp1 =   [011.000101....01] | ||
|  | c.addi16sp2 =   [011.00010.1...01] | ||
|  | c.addi16sp3 =   [011.00010..1..01] | ||
|  | c.addi16sp4 =   [011.00010...1.01] | ||
|  | c.addi16sp5 =   [011.00010....101] | ||
|  | 
 | ||
|  | # invalid uimm=0 | ||
|  | c.addi4spn0 =   [0001..........00] | ||
|  | c.addi4spn1 =   [000.1.........00] | ||
|  | c.addi4spn2 =   [000..1........00] | ||
|  | c.addi4spn3 =   [000...1.......00] | ||
|  | c.addi4spn4 =   [000....1......00] | ||
|  | c.addi4spn5 =   [000.....1.....00] | ||
|  | c.addi4spn6 =   [000......1....00] | ||
|  | c.addi4spn7 =   [000.......1...00] | ||
|  | 
 | ||
|  | 
 | ||
|  | c.and =         [100011...11...01] | ||
|  | c.andi =        [100.10........01] | ||
|  | c.beqz =        [110...........01] | ||
|  | c.bnez =        [111...........01] | ||
|  | c.ebreak =      [1001000000000010] | ||
|  | c.j =           [101...........01] | ||
|  | c.jal =         [001...........01] | ||
|  | 
 | ||
|  | 
 | ||
|  | c.jr0 =                 [10001....0000010] | ||
|  | c.jr1 =                 [1000.1...0000010] | ||
|  | c.jr2 =                 [1000..1..0000010] | ||
|  | c.jr3 =                 [1000...1.0000010] | ||
|  | c.jr4 =                 [1000....10000010] | ||
|  | 
 | ||
|  | c.li =           [010...........01] | ||
|  | 
 | ||
|  | # invalid rd=x2 or imm=0 | ||
|  | c.lui0 =                [01111.........01] | ||
|  | c.lui1 =                [0111.1........01] | ||
|  | c.lui2 =                [0111..1.......01] | ||
|  | c.lui3 =                [0111...0......01] | ||
|  | c.lui4 =                [0111....1.....01] | ||
|  | c.lui5 =                [011.1....1....01] | ||
|  | c.lui6 =                [011..1...1....01] | ||
|  | c.lui7 =                [011...1..1....01] | ||
|  | c.lui8 =                [011....0.1....01] | ||
|  | c.lui9 =                [011.....11....01] | ||
|  | c.lui10=                [011.1.....1...01] | ||
|  | c.lui11=                [011..1....1...01] | ||
|  | c.lui12 =               [011...1...1...01] | ||
|  | c.lui13 =               [011....0..1...01] | ||
|  | c.lui14 =               [011.....1.1...01] | ||
|  | c.lui15 =               [011.1......1..01] | ||
|  | c.lui16 =               [011..1.....1..01] | ||
|  | c.lui17 =               [011...1....1..01] | ||
|  | c.lui18 =               [011....0...1..01] | ||
|  | c.lui19 =               [011.....1..1..01] | ||
|  | c.lui20 =               [011.1.......1.01] | ||
|  | c.lui21 =               [011..1......1.01] | ||
|  | c.lui22 =               [011...1.....1.01] | ||
|  | c.lui23 =               [011....0....1.01] | ||
|  | c.lui24 =               [011.....1...1.01] | ||
|  | c.lui25 =               [011.1........101] | ||
|  | c.lui26 =               [011..1.......101] | ||
|  | c.lui27 =               [011...1......101] | ||
|  | c.lui28 =               [011....0.....101] | ||
|  | c.lui29 =               [011.....1....101] | ||
|  | 
 | ||
|  | 
 | ||
|  | c.lw =          [010...........00] | ||
|  | 
 | ||
|  | 
 | ||
|  | c.lwsp =        [010...........10] | ||
|  | 
 | ||
|  | c.or =          [100011...10...01] | ||
|  | 
 | ||
|  | # bit 5 of the shift must be 0 to be legal | ||
|  | c.slli =        [0000..........10] | ||
|  | 
 | ||
|  | c.srai =        [100001........01] | ||
|  | 
 | ||
|  | c.srli =        [100000........01] | ||
|  | 
 | ||
|  | c.sub =         [100011...00...01] | ||
|  | c.sw =          [110...........00] | ||
|  | c.swsp =        [110...........10] | ||
|  | c.xor =         [100011...01...01] | ||
|  | 
 | ||
|  | 
 | ||
|  | .input | ||
|  | rv32c = { | ||
|  |         i[15] | ||
|  |         i[14] | ||
|  |         i[13] | ||
|  |         i[12] | ||
|  |         i[11] | ||
|  |         i[10] | ||
|  |         i[9] | ||
|  |         i[8] | ||
|  |         i[7] | ||
|  |         i[6] | ||
|  |         i[5] | ||
|  |         i[4] | ||
|  |         i[3] | ||
|  |         i[2] | ||
|  |         i[1] | ||
|  |         i[0] | ||
|  | } | ||
|  | 
 | ||
|  | .output | ||
|  | rv32c = { | ||
|  |         rdrd | ||
|  |         rdrs1 | ||
|  |         rs2rs2 | ||
|  |         rdprd | ||
|  |         rdprs1 | ||
|  |         rs2prs2 | ||
|  |         rs2prd | ||
|  |         uimm9_2 | ||
|  |         ulwimm6_2 | ||
|  |         ulwspimm7_2 | ||
|  |         rdeq2 | ||
|  |         rdeq1 | ||
|  |         rs1eq2 | ||
|  |         sbroffset8_1 | ||
|  |         simm9_4 | ||
|  |         simm5_0 | ||
|  |         sjaloffset11_1 | ||
|  |         sluimm17_12 | ||
|  |         uimm5_0 | ||
|  |         uswimm6_2 | ||
|  |         uswspimm7_2 | ||
|  |         o[31] | ||
|  |         o[30] | ||
|  |         o[29] | ||
|  |         o[28] | ||
|  |         o[27] | ||
|  |         o[26] | ||
|  |         o[25] | ||
|  |         o[24] | ||
|  |         o[23] | ||
|  |         o[22] | ||
|  |         o[21] | ||
|  |         o[20] | ||
|  |         o[19] | ||
|  |         o[18] | ||
|  |         o[17] | ||
|  |         o[16] | ||
|  |         o[15] | ||
|  |         o[14] | ||
|  |         o[13] | ||
|  |         o[12] | ||
|  |         o[11] | ||
|  |         o[10] | ||
|  |         o[9] | ||
|  |         o[8] | ||
|  |         o[7] | ||
|  |         o[6] | ||
|  |         o[5] | ||
|  |         o[4] | ||
|  |         o[3] | ||
|  |         o[2] | ||
|  |         o[1] | ||
|  |         o[0] | ||
|  |       } | ||
|  | 
 | ||
|  | #  assign rs2d[4:0] = i[6:2]; | ||
|  | # | ||
|  | #   assign rdd[4:0] = i[11:7]; | ||
|  | # | ||
|  | #   assign rdpd[4:0] = {2'b01, i[9:7]}; | ||
|  | # | ||
|  | #   assign rs2pd[4:0] = {2'b01, i[4:2]}; | ||
|  | 
 | ||
|  | .decode | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.add{0-4}] =             { rdrd rdrs1 rs2rs2                                    o[5] o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.mv{0-4}] =              { rdrd rs2rs2                                          o[5] o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.addi] =                 { rdrd rdrs1 simm5_0                                          o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.addi16sp{0-5}] =        { rdeq2 rs1eq2 simm9_4                                        o[4] o[1] o[0] } | ||
|  | rv32c[c.addi4spn{0-7}] =        { rs2prd rs1eq2 uimm9_2                                         o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.and] =                  { rdprd rdprs1 rs2prs2          o[14] o[13] o[12]      o[5] o[4] o[1] o[0] } | ||
|  | rv32c[c.andi] =                 { rdprd rdprs1 simm5_0            o[14] o[13] o[12]           o[4] o[1] o[0] } | ||
|  | rv32c[c.beqz] =                 { rdprs1 sbroffset8_1                                o[6] o[5]      o[1] o[0] } | ||
|  | rv32c[c.bnez] =                 { rdprs1 sbroffset8_1                          o[12] o[6] o[5]      o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.ebreak] =               {                            o[20]                o[6] o[5] o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.j] =                    { sjaloffset11_1                                            o[6] o[5]      o[3] o[2] o[1] o[0] } | ||
|  | rv32c[c.jal] =                  { sjaloffset11_1 rdeq1                                      o[6] o[5]      o[3] o[2] o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.jalr{0-4}] =            { rdeq1 rdrs1                                           o[6] o[5]           o[2] o[1] o[0] } | ||
|  | rv32c[c.jr{0-4}] =              {       rdrs1                                           o[6] o[5]           o[2] o[1] o[0] } | ||
|  | rv32c[c.li] =                   { rdrd simm5_0                                               o[4]           o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.lui{0-29}] =            { rdrd sluimm17_12                                                o[5] o[4]      o[2] o[1] o[0] } | ||
|  | rv32c[c.lw] =                   { rs2prd rdprs1 ulwimm6_2                    o[13]                                 o[1] o[0] } | ||
|  | rv32c[c.lwsp] =                 { rdrd rs1eq2 ulwspimm7_2                    o[13]                                 o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.or] =                   { rdprd rdprs1 rs2prs2               o[14] o[13]             o[5] o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | rv32c[c.slli] =            { rdrd rdrs1 uimm5_0                               o[12]            o[4] o[1] o[0] } | ||
|  | rv32c[c.srai] =           { rdprd rdprs1 uimm5_0          o[30] o[14]        o[12]            o[4] o[1] o[0] } | ||
|  | rv32c[c.srli] =            { rdprd rdprs1 uimm5_0                o[14]        o[12]            o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | rv32c[c.sub] =                  { rdprd rdprs1 rs2prs2        o[30]                          o[5] o[4] o[1] o[0] } | ||
|  | rv32c[c.sw] =                   { rdprs1 rs2prs2 uswimm6_2                   o[13]             o[5]      o[1] o[0] } | ||
|  | rv32c[c.swsp] =                 { rs2rs2 rs1eq2  uswspimm7_2                 o[13]             o[5]      o[1] o[0] } | ||
|  | rv32c[c.xor] =                  { rdprd rdprs1 rs2prs2              o[14]                    o[5] o[4] o[1] o[0] } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | .end |