@@ -86,3 +86,64 @@ class ibex_rand_mseccfg_stream extends riscv_directed_instr_stream;
86
86
endfunction
87
87
88
88
endclass
89
+
90
+ // Define a short riscv-dv directed instruction stream to set a valid NA4 address/config
91
+ class ibex_valid_na4_stream extends riscv_directed_instr_stream ;
92
+
93
+ `uvm_object_utils (ibex_valid_na4_stream)
94
+
95
+ function new (string name = " " );
96
+ super .new (name);
97
+ endfunction
98
+
99
+ function void post_randomize ();
100
+ string instr_label, gn;
101
+ riscv_pseudo_instr la_instr;
102
+ riscv_instr addr_csrrw_instr;
103
+ riscv_instr srli_instr;
104
+ riscv_instr nop_instr;
105
+ riscv_instr cfg_csrrw_instr;
106
+
107
+ // Inserted stream will consist of five instructions
108
+ initialize_instr_list (5 );
109
+
110
+ cfg_csrrw_instr = riscv_instr :: get_instr (CSRRSI );
111
+ cfg_csrrw_instr.atomic = 1'b1 ;
112
+ cfg_csrrw_instr.has_label = 1'b0 ;
113
+ cfg_csrrw_instr.csr = PMPCFG0 ;
114
+ cfg_csrrw_instr.rd = '0 ;
115
+ cfg_csrrw_instr.imm_str = $sformatf (" %0d " , $urandom_range (16 ,23 ));
116
+
117
+ // Use a label to use it for setting pmpaddr CSR.
118
+ instr_label = $sformatf (" na4_addr_stream_%0x " , $urandom ());
119
+
120
+ nop_instr = riscv_instr :: get_instr (NOP );
121
+ nop_instr.label = instr_label;
122
+ nop_instr.has_label = 1'b1 ;
123
+ nop_instr.atomic = 1'b1 ;
124
+
125
+ // Load the address of the instruction after this whole stream
126
+ la_instr = riscv_pseudo_instr :: type_id :: create (" la_instr" );
127
+ la_instr.pseudo_instr_name = LA ;
128
+ la_instr.has_label = 1'b0 ;
129
+ la_instr.atomic = 1'b1 ;
130
+ la_instr.imm_str = $sformatf (" %0s +16" , instr_label);
131
+ la_instr.rd = cfg.gpr[1 ];
132
+
133
+ srli_instr = riscv_instr :: get_instr (SRLI );
134
+ srli_instr.has_label = 1'b0 ;
135
+ srli_instr.atomic = 1'b1 ;
136
+ srli_instr.rs1 = cfg.gpr[1 ];
137
+ srli_instr.rd = cfg.gpr[1 ];
138
+ srli_instr.imm_str = $sformatf (" 2" );
139
+
140
+ addr_csrrw_instr = riscv_instr :: get_instr (CSRRW );
141
+ addr_csrrw_instr.has_label = 1'b0 ;
142
+ addr_csrrw_instr.atomic = 1'b1 ;
143
+ addr_csrrw_instr.csr = PMPADDR0 ;
144
+ addr_csrrw_instr.rs1 = cfg.gpr[1 ];
145
+ addr_csrrw_instr.rd = '0 ;
146
+ instr_list = { cfg_csrrw_instr, nop_instr, la_instr, srli_instr, addr_csrrw_instr} ;
147
+ endfunction
148
+
149
+ endclass
0 commit comments