@@ -36,16 +36,21 @@ module cv32e40p_rvfi_trace
3636
3737 input logic [31 : 0 ] imm_s3_type,
3838
39- input logic rvfi_valid,
40- input logic [31 : 0 ] rvfi_insn,
41- input logic [31 : 0 ] rvfi_pc_rdata,
39+ input logic rvfi_valid,
40+ input logic [31 : 0 ] rvfi_insn,
41+ input integer rvfi_start_cycle,
42+ input time rvfi_start_time,
43+ input integer rvfi_stop_cycle,
44+ input time rvfi_stop_time,
45+ input logic [31 : 0 ] rvfi_pc_rdata,
4246
4347 input logic [ 4 : 0 ] rvfi_rd_addr [1 : 0 ],
4448 input logic [31 : 0 ] rvfi_rd_wdata[1 : 0 ],
4549
4650 input logic rvfi_frd_wvalid[1 : 0 ],
4751 input logic [ 4 : 0 ] rvfi_frd_addr [1 : 0 ],
4852 input logic [31 : 0 ] rvfi_frd_wdata [1 : 0 ],
53+ input logic rvfi_2_rd,
4954
5055 input logic [ 4 : 0 ] rvfi_rs1_addr,
5156 input logic [ 4 : 0 ] rvfi_rs2_addr,
@@ -65,8 +70,8 @@ module cv32e40p_rvfi_trace
6570 input logic [31 : 0 ] rvfi_frs3_rdata,
6671
6772 input logic [31 : 0 ] rvfi_mem_addr,
68- input logic [ 3 : 0 ] rvfi_mem_rmask,
69- input logic [ 3 : 0 ] rvfi_mem_wmask,
73+ input logic [31 : 0 ] rvfi_mem_rmask,
74+ input logic [31 : 0 ] rvfi_mem_wmask,
7075 input logic [31 : 0 ] rvfi_mem_rdata,
7176 input logic [31 : 0 ] rvfi_mem_wdata
7277);
@@ -78,7 +83,7 @@ module cv32e40p_rvfi_trace
7883
7984 integer f; // file pointer
8085 string fn;
81- integer cycles;
86+ // integer cycles;
8287 string info_tag;
8388
8489 logic is_compressed;
@@ -129,7 +134,13 @@ module cv32e40p_rvfi_trace
129134 rs3_value = rvfi_rs3_rdata;
130135 end
131136
132- if (rvfi_frd_wvalid[0 ]) begin
137+ if (rvfi_2_rd) begin
138+ if (rvfi_frd_wvalid[1 ]) begin
139+ rd = { 1'b1 , rvfi_frd_addr[1 ]} ;
140+ end else begin
141+ rd = { 1'b0 , rvfi_rd_addr[1 ]} ;
142+ end
143+ end else if (rvfi_frd_wvalid[0 ]) begin
133144 rd = { 1'b1 , rvfi_frd_addr[0 ]} ;
134145 end else begin
135146 rd = { 1'b0 , rvfi_rd_addr[0 ]} ;
@@ -138,57 +149,68 @@ module cv32e40p_rvfi_trace
138149
139150 assign rs4 = rs3;
140151
141- assign imm_i_type = {{ 20 { rvfi_insn[31 ]}} , rvfi_insn[31 : 20 ]} ;
142- assign imm_iz_type = { 20'b0 , rvfi_insn[31 : 20 ]} ;
143- assign imm_s_type = {{ 20 { rvfi_insn[31 ]}} , rvfi_insn[31 : 25 ], rvfi_insn[11 : 7 ]} ;
152+ cv32e40p_compressed_decoder # (
153+ .FPU (FPU )
154+ ) rvfi_trace_decompress_i (
155+ .instr_i (rvfi_insn),
156+ .instr_o (decomp_insn),
157+ .is_compressed_o (is_compressed)
158+ );
159+
160+ assign imm_i_type = {{ 20 { decomp_insn[31 ]}} , decomp_insn[31 : 20 ]} ;
161+ assign imm_iz_type = { 20'b0 , decomp_insn[31 : 20 ]} ;
162+ assign imm_s_type = {{ 20 { decomp_insn[31 ]}} , decomp_insn[31 : 25 ], decomp_insn[11 : 7 ]} ;
144163 assign imm_sb_type = {
145- { 19 { rvfi_insn[31 ]}} , rvfi_insn[31 ], rvfi_insn[7 ], rvfi_insn[30 : 25 ], rvfi_insn[11 : 8 ], 1'b0
164+ { 19 { decomp_insn[31 ]}} ,
165+ decomp_insn[31 ],
166+ decomp_insn[7 ],
167+ decomp_insn[30 : 25 ],
168+ decomp_insn[11 : 8 ],
169+ 1'b0
146170 } ;
147- assign imm_u_type = { rvfi_insn [31 : 12 ], 12'b0 } ;
171+ assign imm_u_type = { decomp_insn [31 : 12 ], 12'b0 } ;
148172 assign imm_uj_type = {
149- { 12 { rvfi_insn [31 ]}} , rvfi_insn [19 : 12 ], rvfi_insn [20 ], rvfi_insn [30 : 21 ], 1'b0
173+ { 12 { decomp_insn [31 ]}} , decomp_insn [19 : 12 ], decomp_insn [20 ], decomp_insn [30 : 21 ], 1'b0
150174 } ;
151175
152- assign imm_z_type = '0 ; // {27'b0, rvfi_insn [REG_S1_MSB:REG_S1_LSB]};
176+ assign imm_z_type = '0 ; // {27'b0, decomp_insn [REG_S1_MSB:REG_S1_LSB]};
153177
154- assign imm_s2_type = { 27'b0 , rvfi_insn [24 : 20 ]} ;
178+ assign imm_s2_type = { 27'b0 , decomp_insn [24 : 20 ]} ;
155179 assign imm_vs_type = '0 ;
156180 assign imm_vu_type = '0 ;
157181 assign imm_shuffle_type = '0 ;
158182 assign imm_clip_type = '0 ;
159183
160- cv32e40p_compressed_decoder # (
161- .FPU (FPU )
162- ) rvfi_trace_decompress_i (
163- .instr_i (rvfi_insn),
164- .instr_o (decomp_insn),
165- .is_compressed_o (is_compressed)
166- );
167-
168184 `include " cv32e40p_instr_trace.svh"
169185instr_trace_t trace_retire;
170186
171187 function instr_trace_t trace_new_instr ();
172188 instr_trace_t trace;
173189 trace = new ();
174- trace.init (.cycles (cycles), .pc (rvfi_pc_rdata), .compressed (is_compressed),
190+ trace.external_time = 1 ;
191+ trace.simtime = rvfi_start_time - 1ns ;
192+ trace.stoptime = rvfi_stop_time;
193+ trace.stopcycles = rvfi_stop_cycle;
194+ trace.init (.cycles (rvfi_start_cycle), .pc (rvfi_pc_rdata), .compressed (is_compressed),
175195 .instr (decomp_insn));
176196 return trace;
177197 endfunction : trace_new_instr
178198
179199 function void apply_reg_write ();
180200 foreach (trace_retire.regs_write[i]) begin
181- if (rvfi_frd_wvalid[0 ] && (trace_retire.regs_write[i].addr == { 1'b1 , rvfi_frd_addr[0 ]} )) begin
182- trace_retire.regs_write[i].value = rvfi_frd_wdata[0 ];
183- end else if (trace_retire.regs_write[i].addr == rvfi_rd_addr[0 ]) begin
184- trace_retire.regs_write[i].value = rvfi_rd_wdata[0 ];
185- end
186201 if (rvfi_frd_wvalid[1 ] && (trace_retire.regs_write[i].addr == { 1'b1 , rvfi_frd_addr[1 ]} )) begin
187202 trace_retire.regs_write[i].value = rvfi_frd_wdata[1 ];
188203 end else if (trace_retire.regs_write[i].addr == rvfi_rd_addr[1 ]) begin
189204 trace_retire.regs_write[i].value = rvfi_rd_wdata[1 ];
190205 end
191206 end
207+ foreach (trace_retire.regs_write[i]) begin
208+ if (rvfi_frd_wvalid[0 ] && (trace_retire.regs_write[i].addr == { 1'b1 , rvfi_frd_addr[0 ]} )) begin
209+ trace_retire.regs_write[i].value = rvfi_frd_wdata[0 ];
210+ end else if (trace_retire.regs_write[i].addr == rvfi_rd_addr[0 ]) begin
211+ trace_retire.regs_write[i].value = rvfi_rd_wdata[0 ];
212+ end
213+ end
192214 endfunction : apply_reg_write
193215
194216 function void apply_mem_access ();
@@ -206,18 +228,19 @@ instr_trace_t trace_retire;
206228 end
207229 endfunction : apply_mem_access
208230
209- // cycle counter
210- always_ff @ (posedge clk_i, negedge rst_ni) begin
211- if (rst_ni == 1'b0 ) cycles <= 0 ;
212- else cycles <= cycles + 1 ;
213- end
231+ string insn_disas;
232+ logic [31 : 0 ] insn_pc;
233+ logic [31 : 0 ] insn_val;
214234
215235 always @ (posedge clk_i) begin
216236 if (rvfi_valid) begin
217237 trace_retire = trace_new_instr ();
218238 apply_reg_write ();
219239 apply_mem_access ();
220240 trace_retire.printInstrTrace ();
241+ insn_disas = trace_retire.str;
242+ insn_pc = trace_retire.pc;
243+ insn_val = trace_retire.instr;
221244 end
222245 end
223246
@@ -227,7 +250,8 @@ instr_trace_t trace_retire;
227250 $sformat (info_tag, " CORE_TRACER %2d " , hart_id_i);
228251 $display (" [%s ] Output filename is: %s " , info_tag, fn);
229252 f = $fopen (fn, " w" );
230- $fwrite (f, " Time\t Cycle\t PC\t Instr\t Decoded instruction\t Register and memory contents\n " );
253+ $fwrite (f,
254+ " Time Cycle PC Instr Decoded instruction Register and memory contents Stop cycle Stop time\n " );
231255 end
232256
233257
0 commit comments