@@ -49,10 +49,10 @@ function handle_illegal_vtype() = {
4949 /* Note: Implementations can set vill or trap if the vtype setting is not supported.
5050 * TODO: configuration support for both solutions
5151 */
52- let new_vtype = 0b1 @ zeros (sizeof (xlen ) - 1 ); /* set vtype.vill */
53-
54- ext_notification_write_CSR (csr_name_map ("vtype" ), new_vtype );
55- ext_notification_write_CSR (csr_name_map ("vl" ), zeros ())
52+ vtype . bits = 0b1 @ zeros (sizeof (xlen ) - 1 ); /* set vtype.vill */
53+ vl = zeros ();
54+ csr_write_callback (csr_name_map ("vtype" ), vtype . bits );
55+ csr_write_callback (csr_name_map ("vl" ), vl );
5656}
5757
5858val calculate_new_vl : (int , int ) -> xlenbits
@@ -77,8 +77,7 @@ function clause execute VSETVLI(ma, ta, sew, lmul, rs1, rd) = {
7777 let ratio_pow_ori = SEW_pow_ori - LMUL_pow_ori ;
7878
7979 /* set vtype */
80- let new_vtype = 0b0 @ zeros (sizeof (xlen ) - 9 ) @ ma @ ta @ sew @ lmul ;
81- ext_notification_write_CSR (csr_name_map ("vtype" ), new_vtype );
80+ vtype . bits = 0b0 @ zeros (sizeof (xlen ) - 9 ) @ ma @ ta @ sew @ lmul ;
8281
8382 /* check new SEW and LMUL are legal and calculate VLMAX */
8483 let VLEN_pow = get_vlen_pow ();
@@ -92,11 +91,11 @@ function clause execute VSETVLI(ma, ta, sew, lmul, rs1, rd) = {
9291 if (rs1 != 0b00000 ) then { /* normal stripmining */
9392 let rs1_val = X (rs1 );
9493 let AVL = unsigned (rs1_val );
95- ext_notification_write_CSR ( csr_name_map ( "vl" ) , calculate_new_vl (AVL , VLMAX ) );
94+ vl = calculate_new_vl (AVL , VLMAX );
9695 X (rd ) = vl ;
9796 } else if (rd != 0b00000 ) then { /* set vl to VLMAX */
9897 let AVL = unsigned (ones (sizeof (xlen )));
99- ext_notification_write_CSR ( csr_name_map ( "vl" ) , to_bits (sizeof (xlen ), VLMAX ) );
98+ vl = to_bits (sizeof (xlen ), VLMAX );
10099 X (rd ) = vl ;
101100 } else { /* keep existing vl */
102101 let AVL = unsigned (vl );
@@ -105,7 +104,11 @@ function clause execute VSETVLI(ma, ta, sew, lmul, rs1, rd) = {
105104 };
106105
107106 /* reset vstart to 0 */
108- ext_notification_write_CSR (csr_name_map ("vstart" ), zeros ());
107+ vstart = zeros ();
108+
109+ csr_write_callback (csr_name_map ("vtype" ), vtype . bits );
110+ csr_write_callback (csr_name_map ("vl" ), vl );
111+ csr_write_callback (csr_name_map ("vstart" ), zero_extend (vstart ));
109112
110113 RETIRE_SUCCESS
111114}
@@ -125,8 +128,7 @@ function clause execute VSETVL(rs2, rs1, rd) = {
125128 let ratio_pow_ori = SEW_pow_ori - LMUL_pow_ori ;
126129
127130 /* set vtype */
128- let new_vtype = X (rs2 );
129- ext_notification_write_CSR (csr_name_map ("vtype" ), new_vtype );
131+ vtype . bits = X (rs2 );
130132
131133 /* check new SEW and LMUL are legal and calculate VLMAX */
132134 let VLEN_pow = get_vlen_pow ();
@@ -140,11 +142,11 @@ function clause execute VSETVL(rs2, rs1, rd) = {
140142 if (rs1 != 0b00000 ) then { /* normal stripmining */
141143 let rs1_val = X (rs1 );
142144 let AVL = unsigned (rs1_val );
143- ext_notification_write_CSR ( csr_name_map ( "vl" ) , calculate_new_vl (AVL , VLMAX ) );
145+ vl = calculate_new_vl (AVL , VLMAX );
144146 X (rd ) = vl ;
145147 } else if (rd != 0b00000 ) then { /* set vl to VLMAX */
146148 let AVL = unsigned (ones (sizeof (xlen )));
147- ext_notification_write_CSR ( csr_name_map ( "vl" ) , to_bits (sizeof (xlen ), VLMAX ) );
149+ vl = to_bits (sizeof (xlen ), VLMAX );
148150 X (rd ) = vl ;
149151 } else { /* keep existing vl */
150152 let AVL = unsigned (vl );
@@ -153,7 +155,11 @@ function clause execute VSETVL(rs2, rs1, rd) = {
153155 };
154156
155157 /* reset vstart to 0 */
156- ext_notification_write_CSR (csr_name_map ("vstart" ), zeros ());
158+ vstart = zeros ();
159+
160+ csr_write_callback (csr_name_map ("vtype" ), vtype . bits );
161+ csr_write_callback (csr_name_map ("vl" ), vl );
162+ csr_write_callback (csr_name_map ("vstart" ), zero_extend (vstart ));
157163
158164 RETIRE_SUCCESS
159165}
@@ -169,8 +175,7 @@ mapping clause encdec = VSETIVLI(ma, ta, sew, lmul, uimm, rd) if extensionEnable
169175
170176function clause execute VSETIVLI (ma , ta , sew , lmul , uimm , rd ) = {
171177 /* set vtype */
172- let new_vtype = 0b0 @ zeros (sizeof (xlen ) - 9 ) @ ma @ ta @ sew @ lmul ;
173- ext_notification_write_CSR (csr_name_map ("vtype" ), new_vtype );
178+ vtype . bits = 0b0 @ zeros (sizeof (xlen ) - 9 ) @ ma @ ta @ sew @ lmul ;
174179
175180 /* check new SEW and LMUL are legal and calculate VLMAX */
176181 let VLEN_pow = get_vlen_pow ();
@@ -182,11 +187,15 @@ function clause execute VSETIVLI(ma, ta, sew, lmul, uimm, rd) = {
182187
183188 /* set vl according to VLMAX and AVL */
184189 let AVL = unsigned (uimm ); /* AVL is encoded as 5-bit zero-extended imm in the rs1 field */
185- ext_notification_write_CSR ( csr_name_map ( "vl" ) , calculate_new_vl (AVL , VLMAX ) );
190+ vl = calculate_new_vl (AVL , VLMAX );
186191 X (rd ) = vl ;
187192
188193 /* reset vstart to 0 */
189- ext_notification_write_CSR (csr_name_map ("vstart" ), zeros ());
194+ vstart = zeros ();
195+
196+ csr_write_callback (csr_name_map ("vtype" ), vtype . bits );
197+ csr_write_callback (csr_name_map ("vl" ), vl );
198+ csr_write_callback (csr_name_map ("vstart" ), zero_extend (vstart ));
190199
191200 RETIRE_SUCCESS
192201}
0 commit comments