@@ -1007,13 +1007,13 @@ macro_rules! test_csr_field {
10071007 // test a single bit field
10081008 ( $reg: ident, $field: ident) => { {
10091009 $crate:: paste! {
1010- assert! ( ! $reg. $field( ) ) ;
1010+ let val = $reg. $field( ) ;
10111011
1012- $reg. [ <set_ $field>] ( true ) ;
1013- assert !( $reg. $field( ) ) ;
1012+ $reg. [ <set_ $field>] ( !val ) ;
1013+ assert_eq !( $reg. $field( ) , !val ) ;
10141014
1015- $reg. [ <set_ $field>] ( false ) ;
1016- assert! ( ! $reg. $field( ) ) ;
1015+ $reg. [ <set_ $field>] ( val ) ;
1016+ assert_eq! ( $reg. $field( ) , val ) ;
10171017 }
10181018 } } ;
10191019
@@ -1049,4 +1049,24 @@ macro_rules! test_csr_field {
10491049 assert_eq!( $reg. [ <try_ $field>] ( ) , Ok ( $var) ) ;
10501050 }
10511051 } } ;
1052+
1053+ // test a multi-bit bitfield
1054+ ( $reg: ident, $field: ident: [ $start: expr, $end: expr] , $reset: expr) => { {
1055+ let bits = $reg. bits( ) ;
1056+
1057+ let shift = $end - $start + 1 ;
1058+ let mask = ( 1usize << shift) - 1 ;
1059+
1060+ let exp_val = ( bits >> $start) & mask;
1061+
1062+ $crate:: paste! {
1063+ assert_eq!( $reg. $field( ) , exp_val) ;
1064+
1065+ $reg. [ <set_ $field>] ( $reset) ;
1066+ assert_eq!( $reg. $field( ) , $reset) ;
1067+
1068+ $reg. [ <set_ $field>] ( exp_val) ;
1069+ assert_eq!( $reg. $field( ) , exp_val) ;
1070+ }
1071+ } } ;
10521072}
0 commit comments