blob: a97845887839b50085cd670f77003f3e8497c8d1 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
module tb;
import uvm_pkg::*;
import rjtag_pkg::*;
localparam int NrHarts = 1;
localparam int ClkPeriod = 10; // 10ns
logic clk;
logic rst_n;
logic ndmrst;
logic dmactive;
logic [NrHarts-1:0] debug_req;
logic [NrHarts-1:0] unavailable;
xbar_if tlul_mem_if(clk);
xbar_if tlul_dm_if(clk);
// clk & reset
initial begin
clk = 1'b0;
forever begin
#(ClkPeriod/2) clk=~clk;
end
end
initial begin
rst_n = 1'b0;
repeat(3) @(negedge clk);
rst_n = 1'b1;
end
initial begin
#100us
$finish(1);
end
logic clk_jtag, rst_jtag_n;
jtag_if jtag();
initial begin
uvm_config_db#(virtual jtag_if)::set(null,"*","vif", jtag);
end
initial begin
run_test();
end
dm::dmi_req_t dmi_req;
dm::dmi_resp_t dmi_rsp;
// Device SRAM:
device_sram sram;
initial begin
sram = new(0);
sram.connect(tlul_dm_if.device);
sram.run();
end
rv_dm #(
.NrHarts (NrHarts),
.AxiIdWidth ( 8),
.AxiAddrWidth ( 32),
.AxiDataWidth ( 32),
.AxiUserWidth ( 16)
) u_dm_top (
.clk_i (clk), // in clock
// in asynchronous reset active low, connect PoR here, not the system reset
.rst_ni (rst_n),
.testmode_i (1'b0), // in
.ndmreset_o (ndmrst), // out non-debug module reset
.dmactive_o (dmactive), // out debug module is active
.debug_req_o (debug_req), // out [NrHarts-1:0] async debug request
// in [NrHarts-1:0] communicate whether the hart is unavailable (e.g.: power down)
.unavailable_i (unavailable),
// bus device, for an execution based technique
//.tl_d_i (tlul_mem_if.device.h2d),
//.tl_d_o (tlul_mem_if.host.h2d),
// bus host, for system bus accesses
.tl_h_o (tlul_dm_if.host.h2d),
.tl_h_i (tlul_dm_if.host.d2h),
// Connection to DTM - compatible to RocketChip Debug Module
.dmi_rst_ni (dmi_rst_n),
.dmi_req_valid_i (dmi_req_valid),
.dmi_req_ready_o (dmi_req_ready),
.dmi_req_i (dmi_req ),
.dmi_resp_valid_o (dmi_rsp_valid),
.dmi_resp_ready_i (dmi_rsp_ready),
.dmi_resp_o (dmi_rsp )
);
dmi_jtag dap (
.clk_i (clk),
.rst_ni (rst_n),
.testmode_i (1'b0),
.dmi_rst_no (dmi_rst_n),
.dmi_req_o (dmi_req),
.dmi_req_valid_o (dmi_req_valid),
.dmi_req_ready_i (dmi_req_ready),
.dmi_resp_i (dmi_rsp ),
.dmi_resp_ready_o (dmi_rsp_ready),
.dmi_resp_valid_i (dmi_rsp_valid),
//JTAG
.tck_i (jtag.dut.tck ),
.tms_i (jtag.dut.tms ),
.trst_ni (jtag.dut.trst_n),
.td_i (jtag.dut.tdi ),
.td_o (jtag.dut.tdo ),
.tdo_oe_o (jtag.dut.tdo_oe)
);
localparam time JtckPeriod = 27.3ns;
initial begin
jtag.tb.tck = 0;
forever begin
#(JtckPeriod/2) jtag.tb.tck = ~jtag.tb.tck;
end
end
initial begin
jtag.tb.trst_n = 1'b0;
#50ns;
jtag.tb.trst_n = 1'b1;
end
endmodule