Skip to content

Commit 05b845c

Browse files
Merge pull request riscv#517 from jordancarlin/zc_extensions
Use Zc* extensions instead of just the C extension
2 parents d538d45 + b4a6db0 commit 05b845c

9 files changed

+105
-120
lines changed

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ SAIL_VLEN := riscv_vlen.sail
2323

2424
# Instruction sources, depending on target
2525
SAIL_CHECK_SRCS = riscv_addr_checks_common.sail riscv_addr_checks.sail riscv_misa_ext.sail
26-
SAIL_DEFAULT_INST = riscv_insts_base.sail riscv_insts_aext.sail riscv_insts_cext.sail riscv_insts_mext.sail riscv_insts_zicsr.sail riscv_insts_next.sail riscv_insts_hints.sail
27-
SAIL_DEFAULT_INST += riscv_insts_fext.sail riscv_insts_cfext.sail
28-
SAIL_DEFAULT_INST += riscv_insts_dext.sail riscv_insts_cdext.sail
26+
SAIL_DEFAULT_INST = riscv_insts_base.sail riscv_insts_aext.sail riscv_insts_zca.sail riscv_insts_mext.sail riscv_insts_zicsr.sail riscv_insts_next.sail riscv_insts_hints.sail
27+
SAIL_DEFAULT_INST += riscv_insts_fext.sail riscv_insts_zcf.sail
28+
SAIL_DEFAULT_INST += riscv_insts_dext.sail riscv_insts_zcd.sail
2929

3030
SAIL_DEFAULT_INST += riscv_insts_svinval.sail
3131

