blob: 9ec27e18b0f1c6b6de0697f9e4594685385bf2cb [file] [log] [blame]
/****************************************************************************
* fwrisc_tb.sv
****************************************************************************/
`ifdef IVERILOG
`timescale 1ns/1ns
`endif
/**
* Module: fwrisc_rv32i_tb_hdl
*
* Unit-level testbench for the FWRISC core
*/
module fwrisc_rv32i_tb_hdl(input clock);
`ifdef HAVE_HDL_CLKGEN
reg clk_r = 0;
initial begin
forever begin
#10ns;
clk_r <= ~clk_r;
end
end
assign clock = clk_r;
`endif
`ifdef IVERILOG
// Icarus requires help with timeout
// and wave capture
reg[31:0] timeout;
initial begin
if ($test$plusargs("dumpvars")) begin
$dumpfile("simx.vcd");
$dumpvars(0, fwrisc_rv32i_tb_hdl);
end
if (!$value$plusargs("timeout=%d", timeout)) begin
timeout=1000;
end
$display("--> Wait for timeout");
# timeout;
$display("<-- Wait for timeout");
$finish();
end
`endif
reg reset = 1;
reg [7:0] reset_cnt = 0;
always @(posedge clock) begin
if (reset_cnt == 10) begin
reset <= 0;
end else begin
reset_cnt <= reset_cnt + 1;
end
end
wire [31:0] iaddr, idata;
wire ivalid, iready;
wire [31:0] daddr, dwdata, drdata;
wire [3:0] dwstb;
wire dwrite, dvalid, dready;
fwrisc_rv32i u_dut(
.clock (clock ),
.reset (reset ),
.iaddr (iaddr ),
.idata (idata ),
.ivalid (ivalid ),
.iready (iready ),
.daddr (daddr ),
.dwdata (dwdata ),
.drdata (drdata ),
.dwstb (dwstb ),
.dwrite (dwrite ),
.dvalid (dvalid ),
.dready (dready ));
assign dready = 1;
assign iready = 1;
generic_sram_byte_en_dualport #(
.DATA_WIDTH (32 ),
.ADDRESS_WIDTH (14 ), // 64k (4x16k)
.INIT_FILE ("ram.hex")
) u_sram (
.i_clk (clock ),
.i_write_data_a (32'b0 ),
.i_write_enable_a (1'b0 ),
.i_address_a (iaddr[31:2] ),
.i_byte_enable_a (4'hf ),
.o_read_data_a (idata ),
.i_write_data_b (dwdata ),
.i_write_enable_b ((dvalid && dwrite) ),
.i_address_b (daddr[31:2] ),
.i_byte_enable_b (dwstb ),
.o_read_data_b (drdata ));
// Connect the tracer BFM to
wire [31:0] tracer_pc = u_dut.u_core.u_tracer.pc;
wire [31:0] tracer_instr = u_dut.u_core.u_tracer.instr;
wire tracer_ivalid = u_dut.u_core.u_tracer.ivalid;
// ra, rb
wire [5:0] tracer_ra_raddr = u_dut.u_core.u_tracer.ra_raddr;
wire [31:0] tracer_ra_rdata = u_dut.u_core.u_tracer.ra_rdata;
wire [5:0] tracer_rb_raddr = u_dut.u_core.u_tracer.rb_raddr;
wire [31:0] tracer_rb_rdata = u_dut.u_core.u_tracer.rb_rdata;
// rd
wire [5:0] tracer_rd_waddr = u_dut.u_core.u_tracer.rd_waddr;
wire [31:0] tracer_rd_wdata = u_dut.u_core.u_tracer.rd_wdata;
wire tracer_rd_write = u_dut.u_core.u_tracer.rd_write;
wire [31:0] tracer_maddr = u_dut.u_core.u_tracer.maddr;
wire [31:0] tracer_mdata = u_dut.u_core.u_tracer.mdata;
wire [3:0] tracer_mstrb = u_dut.u_core.u_tracer.mstrb;
wire tracer_mwrite = u_dut.u_core.u_tracer.mwrite;
wire tracer_mvalid = u_dut.u_core.u_tracer.mvalid;
/*
*/
fwrisc_tracer_bfm u_tracer(
.clock(clock),
.reset(reset),
.pc(tracer_pc),
.instr(tracer_instr),
.ivalid(tracer_ivalid),
.ra_raddr(tracer_ra_raddr),
.ra_rdata(tracer_ra_rdata),
.rb_raddr(tracer_rb_raddr),
.rb_rdata(tracer_rb_rdata),
.rd_waddr(tracer_rd_waddr),
.rd_wdata(tracer_rd_wdata),
.rd_write(tracer_rd_write),
.maddr(tracer_maddr),
.mdata(tracer_mdata),
.mstrb(tracer_mstrb),
.mwrite(tracer_mwrite),
.mvalid(tracer_mvalid)
);
/*
bind fwrisc_tracer fwrisc_tracer_bfm u_tracer(
.clock(clock),
.reset(reset),
.pc(pc),
.instr(instr),
.ivalid(ivalid),
.ra_raddr(ra_raddr),
.ra_rdata(ra_rdata),
.rb_raddr(rb_raddr),
.rb_rdata(rb_rdata),
.rd_waddr(rd_waddr),
.rd_wdata(rd_wdata),
.rd_write(rd_write),
.maddr(maddr),
.mdata(mdata),
.mstrb(mstrb),
.mwrite(mwrite),
.mvalid(mvalid)
);
*/
endmodule