blob: 5e1ec5ab953e923805476960f5b145baef47eede [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
/**
* Mock EDN end point that returns a fixed value after a fixed delay used for
* OTBN simulation purposes.
*/
module otbn_mock_edn
import edn_pkg::*;
#(
parameter int Width = 256,
parameter logic [1:0][Width-1:0] FixedEdnVals = '0,
parameter int Delay = 16,
localparam int DelayWidth = $clog2(Delay)
) (
input clk_i,
input rst_ni,
input edn_req_t edn_req_i,
output edn_rsp_t edn_rsp_o,
output [Width-1:0] edn_data_o,
output edn_ack_o
);
assign edn_rsp_o.edn_ack = edn_req_active && !edn_req_counter[0];
assign edn_rsp_o.edn_fips = 1'b1;
always_comb begin
if (edn_data_sel_q) begin
edn_rsp_o.edn_bus = edn_req_counter[1] ? 32'hCCCC_CCCC : 32'hBBBB_BBBB;
end else begin
edn_rsp_o.edn_bus = edn_req_counter[1] ? 32'hAAAA_AAAA : 32'h9999_9999;
end
end
parameter int MaxDelay = Delay - 1;
logic edn_data_sel_q, edn_data_sel_d;
logic [DelayWidth-1:0] edn_req_counter;
logic edn_req_active;
logic edn_req_complete;
assign edn_req_complete = edn_req_counter == MaxDelay[DelayWidth-1:0];
assign edn_ack_o = edn_req_complete;
always_comb begin
edn_data_o = '0;
edn_data_sel_d = edn_data_sel_q;
if (edn_req_complete) begin
edn_data_o = FixedEdnVals[edn_data_sel_q];
edn_data_sel_d ^= 1'b1; // flip selection of fixed value
end
end
always @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
edn_data_sel_q <= 1'b0;
edn_req_counter <= '0;
edn_req_active <= 0;
end else begin
edn_data_sel_q <= edn_data_sel_d;
if (edn_req_active) begin
edn_req_counter <= edn_req_counter + 1;
end
if (edn_req_i.edn_req & ~edn_req_active) begin
edn_req_active <= 1;
end
if (edn_req_complete) begin
edn_req_active <= 0;
end
end
end
endmodule