model/riscv_fetch.sail

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function fetch() -> FetchResult =
1919
match ext_fetch_check_pc(PC, PC) {
2020
Ext_FetchAddr_Error(e) => F_Ext_Error(e),
2121
Ext_FetchAddr_OK(use_pc) => {
22-
if (use_pc[0] != bitzero | (use_pc[1] != bitzero & not(extensionEnabled(Ext_C))))
22+
if (use_pc[0] != bitzero | (use_pc[1] != bitzero & not(extensionEnabled(Ext_Zca))))
2323
then F_Error(E_Fetch_Addr_Align(), PC)
2424
else match translateAddr(use_pc, Execute()) {
2525
TR_Failure(e, _) => F_Error(e, PC),

model/riscv_fetch_rvfi.sail

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function fetch() -> FetchResult = {
1717
Ext_FetchAddr_Error(e) => F_Ext_Error(e),
1818
Ext_FetchAddr_OK(use_pc) => {
1919
/* then check PC alignment */
20-
if (use_pc[0] != bitzero | (use_pc[1] != bitzero & not(extensionEnabled(Ext_C))))
20+
if (use_pc[0] != bitzero | (use_pc[1] != bitzero & not(extensionEnabled(Ext_Zca))))
2121
then F_Error(E_Fetch_Addr_Align(), PC)
2222
else match translateAddr(use_pc, Execute()) {
2323
TR_Failure(e, _) => F_Error(e, PC),

model/riscv_insts_base.sail

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
enum clause extension = Ext_C
1313
function clause extensionEnabled(Ext_C) = misa[C] == 0b1
1414

15+
enum clause extension = Ext_Zca
16+
function clause extensionEnabled(Ext_Zca) = extensionEnabled(Ext_C)
17+
1518
/* ****************************************************************** */
1619
union clause ast = UTYPE : (bits(20), regidx, uop)
1720

@@ -69,7 +72,7 @@ function clause execute (RISCV_JAL(imm, rd)) = {
6972
},
7073
Ext_ControlAddr_OK(target) => {
7174
/* Perform standard alignment check */
72-
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_C))
75+
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_Zca))
7376
then {
7477
handle_mem_exception(target, E_Fetch_Addr_Align());
7578
RETIRE_FAIL
@@ -133,7 +136,7 @@ function clause execute (BTYPE(imm, rs2, rs1, op)) = {
133136
RETIRE_FAIL
134137
},
135138
Ext_ControlAddr_OK(target) => {
136-
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_C)) then {
139+
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_Zca)) then {
137140
handle_mem_exception(target, E_Fetch_Addr_Align());
138141
RETIRE_FAIL;
139142
} else {

model/riscv_insts_cext.sail model/riscv_insts_zca.sail

+71-72
Large diffs are not rendered by default.

model/riscv_insts_cdext.sail model/riscv_insts_zcd.sail

+10-23
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,13 @@
66
/* SPDX-License-Identifier: BSD-2-Clause */
77
/*=======================================================================================*/
88

9-
/* ********************************************************************* */
10-
/* This file specifies the compressed floating-point instructions.
11-
*
12-
* These instructions are only legal if misa[C] and misa[D]
13-
* are set.
14-
*/
9+
enum clause extension = Ext_Zcd
10+
function clause extensionEnabled(Ext_Zcd) = extensionEnabled(Ext_Zca) & extensionEnabled(Ext_D) & (sizeof(xlen) == 32 | sizeof(xlen) == 64)
1511

16-
/* ****************************************************************** */
1712
union clause ast = C_FLDSP : (bits(6), regidx)
1813

19-
mapping clause encdec_compressed = C_FLDSP(ui86 @ ui5 @ ui43, rd)
20-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
21-
<-> 0b001 @ ui5 : bits(1) @ rd : regidx @ ui43 : bits(2) @ ui86 : bits(3) @ 0b10
22-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
14+
mapping clause encdec_compressed = C_FLDSP(ui86 @ ui5 @ ui43, rd) if extensionEnabled(Ext_Zcd)
15+
<-> 0b001 @ ui5 : bits(1) @ rd : regidx @ ui43 : bits(2) @ ui86 : bits(3) @ 0b10 if extensionEnabled(Ext_Zcd)
2316

2417
function clause execute (C_FLDSP(uimm, rd)) = {
2518
let imm : bits(12) = zero_extend(uimm @ 0b000);
@@ -34,10 +27,8 @@ mapping clause assembly = C_FLDSP(uimm, rd)
3427
/* ****************************************************************** */
3528
union clause ast = C_FSDSP : (bits(6), regidx)
3629

37-
mapping clause encdec_compressed = C_FSDSP(ui86 @ ui53, rs2)
38-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
39-
<-> 0b101 @ ui53 : bits(3) @ ui86 : bits(3) @ rs2 : regidx @ 0b10
40-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
30+
mapping clause encdec_compressed = C_FSDSP(ui86 @ ui53, rs2) if extensionEnabled(Ext_Zcd)
31+
<-> 0b101 @ ui53 : bits(3) @ ui86 : bits(3) @ rs2 : regidx @ 0b10 if extensionEnabled(Ext_Zcd)
4132

4233
function clause execute (C_FSDSP(uimm, rs2)) = {
4334
let imm : bits(12) = zero_extend(uimm @ 0b000);
@@ -52,10 +43,8 @@ mapping clause assembly = C_FSDSP(uimm, rs2)
5243
/* ****************************************************************** */
5344
union clause ast = C_FLD : (bits(5), cregidx, cregidx)
5445

55-
mapping clause encdec_compressed = C_FLD(ui76 @ ui53, rs1, rd)
56-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
57-
<-> 0b001 @ ui53 : bits(3) @ rs1 : cregidx @ ui76 : bits(2) @ rd : cregidx @ 0b00
58-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
46+
mapping clause encdec_compressed = C_FLD(ui76 @ ui53, rs1, rd) if extensionEnabled(Ext_Zcd)
47+
<-> 0b001 @ ui53 : bits(3) @ rs1 : cregidx @ ui76 : bits(2) @ rd : cregidx @ 0b00 if extensionEnabled(Ext_Zcd)
5948

6049
function clause execute (C_FLD(uimm, rsc, rdc)) = {
6150
let imm : bits(12) = zero_extend(uimm @ 0b000);
@@ -72,10 +61,8 @@ mapping clause assembly = C_FLD(uimm, rsc, rdc)
7261
/* ****************************************************************** */
7362
union clause ast = C_FSD : (bits(5), cregidx, cregidx)
7463

75-
mapping clause encdec_compressed = C_FSD(ui76 @ ui53, rs1, rs2)
76-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
77-
<-> 0b101 @ ui53 : bits(3) @ rs1 : bits(3) @ ui76 : bits(2) @ rs2 : bits(3) @ 0b00
78-
if (sizeof(xlen) == 32 | sizeof(xlen) == 64) & extensionEnabled(Ext_C) & extensionEnabled(Ext_D)
64+
mapping clause encdec_compressed = C_FSD(ui76 @ ui53, rs1, rs2) if extensionEnabled(Ext_Zcd)
65+
<-> 0b101 @ ui53 : bits(3) @ rs1 : bits(3) @ ui76 : bits(2) @ rs2 : bits(3) @ 0b00 if extensionEnabled(Ext_Zcd)
7966

8067
function clause execute (C_FSD(uimm, rsc1, rsc2)) = {
8168
let imm : bits(12) = zero_extend(uimm @ 0b000);

model/riscv_insts_cfext.sail model/riscv_insts_zcf.sail

+12-16
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
*/
1515

1616
/* ****************************************************************** */
17+
18+
enum clause extension = Ext_Zcf
19+
function clause extensionEnabled(Ext_Zcf) = extensionEnabled(Ext_Zca) & extensionEnabled(Ext_F) & sizeof(xlen) == 32
20+
1721
union clause ast = C_FLWSP : (bits(6), regidx)
1822

19-
mapping clause encdec_compressed = C_FLWSP(ui76 @ ui5 @ ui42, rd)
20-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
21-
<-> 0b011 @ ui5 : bits(1) @ rd : regidx @ ui42 : bits(3) @ ui76 : bits(2) @ 0b10
22-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
23+
mapping clause encdec_compressed = C_FLWSP(ui76 @ ui5 @ ui42, rd) if extensionEnabled(Ext_Zcf)
24+
<-> 0b011 @ ui5 : bits(1) @ rd : regidx @ ui42 : bits(3) @ ui76 : bits(2) @ 0b10 if extensionEnabled(Ext_Zcf)
2325

2426
function clause execute (C_FLWSP(imm, rd)) = {
2527
let imm : bits(12) = zero_extend(imm @ 0b00);
@@ -34,10 +36,8 @@ mapping clause assembly = C_FLWSP(imm, rd)
3436
/* ****************************************************************** */
3537
union clause ast = C_FSWSP : (bits(6), regidx)
3638

37-
mapping clause encdec_compressed = C_FSWSP(ui76 @ ui52, rs2)
38-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
39-
<-> 0b111 @ ui52 : bits(4) @ ui76 : bits(2) @ rs2 : regidx @ 0b10
40-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
39+
mapping clause encdec_compressed = C_FSWSP(ui76 @ ui52, rs2) if extensionEnabled(Ext_Zcf)
40+
<-> 0b111 @ ui52 : bits(4) @ ui76 : bits(2) @ rs2 : regidx @ 0b10 if extensionEnabled(Ext_Zcf)
4141

4242
function clause execute (C_FSWSP(uimm, rs2)) = {
4343
let imm : bits(12) = zero_extend(uimm @ 0b00);
@@ -52,10 +52,8 @@ mapping clause assembly = C_FSWSP(uimm, rs2)
5252
/* ****************************************************************** */
5353
union clause ast = C_FLW : (bits(5), cregidx, cregidx)
5454

55-
mapping clause encdec_compressed = C_FLW(ui6 @ ui53 @ ui2, rs1, rd)
56-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
57-
<-> 0b011 @ ui53 : bits(3) @ rs1 : cregidx @ ui2 : bits(1) @ ui6 : bits(1) @ rd : cregidx @ 0b00
58-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
55+
mapping clause encdec_compressed = C_FLW(ui6 @ ui53 @ ui2, rs1, rd) if extensionEnabled(Ext_Zcf)
56+
<-> 0b011 @ ui53 : bits(3) @ rs1 : cregidx @ ui2 : bits(1) @ ui6 : bits(1) @ rd : cregidx @ 0b00 if extensionEnabled(Ext_Zcf)
5957

6058
function clause execute (C_FLW(uimm, rsc, rdc)) = {
6159
let imm : bits(12) = zero_extend(uimm @ 0b00);
@@ -72,10 +70,8 @@ mapping clause assembly = C_FLW(uimm, rsc, rdc)
7270
/* ****************************************************************** */
7371
union clause ast = C_FSW : (bits(5), cregidx, cregidx)
7472

75-
mapping clause encdec_compressed = C_FSW(ui6 @ ui53 @ ui2, rs1, rs2)
76-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
77-
<-> 0b111 @ ui53 : bits(3) @ rs1 : cregidx @ ui2 : bits(1) @ ui6 : bits(1) @ rs2 : cregidx @ 0b00
78-
if sizeof(xlen) == 32 & extensionEnabled(Ext_C) & extensionEnabled(Ext_F)
73+
mapping clause encdec_compressed = C_FSW(ui6 @ ui53 @ ui2, rs1, rs2) if extensionEnabled(Ext_Zcf)
74+
<-> 0b111 @ ui53 : bits(3) @ rs1 : cregidx @ ui2 : bits(1) @ ui6 : bits(1) @ rs2 : cregidx @ 0b00 if extensionEnabled(Ext_Zcf)
7975

8076
function clause execute (C_FSW(uimm, rsc1, rsc2)) = {
8177
let imm : bits(12) = zero_extend(uimm @ 0b00);

model/riscv_jalr_seq.sail

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function clause execute (RISCV_JALR(imm, rs1, rd)) = {
2424
},
2525
Ext_ControlAddr_OK(addr) => {
2626
let target = [addr with 0 = bitzero]; /* clear addr[0] */
27-
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_C)) then {
27+
if bit_to_bool(target[1]) & not(extensionEnabled(Ext_Zca)) then {
2828
handle_mem_exception(target, E_Fetch_Addr_Align());
2929
RETIRE_FAIL
3030
} else {

model/riscv_step.sail

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ function step(step_no : int) -> bool = {
5454
print_instr("[" ^ dec_str(step_no) ^ "] [" ^ to_str(cur_privilege) ^ "]: " ^ BitStr(PC) ^ " (" ^ BitStr(h) ^ ") " ^ to_str(ast));
5555
};
5656
/* check for RVC once here instead of every RVC execute clause. */
57-
if extensionEnabled(Ext_C) then {
57+
if extensionEnabled(Ext_Zca) then {
5858
nextPC = PC + 2;
5959
(execute(ast), true)
6060
} else {

0 commit comments

Comments
 (0)