blob: 18942f8cfb027f3c74453915898f860a0267f4e1 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
class plic_sequence #(int src=32) extends uvm_sequence#(tl_seq_item);
`uvm_object_utils(plic_sequence)
uvm_tlm_analysis_fifo #(irq_seq_item#(src)) m_irq_fifo;
function new(string name = "plic_sequence");
super.new(name);
m_irq_fifo = new("m_irq_fifo", null);
endfunction : new
virtual task body();
automatic logic [31:0] base_addr;
uvm_config_db#(logic [31:0])::get(null,"*","plic_base_address", base_addr);
plic_init(base_addr);
endtask : body
task plic_init(logic [31:0] base_addr);
// TODO: Configurable based on #Sources, #Targets, and interrupt type
automatic int n_src, n_tgt, max_prio;
automatic logic [31:0] rdata;
automatic int src_reg_size;
uvm_config_db#(int)::get(null,"*","num_source", n_src);
uvm_config_db#(int)::get(null,"*","num_target", n_tgt);
uvm_config_db#(int)::get(null,"*","max_priority", max_prio);
src_reg_size = (n_src%32)? n_src/32 + 1: n_src/32;
// Set Priority
for (int i = 0 ; i < n_src ; i++) begin
automatic logic [31:0] prio_addr;
prio_addr = base_addr + rv_plic_reg_pkg::RV_PLIC_PRIO0_OFFSET ;
tl_seq(prio_addr + (i<<2), 1'b1, $urandom_range(1, max_prio+1),rdata);
end
for (int i = 0 ; i < n_tgt ; i++) begin
// set Threshold
tl_seq(base_addr + rv_plic_reg_pkg::RV_PLIC_THRESHOLD0_OFFSET, 1'b1, 'h4, rdata);
end
// Int Source type
for (int i = 0 ; i < src_reg_size ; i++) begin
tl_seq(base_addr + ((src_reg_size + i)<<2), 1'b1, $urandom(), rdata);
end
// Int Enable
for (int i = 0 ; i < src_reg_size ; i++) begin
tl_seq(base_addr + rv_plic_reg_pkg::RV_PLIC_IE0_OFFSET + (i<<2), 1'b1, '1, rdata);
end
endtask : plic_init
task tl_seq(logic [31:0] address, logic write, logic [31:0] din, output logic [31:0] dout);
req = tl_seq_item::type_id::create("req");
rsp = tl_seq_item::type_id::create("rsp");
start_item(req);
req.addr = address;
req.wr = write;
req.wdata = din;
finish_item(req);
get_response(rsp);
dout = rsp.rdata;
endtask : tl_seq
endclass : plic_sequence