[edn/dv] multiple endpoints
Signed-off-by: Steve Nelson <steve.nelson@wdc.com>
diff --git a/hw/ip/csrng/rtl/csrng_pkg.sv b/hw/ip/csrng/rtl/csrng_pkg.sv
index 24f0894..9c29ee9 100755
--- a/hw/ip/csrng/rtl/csrng_pkg.sv
+++ b/hw/ip/csrng/rtl/csrng_pkg.sv
@@ -10,6 +10,8 @@
// Application Interfaces
//-------------------------
+ parameter int unsigned GENBITS_BUS_WIDTH = 128;
+
// instantiation interface
typedef struct packed {
logic csrng_req_valid;
@@ -31,7 +33,7 @@
logic csrng_rsp_sts;
logic genbits_valid;
logic genbits_fips;
- logic [127:0] genbits_bus;
+ logic [GENBITS_BUS_WIDTH-1:0] genbits_bus;
} csrng_rsp_t;
// default value of csrng_rsp_t (for dangling ports)
diff --git a/hw/ip/edn/dv/env/edn_env.sv b/hw/ip/edn/dv/env/edn_env.sv
index 7d1d339..b4d2231 100644
--- a/hw/ip/edn/dv/env/edn_env.sv
+++ b/hw/ip/edn/dv/env/edn_env.sv
@@ -10,44 +10,43 @@
);
`uvm_component_utils(edn_env)
- push_pull_agent#(.DataWidth(GENBITS_BUS_WIDTH)) m_csrng_agent;
- push_pull_agent#(.DataWidth(ENDPOINT_BUS_WIDTH)) m_endpoint_agent [NUM_ENDPOINTS-1:0];
+ push_pull_agent#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH)) m_csrng_agent;
+ push_pull_agent#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)) m_endpoint_agent [NUM_ENDPOINTS-1:0];
`uvm_component_new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
// create components
- m_csrng_agent = push_pull_agent#(.DataWidth(GENBITS_BUS_WIDTH))::type_id::create("m_csrng_agent", this);
- uvm_config_db#(push_pull_agent_cfg#(.DataWidth(GENBITS_BUS_WIDTH)))::set(this, "m_csrng_agent*", "cfg", cfg.m_csrng_agent_cfg);
+ m_csrng_agent = push_pull_agent#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH))::type_id::create
+ ("m_csrng_agent", this);
+ uvm_config_db#(push_pull_agent_cfg#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH)))::set
+ (this, "m_csrng_agent*", "cfg", cfg.m_csrng_agent_cfg);
cfg.m_csrng_agent_cfg.agent_type = push_pull_agent_pkg::PushAgent;
cfg.m_csrng_agent_cfg.if_mode = dv_utils_pkg::Host;
- //TODO: For Loop?
- m_endpoint_agent[NUM_ENDPOINTS-1] = push_pull_agent#(.DataWidth(ENDPOINT_BUS_WIDTH))::type_id::create("m_endpoint_agent[NUM_ENDPOINTS-1]", this);
- uvm_config_db#(push_pull_agent_cfg#(.DataWidth(ENDPOINT_BUS_WIDTH)))::set(this, "m_endpoint_agent*", "cfg", cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1]);
- cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1].agent_type = push_pull_agent_pkg::PullAgent;
- cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1].if_mode = dv_utils_pkg::Host;
-
- m_endpoint_agent[0] = push_pull_agent#(.DataWidth(ENDPOINT_BUS_WIDTH))::type_id::create("m_endpoint_agent[0]", this);
- uvm_config_db#(push_pull_agent_cfg#(.DataWidth(ENDPOINT_BUS_WIDTH)))::set(this, "m_endpoint_agent*", "cfg", cfg.m_endpoint_agent_cfg[0]);
- cfg.m_endpoint_agent_cfg[0].agent_type = push_pull_agent_pkg::PullAgent;
- cfg.m_endpoint_agent_cfg[0].if_mode = dv_utils_pkg::Host;
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ string endpoint_agent_name = $sformatf("m_endpoint_agent[%0d]", i);
+ m_endpoint_agent[i] = push_pull_agent#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH))::type_id::
+ create(endpoint_agent_name, this);
+ uvm_config_db#(push_pull_agent_cfg#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)))::set
+ (this, $sformatf("%0s*", endpoint_agent_name), "cfg", cfg.m_endpoint_agent_cfg[i]);
+ cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1].agent_type = push_pull_agent_pkg::PullAgent;
+ cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1].if_mode = dv_utils_pkg::Host;
+ end
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
- //TODO: For Loop?
if (cfg.en_scb) begin
- m_endpoint_agent[NUM_ENDPOINTS-1].monitor.analysis_port.connect(scoreboard.endpoint_fifo[NUM_ENDPOINTS-1].analysis_export);
- m_endpoint_agent[0].monitor.analysis_port.connect(scoreboard.endpoint_fifo[0].analysis_export);
- end
- if (cfg.is_active) begin
- if (cfg.m_endpoint_agent_cfg[NUM_ENDPOINTS-1].is_active) begin
- virtual_sequencer.endpoint_sequencer_h[NUM_ENDPOINTS-1] = m_endpoint_agent[NUM_ENDPOINTS-1].sequencer;
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ m_endpoint_agent[i].monitor.analysis_port.connect
+ (scoreboard.endpoint_fifo[i].analysis_export);
end
- if (cfg.m_endpoint_agent_cfg[0].is_active) begin
- virtual_sequencer.endpoint_sequencer_h[0] = m_endpoint_agent[0].sequencer;
+ end
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ if (cfg.m_endpoint_agent_cfg[i].is_active) begin
+ virtual_sequencer.endpoint_sequencer_h[i] = m_endpoint_agent[i].sequencer;
end
end
endfunction
diff --git a/hw/ip/edn/dv/env/edn_env_cfg.sv b/hw/ip/edn/dv/env/edn_env_cfg.sv
index 9bef21c..1ff714f 100644
--- a/hw/ip/edn/dv/env/edn_env_cfg.sv
+++ b/hw/ip/edn/dv/env/edn_env_cfg.sv
@@ -5,13 +5,15 @@
class edn_env_cfg extends cip_base_env_cfg #(.RAL_T(edn_reg_block));
// ext component cfgs
- rand push_pull_agent_cfg#(.DataWidth(GENBITS_BUS_WIDTH)) m_csrng_agent_cfg;
- rand push_pull_agent_cfg#(.DataWidth(ENDPOINT_BUS_WIDTH)) m_endpoint_agent_cfg [NUM_ENDPOINTS:0];
+ rand push_pull_agent_cfg#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH)) m_csrng_agent_cfg;
+ rand push_pull_agent_cfg#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH))
+ m_endpoint_agent_cfg [NUM_ENDPOINTS:0];
`uvm_object_utils_begin(edn_env_cfg)
`uvm_field_object(m_csrng_agent_cfg, UVM_DEFAULT)
- // TODO: multiple endpoints, for loop?
- `uvm_field_object(m_endpoint_agent_cfg[NUM_ENDPOINTS-1], UVM_DEFAULT)
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ `uvm_field_object(m_endpoint_agent_cfg[i], UVM_DEFAULT)
+ end
`uvm_object_utils_end
`uvm_object_new
@@ -19,9 +21,13 @@
virtual function void initialize(bit [31:0] csr_base_addr = '1);
super.initialize(csr_base_addr);
// create config objects
- m_csrng_agent_cfg = push_pull_agent_cfg#(.DataWidth(GENBITS_BUS_WIDTH))::type_id::create("m_csrng_agent_cfg");
- // TODO: multiple endpoints, for loop?
- m_endpoint_agent_cfg[NUM_ENDPOINTS-1] = push_pull_agent_cfg#(.DataWidth(ENDPOINT_BUS_WIDTH))::type_id::create($sformatf("m_endpoint_agent_cfg[$0d]", NUM_ENDPOINTS-1));
+ m_csrng_agent_cfg = push_pull_agent_cfg#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH))::type_id::
+ create("m_csrng_agent_cfg");
+
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ m_endpoint_agent_cfg[i] = push_pull_agent_cfg#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH))::
+ type_id::create($sformatf("m_endpoint_agent_cfg[$0d]", i));
+ end
// set num_interrupts & num_alerts
begin
diff --git a/hw/ip/edn/dv/env/edn_env_pkg.sv b/hw/ip/edn/dv/env/edn_env_pkg.sv
index cc9fd73..1871331 100644
--- a/hw/ip/edn/dv/env/edn_env_pkg.sv
+++ b/hw/ip/edn/dv/env/edn_env_pkg.sv
@@ -19,10 +19,7 @@
`include "dv_macros.svh"
// parameters
- // TODO: add multiple endpoints
- parameter uint NUM_ENDPOINTS = 1;
- parameter uint ENDPOINT_BUS_WIDTH = 32;
- parameter uint GENBITS_BUS_WIDTH = 128;
+ parameter uint NUM_ENDPOINTS = 1;
// types
typedef enum int {
diff --git a/hw/ip/edn/dv/env/edn_scoreboard.sv b/hw/ip/edn/dv/env/edn_scoreboard.sv
index 512cadc..8787756 100644
--- a/hw/ip/edn/dv/env/edn_scoreboard.sv
+++ b/hw/ip/edn/dv/env/edn_scoreboard.sv
@@ -12,18 +12,18 @@
// local variables
// TLM agent fifos
- uvm_tlm_analysis_fifo #(push_pull_item#(.DataWidth(ENDPOINT_BUS_WIDTH))) endpoint_fifo[NUM_ENDPOINTS-1:0];
+ uvm_tlm_analysis_fifo #(push_pull_item#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH))) endpoint_fifo[NUM_ENDPOINTS-1:0];
// local queues to hold incoming packets pending comparison
- push_pull_item#(.DataWidth(ENDPOINT_BUS_WIDTH)) endpoint_q[$][NUM_ENDPOINTS-1:0];
+ push_pull_item#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)) endpoint_q[$][NUM_ENDPOINTS-1:0];
`uvm_component_new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
- // TODO: for loop
- endpoint_fifo[NUM_ENDPOINTS-1] = new("endpoint_fifo[NUM_ENDPOINTS-1]", this);
- endpoint_fifo[0] = new("endpoint_fifo[0]", this);
+ for (int i = 0; i < NUM_ENDPOINTS; i++) begin
+ endpoint_fifo[i] = new($sformatf("endpoint_fifo[%0d]", i), this);
+ end
endfunction
function void connect_phase(uvm_phase phase);
@@ -33,21 +33,9 @@
task run_phase(uvm_phase phase);
super.run_phase(phase);
fork
- process_push_pull_fifo();
join_none
endtask
- virtual task process_push_pull_fifo();
- // TODO: for loop
- push_pull_item#(.DataWidth(ENDPOINT_BUS_WIDTH)) item[NUM_ENDPOINTS-1:0];
- endpoint_fifo[NUM_ENDPOINTS-1].get(item[NUM_ENDPOINTS-1]);
- `uvm_info(`gfn, $sformatf("received endpoint[%0d-1] item:\n%0s", NUM_ENDPOINTS, item[NUM_ENDPOINTS-1].sprint()), UVM_HIGH)
- forever begin
- endpoint_fifo[0].get(item[0]);
- `uvm_info(`gfn, $sformatf("received endpoint[0] item:\n%0s", item[0].sprint()), UVM_HIGH)
- end
- endtask
-
virtual task process_tl_access(tl_seq_item item, tl_channels_e channel = DataChannel);
uvm_reg csr;
bit do_read_check = 1'b1;
diff --git a/hw/ip/edn/dv/env/edn_virtual_sequencer.sv b/hw/ip/edn/dv/env/edn_virtual_sequencer.sv
index bcc718a..98d9b5c 100644
--- a/hw/ip/edn/dv/env/edn_virtual_sequencer.sv
+++ b/hw/ip/edn/dv/env/edn_virtual_sequencer.sv
@@ -8,7 +8,7 @@
);
`uvm_component_utils(edn_virtual_sequencer)
- push_pull_sequencer#(.DataWidth(ENDPOINT_BUS_WIDTH)) endpoint_sequencer_h[NUM_ENDPOINTS-1:0];
+ push_pull_sequencer#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)) endpoint_sequencer_h[NUM_ENDPOINTS-1:0];
`uvm_component_new
diff --git a/hw/ip/edn/dv/tb.sv b/hw/ip/edn/dv/tb.sv
index 6f03577..e36517e 100644
--- a/hw/ip/edn/dv/tb.sv
+++ b/hw/ip/edn/dv/tb.sv
@@ -17,15 +17,16 @@
wire devmode;
wire intr_edn_cmd_req_done, intr_edn_fifo_err;
wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
+ edn_pkg::edn_req_t [NUM_ENDPOINTS-1:0] endpoint_req;
+ edn_pkg::edn_rsp_t [NUM_ENDPOINTS-1:0] endpoint_rsp;
// interfaces
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(interrupts);
pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
- push_pull_if#(.DataWidth(GENBITS_BUS_WIDTH)) csrng_if();
- // TODO: add multiple endpoints, generate?
- push_pull_if#(.DataWidth(ENDPOINT_BUS_WIDTH)) endpoint_if[NUM_ENDPOINTS-1:0]();
+ push_pull_if#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH)) csrng_if();
+ push_pull_if#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)) endpoint_if[NUM_ENDPOINTS-1:0]();
// dut
edn#(.NumEndPoints(NUM_ENDPOINTS)) dut (
@@ -35,10 +36,8 @@
.tl_i (tl_if.h2d),
.tl_o (tl_if.d2h),
- // TODO: add multiple endpoints, generate?
- // .edn_i ({endpoint_if[NUM_ENDPOINTS-1].req, endpoint_if[0].req}),
- .edn_i (endpoint_if[0].req),
- .edn_o (),
+ .edn_i (endpoint_req),
+ .edn_o (endpoint_rsp),
.csrng_cmd_i ('h0),
.csrng_cmd_o (),
@@ -47,6 +46,16 @@
.intr_edn_fifo_err_o (intr_edn_fifo_err)
);
+ for (genvar i = 0; i < NUM_ENDPOINTS; i++) begin : gen_endpoint_if
+ assign endpoint_req[i].edn_req = endpoint_if[i].req;
+ assign endpoint_if[i].ack = endpoint_rsp[i].edn_ack;
+ assign endpoint_if[i].data = endpoint_rsp[i].edn_bus;
+ initial begin
+ uvm_config_db#(virtual push_pull_if#(.DataWidth(edn_pkg::ENDPOINT_BUS_WIDTH)))::set(null,
+ $sformatf("*.env.m_endpoint_agent[%0d]*", i), "vif", endpoint_if[i]);
+ end
+ end
+
assign interrupts[CmdReqDone] = intr_edn_cmd_req_done;
assign interrupts[FifoErr] = intr_edn_fifo_err;
@@ -57,9 +66,7 @@
uvm_config_db#(intr_vif)::set(null, "*.env", "intr_vif", intr_if);
uvm_config_db#(devmode_vif)::set(null, "*.env", "devmode_vif", devmode_if);
uvm_config_db#(virtual tl_if)::set(null, "*.env.m_tl_agent*", "vif", tl_if);
- uvm_config_db#(virtual push_pull_if#(.DataWidth(GENBITS_BUS_WIDTH)))::set(null, "*.env.m_csrng_agent*", "vif", csrng_if);
- // TODO: add multiple endpoints, generate?
- uvm_config_db#(virtual push_pull_if#(.DataWidth(ENDPOINT_BUS_WIDTH)))::set(null, "*.env.m_endpoint_agent*", "vif", endpoint_if[NUM_ENDPOINTS-1]);
+ uvm_config_db#(virtual push_pull_if#(.DataWidth(csrng_pkg::GENBITS_BUS_WIDTH)))::set(null, "*.env.m_csrng_agent*", "vif", csrng_if);
$timeformat(-12, 0, " ps", 12);
run_test();
end
diff --git a/hw/ip/edn/rtl/edn_pkg.sv b/hw/ip/edn/rtl/edn_pkg.sv
index 5efbeed..14e600b 100755
--- a/hw/ip/edn/rtl/edn_pkg.sv
+++ b/hw/ip/edn/rtl/edn_pkg.sv
@@ -9,6 +9,8 @@
// Peripheral Interfaces //
///////////////////////////
+ parameter int unsigned ENDPOINT_BUS_WIDTH = 32;
+
// EDN request interface
typedef struct packed {
logic edn_req;
@@ -16,7 +18,7 @@
typedef struct packed {
logic edn_ack;
logic edn_fips;
- logic [31:0] edn_bus;
+ logic [ENDPOINT_BUS_WIDTH-1:0] edn_bus;
} edn_rsp_t;
parameter edn_req_t EDN_REQ_DEFAULT = '{default: '0};
diff --git a/hw/ip/entropy_src/rtl/entropy_src_pkg.sv b/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
index 3155ec3..06de2ac 100755
--- a/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
@@ -10,7 +10,9 @@
// Entropy Interface
//-------------------------
- parameter int RNG_DATA_WIDTH = 4, CSRNG_DATA_WIDTH = 384;
+ parameter int RNG_DATA_WIDTH = 4;
+ parameter int CSRNG_DATA_WIDTH = 384;
+ parameter int FIPS_WIDTH = 1;
// es entropy i/f
typedef struct packed {