| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| package spi_agent_pkg; |
| // dep packages |
| import uvm_pkg::*; |
| import dv_utils_pkg::*; |
| import dv_lib_pkg::*; |
| |
| // macro includes |
| `include "uvm_macros.svh" |
| `include "dv_macros.svh" |
| |
| // parameter |
| parameter uint TPM_START_MAX_WAIT_TIME_NS = 10_000_000; // 10ms |
| parameter uint CSB_WIDTH = 2; |
| parameter uint NUM_CSB = CSB_WIDTH ** 2; |
| parameter time TIME_SCK_STABLE_TO_CSB_NS = 10ns; |
| parameter uint TPM_ADDR_WIDTH = 24; |
| parameter uint TPM_ADDR_WIDTH_BYTE = TPM_ADDR_WIDTH / 8; |
| parameter bit TPM_WAIT = 1'b0; |
| parameter bit TPM_START = 1'b1; |
| parameter byte MAX_TPM_SIZE = 64; |
| parameter byte TPM_CMD_DIR_BIT_POS = 7; |
| parameter bit TPM_CMD_WRITE_BIT_VALUE = 0; |
| parameter bit TPM_CMD_READ_BIT_VALUE = 1; |
| |
| // transaction type |
| typedef enum { |
| // device dut |
| SpiTransNormal, // normal SPI trans |
| SpiTransSckNoCsb, // bad SPI trans with sck but no csb |
| SpiTransCsbNoSck, // bad SPI trans with csb but no sck |
| SpiTransIncompleteOpcode // bad SPI trans with incompleted opcode for flash/tpm mode only |
| } spi_trans_type_e; |
| |
| // sck edge type - used by driver and monitor |
| // to wait for the right edge based on CPOL / CPHA |
| typedef enum { |
| LeadingEdge, |
| DrivingEdge, |
| SamplingEdge |
| } sck_edge_type_e; |
| |
| // spi mode |
| typedef enum bit [1:0] { |
| Standard = 2'b00, // Full duplex, tx: sio[0], rx: sio[1] |
| Dual = 2'b01, // Half duplex, tx and rx: sio[1:0] |
| Quad = 2'b10, // Half duplex, tx and rx: sio[3:0] |
| RsvdSpd = 2'b11 // RFU |
| } spi_mode_e; |
| |
| // spi functional mode |
| typedef enum bit [1:0] { |
| SpiModeGeneric, |
| SpiModeFlash, |
| SpiModeTpm |
| } spi_func_mode_e; |
| |
| // Command-Set implemented by the agent in device_mode. |
| // The first byte in a transaction should be one of these commands. |
| typedef enum bit [7:0] { |
| ReadStd = 8'b11001100, |
| WriteStd = 8'b11111100, |
| ReadDual = 8'b00000011, |
| WriteDual = 8'b00001100, |
| ReadQuad = 8'b00001111, |
| WriteQuad = 8'b11110000, |
| CmdOnly = 8'b10000001 |
| } spi_cmd_e; |
| |
| typedef enum bit [1:0] { |
| SpiFlashAddrDisabled, |
| // Configurable 3b or 4b address |
| SpiFlashAddrCfg, |
| // Fixed 3b addr |
| SpiFlashAddr3b, |
| // Fixed 4b addr |
| SpiFlashAddr4b |
| } spi_flash_addr_mode_e; |
| |
| typedef enum bit [1:0] { |
| SpiIdle, |
| SpiCmd, |
| SpiData |
| } spi_fsm_e; |
| |
| // forward declare classes to allow typedefs below |
| typedef class spi_item; |
| typedef class spi_agent_cfg; |
| |
| string msg_id = "spi_agent_pkg"; |
| |
| // formart: {write, 0, size-1 (6 bits)} |
| function automatic bit [7:0] get_tpm_cmd(bit write, uint size); |
| `DV_CHECK_LE(size, MAX_TPM_SIZE, , , msg_id) |
| return {write ? TPM_CMD_WRITE_BIT_VALUE : TPM_CMD_READ_BIT_VALUE, 1'b0, 6'(size - 1)}; |
| endfunction |
| |
| function automatic void decode_tpm_cmd(input bit [7:0] cmd, |
| output bit write, output uint size); |
| write = (cmd[TPM_CMD_DIR_BIT_POS] == TPM_CMD_WRITE_BIT_VALUE) ? 1 : 0; |
| `DV_CHECK_EQ(cmd[6], 0, , , msg_id) |
| size = cmd[5:0] + 1; |
| `DV_CHECK_LE(size, MAX_TPM_SIZE, , , msg_id) |
| endfunction |
| |
| // package sources |
| `include "spi_flash_cmd_info.sv" |
| `include "spi_agent_cfg.sv" |
| `include "spi_agent_cov.sv" |
| `include "spi_item.sv" |
| `include "spi_monitor.sv" |
| `include "spi_driver.sv" |
| `include "spi_host_driver.sv" |
| `include "spi_device_driver.sv" |
| `include "spi_sequencer.sv" |
| `include "spi_agent.sv" |
| `include "seq_lib/spi_seq_list.sv" |
| |
| endpackage: spi_agent_pkg |