mirror of https://github.com/YosysHQ/picorv32.git
testbench_wb.v: unify verbose output with axi testbench
Unification of testbench output makes it possible to use the diff utility for comparing testbench instruction traces. Alas the testbench and testbench_wb traces are differ because of interrupts, e.g. picorv32$ make testbench_wb.vvp iverilog -o testbench_wb.vvp -DCOMPRESSED_ISA -DRISCV_FORMAL testbench_wb.v picorv32.v chmod -x testbench_wb.vvp picorv32$ make testbench.vvp iverilog -o testbench.vvp -DCOMPRESSED_ISA -DRISCV_FORMAL testbench.v picorv32.v chmod -x testbench.vvp picorv32$ vvp -N testbench_wb.vvp +verbose | head -n 856 > /tmp/testbench_wb.log picorv32$ vvp -N testbench.vvp +verbose | head -n 856 > /tmp/testbench.log picorv32$ diff -u /tmp/testbench.log /tmp/testbench_wb.log --- /tmp/testbench.log 2017-04-06 06:56:06.079804549 +0300 +++ /tmp/testbench_wb.log 2017-04-06 06:55:58.763485130 +0300 @@ -850,7 +850,7 @@ RD: ADDR=000056a0 DATA=00000013 INSN RD: ADDR=000056a4 DATA=fff00113 INSN RD: ADDR=000056a8 DATA=00000013 INSN -RD: ADDR=000056ac DATA=14208463 INSN <--- testbench: no interrupt -RD: ADDR=000056b0 DATA=00120213 INSN -RD: ADDR=000056b4 DATA=00200293 INSN -RD: ADDR=000056b8 DATA=fe5212e3 INSN +RD: ADDR=00000010 DATA=0200a10b INSN <--- testbench_wb: interrupt +RD: ADDR=00000014 DATA=0201218b INSN +RD: ADDR=00000018 DATA=000000b7 INSN +RD: ADDR=0000001c DATA=16008093 INSN Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
This commit is contained in:
parent
2c6cbcf72f
commit
7c852571f0
|
@ -2610,13 +2610,14 @@ module picorv32_wb #(
|
||||||
|
|
||||||
// Trace Interface
|
// Trace Interface
|
||||||
output trace_valid,
|
output trace_valid,
|
||||||
output [35:0] trace_data
|
output [35:0] trace_data,
|
||||||
|
|
||||||
|
output mem_instr
|
||||||
);
|
);
|
||||||
wire mem_valid;
|
wire mem_valid;
|
||||||
wire [31:0] mem_addr;
|
wire [31:0] mem_addr;
|
||||||
wire [31:0] mem_wdata;
|
wire [31:0] mem_wdata;
|
||||||
wire [ 3:0] mem_wstrb;
|
wire [ 3:0] mem_wstrb;
|
||||||
wire mem_instr;
|
|
||||||
reg mem_ready;
|
reg mem_ready;
|
||||||
reg [31:0] mem_rdata;
|
reg [31:0] mem_rdata;
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ module picorv32_wrapper #(
|
||||||
);
|
);
|
||||||
wire tests_passed;
|
wire tests_passed;
|
||||||
reg [31:0] irq;
|
reg [31:0] irq;
|
||||||
|
wire mem_instr;
|
||||||
|
|
||||||
always @* begin
|
always @* begin
|
||||||
irq = 0;
|
irq = 0;
|
||||||
|
@ -101,6 +102,7 @@ module picorv32_wrapper #(
|
||||||
.wb_sel_i(wb_m2s_sel),
|
.wb_sel_i(wb_m2s_sel),
|
||||||
.wb_we_i(wb_m2s_we),
|
.wb_we_i(wb_m2s_we),
|
||||||
|
|
||||||
|
.mem_instr(mem_instr),
|
||||||
.tests_passed(tests_passed)
|
.tests_passed(tests_passed)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -122,6 +124,7 @@ module picorv32_wrapper #(
|
||||||
.irq (irq),
|
.irq (irq),
|
||||||
.trace_valid (trace_valid),
|
.trace_valid (trace_valid),
|
||||||
.trace_data (trace_data),
|
.trace_data (trace_data),
|
||||||
|
.mem_instr(mem_instr),
|
||||||
|
|
||||||
.wb_clk_i(wb_clk),
|
.wb_clk_i(wb_clk),
|
||||||
.wb_rst_i(wb_rst),
|
.wb_rst_i(wb_rst),
|
||||||
|
@ -175,6 +178,7 @@ module wb_ram #(
|
||||||
output reg wb_ack_o,
|
output reg wb_ack_o,
|
||||||
output reg [31:0] wb_dat_o,
|
output reg [31:0] wb_dat_o,
|
||||||
|
|
||||||
|
input mem_instr,
|
||||||
output reg tests_passed
|
output reg tests_passed
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -209,14 +213,29 @@ module wb_ram #(
|
||||||
reg [31:0] mem [0:depth/4-1] /* verilator public */;
|
reg [31:0] mem [0:depth/4-1] /* verilator public */;
|
||||||
|
|
||||||
always @(posedge wb_clk_i) begin
|
always @(posedge wb_clk_i) begin
|
||||||
if (ram_we)
|
if (ram_we) begin
|
||||||
|
if (verbose)
|
||||||
|
$display("WR: ADDR=%08x DATA=%08x STRB=%04b",
|
||||||
|
adr_r, wb_dat_i, we);
|
||||||
|
|
||||||
if (adr_r[31:0] == 32'h1000_0000)
|
if (adr_r[31:0] == 32'h1000_0000)
|
||||||
|
if (verbose) begin
|
||||||
|
if (32 <= wb_dat_i[7:0] && wb_dat_i[7:0] < 128)
|
||||||
|
$display("OUT: '%c'", wb_dat_i[7:0]);
|
||||||
|
else
|
||||||
|
$display("OUT: %3d", wb_dat_i[7:0]);
|
||||||
|
end else begin
|
||||||
$write("%c", wb_dat_i[7:0]);
|
$write("%c", wb_dat_i[7:0]);
|
||||||
|
`ifndef VERILATOR
|
||||||
|
$fflush();
|
||||||
|
`endif
|
||||||
|
end
|
||||||
else
|
else
|
||||||
if (adr_r[31:0] == 32'h2000_0000)
|
if (adr_r[31:0] == 32'h2000_0000)
|
||||||
if (wb_dat_i[31:0] == 123456789)
|
if (wb_dat_i[31:0] == 123456789)
|
||||||
tests_passed = 1;
|
tests_passed = 1;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
always @(posedge wb_clk_i) begin
|
always @(posedge wb_clk_i) begin
|
||||||
if (waddr2 < 64 * 1024 / 4) begin
|
if (waddr2 < 64 * 1024 / 4) begin
|
||||||
|
@ -232,15 +251,11 @@ module wb_ram #(
|
||||||
if (we[3])
|
if (we[3])
|
||||||
mem[waddr2][31:24] <= wb_dat_i[31:24];
|
mem[waddr2][31:24] <= wb_dat_i[31:24];
|
||||||
|
|
||||||
if (ram_we)
|
|
||||||
if (verbose)
|
|
||||||
$display("WR: ADDR=%08x DATA=%08x STRB=%04b",
|
|
||||||
adr_r, wb_dat_i, we);
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if (valid & wb_ack_o & !ram_we)
|
if (valid & wb_ack_o & !ram_we)
|
||||||
if (verbose)
|
if (verbose)
|
||||||
$display("RD: ADDR=%08x DATA=%08x%s", adr_r, mem[raddr2], 0 ? " INSN" : "");
|
$display("RD: ADDR=%08x DATA=%08x%s", adr_r, mem[raddr2], mem_instr ? " INSN" : "");
|
||||||
|
|
||||||
wb_dat_o <= mem[raddr2];
|
wb_dat_o <= mem[raddr2];
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue