blob: f74728cf86d6a4af99f53bdce8d3d3839ba5c8c5 [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 tlul_pkg::*;
import plic_pkg::*;
logic clk;
logic rst_n;
localparam ClkPeriod = 10ns;
localparam int N_SOURCE=32;
localparam int SRCW = $clog2(N_SOURCE+1);
localparam int N_TARGET=1;
tlul_if intc_reg_if(clk, rst_n);
plic_if #(.N_SOURCE(N_SOURCE)) irq_if(clk, rst_n);
initial begin
uvm_config_db#(virtual tlul_if)::set(null,"*","vif", intc_reg_if);
uvm_config_db#(virtual plic_if)::set(null,"*","pif", irq_if);
uvm_config_db#(logic [31:0])::set(null,"*","plic_base_address", 32'h0000_0000);
uvm_config_db#(int)::set(null,"*","num_source", N_SOURCE);
uvm_config_db#(int)::set(null,"*","num_target", N_TARGET);
uvm_config_db#(int)::set(null,"*","max_priority", 7);
end
initial begin
run_test();
end
logic [N_SOURCE-1:0] intr_src;
logic intr_irq [N_TARGET];
logic [SRCW-1:0] intr_id [N_TARGET];
assign irq_if.dut.irq = intr_irq[0];
assign irq_if.dut.irq_id = intr_id[0];
// 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
// Sim hard finish
initial begin
#100us
$finish(1);
end
rv_plic #(
.N_SOURCE(N_SOURCE),
.N_TARGET(N_TARGET)
) dut (
.clk_i (clk),
.rst_ni (rst_n),
.tl_i (intc_reg_if.device.h2d),
.tl_o (intc_reg_if.device.d2h),
.intr_src_i (intr_src),
.irq_o (intr_irq),
.irq_id_o (intr_id)
);
initial begin
intr_src = 0;
intr_src = $urandom();
#1us
@(posedge clk);
end
endmodule