Skip to content

Commit 4434e41

Browse files
Add non-rvfi upcnt
Currently limited to checking low half, but seems to work. Support global code (useful for doing things like `if (condition) assume(condition);` that would otherwise make for a messy `assume(condition)` without the `if`.
1 parent 256926e commit 4434e41

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/csrs/behavior.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ def regs(self, csr_width: str, csr_has_rvfi: bool) -> NamedSet[BehavioralReg]: p
1818
def global_assumptions(self) -> list[str]:
1919
return []
2020

21+
def global_code(self, csr_has_rvfi: bool) -> Optional[str]:
22+
return None
23+
2124
@property
2225
def check_assumptions(self) -> list[str]:
2326
return []
@@ -66,7 +69,7 @@ def check_assumptions(self) -> list[str]:
6669

6770
@property
6871
def check_condition(self) -> str:
69-
return "csr_written && csr_read_valid && csr_insn_under_test"
72+
return "csr_read_valid && csr_insn_under_test"
7073

7174
def check(self, csr_has_rvfi: bool) -> str:
7275
if csr_has_rvfi:
@@ -84,7 +87,6 @@ def check(self, csr_has_rvfi: bool) -> str:
8487
else:
8588
return dedent("""
8689
assume(csr_mode_shadow <= 2'b 01);
87-
assume(rvfi.rd_addr != 0);
8890
case (csr_mode_shadow)
8991
2'b 00 /* None */,
9092
2'b 01 /* RW */: begin
@@ -101,13 +103,17 @@ def assign_condition(self) -> str:
101103

102104
class UpcntValue(Behavior):
103105
def regs(self, csr_width: str, csr_has_rvfi: bool) -> NamedSet[BehavioralReg]:
104-
regs = NamedSet([
105-
BehavioralReg("csr_read_shadowed", "1", "1"),
106-
])
107106
if csr_has_rvfi:
108-
regs.add(BehavioralReg("rdata_shadow", csr_width, "csr_insn_rdata"))
107+
regs = NamedSet([
108+
BehavioralReg("csr_read_lo", "1", "1"),
109+
BehavioralReg("rdata_shadow", csr_width, "csr_insn_rdata"),
110+
])
109111
else:
110-
regs.add(BehavioralReg("rdata_shadow", csr_width, "rvfi.rd_wdata"))
112+
regs = NamedSet([
113+
BehavioralReg("csr_read_hi", "1", "csr_hi"),
114+
BehavioralReg("csr_read_lo", "1", "csr_lo"),
115+
BehavioralReg("rdata_shadow", csr_width, "rvfi.rd_wdata"),
116+
])
111117
return regs
112118

113119
@property
@@ -116,7 +122,7 @@ def global_assumptions(self) -> list[str]:
116122

117123
@property
118124
def check_assumptions(self) -> list[str]:
119-
return ["csr_read_shadowed"]
125+
return ["csr_read_lo"]
120126

121127
@property
122128
def check_condition(self) -> str:
@@ -128,7 +134,9 @@ def check(self, csr_has_rvfi: bool) -> str:
128134
assert(csr_insn_rdata > rdata_shadow);""")
129135
else:
130136
return dedent("""
131-
assume(0);""")
137+
// currently only tests low half when not using rvfi signal
138+
assume(csr_lo);
139+
assert(rvfi.rd_wdata > rdata_shadow[31:0]);""")
132140

133141
@property
134142
def assign_assumptions(self) -> list[str]:

src/csrs/csr.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ def _v_process(self, xlen: int) -> str:
107107
reset = f"{reg.name} = {reg.default_value};"
108108
v_str += f"reg {reg.bitrange()} {reset}\n"
109109
resets.append(reset)
110-
assigns.append(f"{reg.name} = {reg.spec_value};")
110+
if not self.has_rvfi and reg_width == "64" and reg.spec_value == "rvfi.rd_wdata":
111+
assigns.append(f"if (csr_hi) {reg.name}[63:32] = {reg.spec_value};")
112+
assigns.append(f"if (csr_lo) {reg.name}[31: 0] = {reg.spec_value};")
113+
else:
114+
assigns.append(f"{reg.name} = {reg.spec_value};")
111115
reset_str = "\n ".join(resets)
112116
assign_str = "\n ".join(assigns)
113117

@@ -125,6 +129,10 @@ def _v_process(self, xlen: int) -> str:
125129

126130
check_str = indent(self.behavior.check(self.has_rvfi), " ")
127131

132+
global_code = self.behavior.global_code(self.has_rvfi)
133+
if global_code:
134+
global_assumes_str += "\n" + indent(global_code, " ")
135+
128136
v_str += dedent(f"""
129137
// test
130138
always @(posedge clock) begin

0 commit comments

Comments
 (0)