aboutsummaryrefslogtreecommitdiff
path: root/model/riscv_vext_regs.sail
diff options
context:
space:
mode:
Diffstat (limited to 'model/riscv_vext_regs.sail')
-rw-r--r--model/riscv_vext_regs.sail116
1 files changed, 54 insertions, 62 deletions
diff --git a/model/riscv_vext_regs.sail b/model/riscv_vext_regs.sail
index 377d92d..f823155 100644
--- a/model/riscv_vext_regs.sail
+++ b/model/riscv_vext_regs.sail
@@ -87,48 +87,43 @@ function dirty_v_context_if_present() -> unit = {
}
function rV (r : regno) -> vregtype = {
- let zero_vreg : vregtype = zeros();
- let v : vregtype =
- match r {
- 0 => vr0,
- 1 => vr1,
- 2 => vr2,
- 3 => vr3,
- 4 => vr4,
- 5 => vr5,
- 6 => vr6,
- 7 => vr7,
- 8 => vr8,
- 9 => vr9,
- 10 => vr10,
- 11 => vr11,
- 12 => vr12,
- 13 => vr13,
- 14 => vr14,
- 15 => vr15,
- 16 => vr16,
- 17 => vr17,
- 18 => vr18,
- 19 => vr19,
- 20 => vr20,
- 21 => vr21,
- 22 => vr22,
- 23 => vr23,
- 24 => vr24,
- 25 => vr25,
- 26 => vr26,
- 27 => vr27,
- 28 => vr28,
- 29 => vr29,
- 30 => vr30,
- 31 => vr31,
- _ => {assert(false, "invalid vector register number"); zero_vreg}
- };
- v
+ match r {
+ 0 => vr0,
+ 1 => vr1,
+ 2 => vr2,
+ 3 => vr3,
+ 4 => vr4,
+ 5 => vr5,
+ 6 => vr6,
+ 7 => vr7,
+ 8 => vr8,
+ 9 => vr9,
+ 10 => vr10,
+ 11 => vr11,
+ 12 => vr12,
+ 13 => vr13,
+ 14 => vr14,
+ 15 => vr15,
+ 16 => vr16,
+ 17 => vr17,
+ 18 => vr18,
+ 19 => vr19,
+ 20 => vr20,
+ 21 => vr21,
+ 22 => vr22,
+ 23 => vr23,
+ 24 => vr24,
+ 25 => vr25,
+ 26 => vr26,
+ 27 => vr27,
+ 28 => vr28,
+ 29 => vr29,
+ 30 => vr30,
+ 31 => vr31,
+ }
}
-function wV (r : regno, in_v : vregtype) -> unit = {
- let v = in_v;
+function wV (r : regno, v : vregtype) -> unit = {
match r {
0 => vr0 = v,
1 => vr1 = v,
@@ -162,7 +157,6 @@ function wV (r : regno, in_v : vregtype) -> unit = {
29 => vr29 = v,
30 => vr30 = v,
31 => vr31 = v,
- _ => assert(false, "invalid vector register number")
};
dirty_v_context();
@@ -245,10 +239,10 @@ function get_num_elem(LMUL_pow, SEW) = {
}
/* Reads a single vreg into multiple elements */
-val read_single_vreg : forall 'n 'm, 'n >= 0. (int('n), int('m), regidx) -> vector('n, dec, bits('m))
+val read_single_vreg : forall 'n 'm, 'n >= 0 & 'm >= 0. (int('n), int('m), regidx) -> vector('n, dec, bits('m))
function read_single_vreg(num_elem, SEW, vrid) = {
let bv : vregtype = V(vrid);
- var result : vector('n, dec, bits('m)) = undefined;
+ var result : vector('n, dec, bits('m)) = vector_init(zeros());
assert(8 <= SEW & SEW <= 64);
foreach (i from 0 to (num_elem - 1)) {
@@ -274,9 +268,9 @@ function write_single_vreg(num_elem, SEW, vrid, v) = {
}
/* The general vreg reading operation with num_elem as max(VLMAX,VLEN/SEW)) */
-val read_vreg : forall 'n 'm 'p, 'n >= 0. (int('n), int('m), int('p), regidx) -> vector('n, dec, bits('m))
+val read_vreg : forall 'n 'm 'p, 'n >= 0 & 'm >= 0. (int('n), int('m), int('p), regidx) -> vector('n, dec, bits('m))
function read_vreg(num_elem, SEW, LMUL_pow, vrid) = {
- var result : vector('n, dec, bits('m)) = undefined;
+ var result : vector('n, dec, bits('m)) = vector_init(zeros());
let VLEN = unsigned(vlenb) * 8;
let LMUL_pow_reg = if LMUL_pow < 0 then 0 else LMUL_pow;
@@ -326,7 +320,7 @@ function read_single_element(EEW, index, vrid) = {
}
/* The general vreg writing operation with num_elem as max(VLMAX,VLEN/SEW)) */
-val write_vreg : forall 'n 'm 'p, 'n >= 0. (int('n), int('m), int('p), regidx, vector('n, dec, bits('m))) -> unit
+val write_vreg : forall 'n 'm 'p, 'n >= 0 & 'm >= 0. (int('n), int('m), int('p), regidx, vector('n, dec, bits('m))) -> unit
function write_vreg(num_elem, SEW, LMUL_pow, vrid, vec) = {
let VLEN = unsigned(vlenb) * 8;
let LMUL_pow_reg = if LMUL_pow < 0 then 0 else LMUL_pow;
@@ -334,7 +328,7 @@ function write_vreg(num_elem, SEW, LMUL_pow, vrid, vec) = {
let 'num_elem_single : int = VLEN / SEW;
assert('num_elem_single >= 0);
foreach (i_lmul from 0 to (2 ^ LMUL_pow_reg - 1)) {
- var single_vec : vector('num_elem_single, dec, bits('m)) = undefined;
+ var single_vec : vector('num_elem_single, dec, bits('m)) = vector_init(zeros());
let vrid_lmul : regidx = vrid + to_bits(5, i_lmul);
let r_start_i : int = i_lmul * 'num_elem_single;
let r_end_i : int = r_start_i + 'num_elem_single - 1;
@@ -373,17 +367,16 @@ function write_single_element(EEW, index, vrid, value) = {
/* Mask register reading operation with num_elem as max(VLMAX,VLEN/SEW)) */
val read_vmask : forall 'n, 'n >= 0. (int('n), bits(1), regidx) -> vector('n, dec, bool)
function read_vmask(num_elem, vm, vrid) = {
- let VLEN = unsigned(vlenb) * 8;
assert(num_elem <= sizeof(vlenmax));
let vreg_val : vregtype = V(vrid);
- var result : vector('n, dec, bool) = undefined;
+ var result : vector('n, dec, bool) = vector_init(true);
+
+ if vm == 0b1 then {
+ return result
+ };
foreach (i from 0 to (num_elem - 1)) {
- if vm == 0b1 then {
- result[i] = true
- } else {
- result[i] = bit_to_bool(vreg_val[i])
- }
+ result[i] = bit_to_bool(vreg_val[i])
};
result
@@ -392,17 +385,16 @@ function read_vmask(num_elem, vm, vrid) = {
/* This is a special version of read_vmask for carry/borrow instructions, where vm=1 means no carry */
val read_vmask_carry : forall 'n, 'n >= 0. (int('n), bits(1), regidx) -> vector('n, dec, bool)
function read_vmask_carry(num_elem, vm, vrid) = {
- let VLEN = unsigned(vlenb) * 8;
- assert(0 < num_elem & num_elem <= sizeof(vlenmax));
+ assert(num_elem <= sizeof(vlenmax));
let vreg_val : vregtype = V(vrid);
- var result : vector('n, dec, bool) = undefined;
+ var result : vector('n, dec, bool) = vector_init(false);
+
+ if vm == 0b1 then {
+ return result
+ };
foreach (i from 0 to (num_elem - 1)) {
- if vm == 0b1 then {
- result[i] = false
- } else {
- result[i] = bit_to_bool(vreg_val[i])
- }
+ result[i] = bit_to_bool(vreg_val[i])
};
result