Skip to content

Commit 256a93d

Browse files
author
pascalgouedo
authored
Merge pull request #972 from YoannPruvost/dev_rvfi_trace_log
RVFI - Correcting issue on trace log generation from rvfi
2 parents c807945 + 8f98368 commit 256a93d

File tree

6 files changed

+142
-46
lines changed

6 files changed

+142
-46
lines changed

bhv/cv32e40p_instr_trace.svh

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ typedef struct {
4949

5050
class instr_trace_t;
5151
time simtime;
52+
time stoptime;
53+
bit external_time;
5254
int cycles;
55+
int stopcycles;
5356
logic [31:0] pc;
5457
logic [31:0] instr;
5558
bit compressed;
@@ -70,10 +73,15 @@ class instr_trace_t;
7073
regs_read = {};
7174
regs_write = {};
7275
mem_access = {};
76+
external_time = 0;
77+
stoptime = 0;
78+
stopcycles = 0;
7379
endfunction
7480

7581
function void init(int unsigned cycles, bit [31:0] pc, bit compressed, bit [31:0] instr);
76-
this.simtime = $time;
82+
if(!this.external_time) begin
83+
this.simtime = $time;
84+
end
7785
this.cycles = cycles;
7886
this.pc = pc;
7987
this.compressed = compressed;
@@ -322,7 +330,23 @@ class instr_trace_t;
322330
begin
323331
string insn_str; // Accumulate writes into a single string to enable single $fwrite
324332

325-
insn_str = $sformatf("%t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
333+
if(simtime < 100ns) begin
334+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
335+
end else if (simtime < 1us) begin
336+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
337+
end else if (simtime < 10us) begin
338+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
339+
end else if (simtime < 100us) begin
340+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
341+
end else if (simtime < 1ms) begin
342+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
343+
end else if (simtime < 10ms) begin
344+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
345+
end else if (simtime < 100ms) begin
346+
insn_str = $sformatf(" %t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
347+
end else begin
348+
insn_str = $sformatf("%t %15d %h %h %-36s", simtime, cycles, pc, instr, str);
349+
end
326350

327351
foreach (regs_write[i]) begin
328352
if (regs_write[i].addr != 0)
@@ -344,6 +368,12 @@ class instr_trace_t;
344368
insn_str = $sformatf("%s PA:%08x", insn_str, mem_acc.addr);
345369
end
346370

371+
casex (instr)
372+
INSTR_FDIV: insn_str = $sformatf("%s %15d %t", insn_str, stopcycles, stoptime);
373+
INSTR_FSQRT:insn_str = $sformatf("%s %15d %t", insn_str, stopcycles, stoptime);
374+
default: ;
375+
endcase
376+
347377
$fwrite(f, "%s\n", insn_str);
348378
end
349379
endfunction

bhv/cv32e40p_rvfi.sv

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ module cv32e40p_rvfi
332332
// the convention of RISC-V Formal Interface Specification.
333333
output logic [ 0:0] rvfi_valid,
334334
output logic [63:0] rvfi_order,
335+
output integer rvfi_start_cycle,
336+
output time rvfi_start_time,
337+
output integer rvfi_stop_cycle,
338+
output time rvfi_stop_time,
335339
output logic [31:0] rvfi_insn,
336340
output rvfi_trap_t rvfi_trap,
337341
output logic [ 0:0] rvfi_halt,
@@ -351,6 +355,7 @@ module cv32e40p_rvfi
351355
output logic rvfi_frd_wvalid [1:0],
352356
output logic [ 4:0] rvfi_frd_addr [1:0],
353357
output logic [31:0] rvfi_frd_wdata [1:0],
358+
output logic rvfi_2_rd,
354359
output logic [ 4:0] rvfi_rs1_addr,
355360
output logic [ 4:0] rvfi_rs2_addr,
356361
output logic [ 4:0] rvfi_rs3_addr,
@@ -371,8 +376,8 @@ module cv32e40p_rvfi
371376
output logic [31:0] rvfi_pc_wdata,
372377

373378
output logic [31:0] rvfi_mem_addr,
374-
output logic [ 3:0] rvfi_mem_rmask,
375-
output logic [ 3:0] rvfi_mem_wmask,
379+
output logic [31:0] rvfi_mem_rmask,
380+
output logic [31:0] rvfi_mem_wmask,
376381
output logic [31:0] rvfi_mem_rdata,
377382
output logic [31:0] rvfi_mem_wdata,
378383

@@ -623,6 +628,13 @@ module cv32e40p_rvfi
623628
bit clk_i_d;
624629
assign #0.01 clk_i_d = clk_i;
625630

631+
integer cycles;
632+
// cycle counter
633+
always_ff @(posedge clk_i_d, negedge rst_ni) begin
634+
if (rst_ni == 1'b0) cycles <= 0;
635+
else cycles <= cycles + 1;
636+
end
637+
626638
logic pc_mux_debug;
627639
logic pc_mux_dret;
628640
logic pc_mux_exception;
@@ -753,6 +765,10 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
753765
end
754766

755767
rvfi_order = new_rvfi_trace.m_order;
768+
rvfi_start_cycle = new_rvfi_trace.m_start_cycle;
769+
rvfi_start_time = new_rvfi_trace.m_start_time;
770+
rvfi_stop_cycle = new_rvfi_trace.m_stop_cycle;
771+
rvfi_stop_time = new_rvfi_trace.m_stop_time;
756772
rvfi_pc_rdata = new_rvfi_trace.m_pc_rdata;
757773
rvfi_insn = new_rvfi_trace.m_insn;
758774

@@ -807,6 +823,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
807823
rvfi_frd_addr[1] = '0;
808824
rvfi_frd_wdata[1] = '0;
809825

826+
rvfi_2_rd = new_rvfi_trace.m_2_rd_insn;
810827
if (new_rvfi_trace.m_rd_addr[0][5] == 1'b0) begin
811828
rvfi_rd_addr[0] = new_rvfi_trace.m_rd_addr[0][4:0];
812829
rvfi_rd_wdata[0] = new_rvfi_trace.m_rd_wdata[0];
@@ -1368,6 +1385,9 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
13681385
end
13691386
end
13701387
csr_to_apu_resp();
1388+
1389+
trace_apu_resp.m_stop_cycle = cycles;
1390+
trace_apu_resp.m_stop_time = $time;
13711391
send_rvfi(trace_apu_resp);
13721392
->e_send_rvfi_trace_apu_resp;
13731393
end
@@ -1402,10 +1422,10 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
14021422

14031423
function logic [31:0] be_to_mask(logic [3:0] be);
14041424
logic [31:0] mask;
1405-
mask[7:0] = be[0] ? 8'hFF : 8'h00;
1406-
mask[15:8] = be[0] ? 8'hFF : 8'h00;
1407-
mask[23:16] = be[0] ? 8'hFF : 8'h00;
1408-
mask[31:24] = be[0] ? 8'hFF : 8'h00;
1425+
mask[7:0] = (be[0] == 1'b1) ? 8'hFF : 8'h00;
1426+
mask[15:8] = (be[1] == 1'b1) ? 8'hFF : 8'h00;
1427+
mask[23:16] = (be[2] == 1'b1) ? 8'hFF : 8'h00;
1428+
mask[31:24] = (be[3] == 1'b1) ? 8'hFF : 8'h00;
14091429

14101430
be_to_mask = mask;
14111431
return mask;

bhv/cv32e40p_rvfi_trace.sv

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
169185
instr_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\tCycle\tPC\tInstr\tDecoded instruction\tRegister 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

bhv/cv32e40p_tb_wrapper.sv

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,17 @@ module cv32e40p_tb_wrapper
459459

460460
.rvfi_valid(rvfi_valid),
461461
.rvfi_insn(rvfi_insn),
462+
.rvfi_start_cycle(rvfi_start_cycle),
463+
.rvfi_start_time(rvfi_start_time),
464+
.rvfi_stop_cycle(rvfi_stop_cycle),
465+
.rvfi_stop_time(rvfi_stop_time),
462466
.rvfi_pc_rdata(rvfi_pc_rdata),
463467
.rvfi_rd_addr(rvfi_rd_addr),
464468
.rvfi_rd_wdata(rvfi_rd_wdata),
465469
.rvfi_frd_wvalid(rvfi_frd_wvalid),
466470
.rvfi_frd_addr(rvfi_frd_addr),
467471
.rvfi_frd_wdata(rvfi_frd_wdata),
472+
.rvfi_2_rd(rvfi_2_rd),
468473
.rvfi_rs1_addr(rvfi_rs1_addr),
469474
.rvfi_rs2_addr(rvfi_rs2_addr),
470475
.rvfi_rs3_addr(rvfi_rs3_addr),

bhv/cv32e40p_tracer.sv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ module cv32e40p_tracer
185185
$sformat(info_tag, "CORE_TRACER %2d", hart_id_i);
186186
$display("[%s] Output filename is: %s", info_tag, fn);
187187
f = $fopen(fn, "w");
188-
$fwrite(f, "Time\tCycle\tPC\tInstr\tDecoded instruction\tRegister and memory contents\n");
188+
$fwrite(f,
189+
" Time Cycle PC Instr Decoded instruction Register and memory contents\n");
189190
end
190191

191192
//initial begin

0 commit comments

Comments
 (0)