blob: e42ea2dd736bd35b7de66657b2a42bca331df8ad [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_HW_DV_VERILATOR_CPP_ECC32_MEM_AREA_H_
#define OPENTITAN_HW_DV_VERILATOR_CPP_ECC32_MEM_AREA_H_
#include "mem_area.h"
/**
* A memory that implements 32-bit ECC, storing 39 = 32 + 7 bits of physical
* data for each 32 bits of logical data.
*/
class Ecc32MemArea : public MemArea {
public:
/**
* Constructor
*
* Create an Ecc32MemArea that will connect to a SystemVerilog memory at
* scope. It is size words long. Each memory word is 4 * width_32 bytes wide
* in the address space and 39 * width_32 bits wide in the physical memory.
*/
Ecc32MemArea(const std::string &scope, uint32_t size, uint32_t width_32);
void LoadVmem(const std::string &path) const override;
typedef std::pair<bool, uint32_t> EccWord;
typedef std::vector<EccWord> EccWords;
/** Read data with validity bits, starting at the given offset.
*
* This is equivalent to MemArea's Read method, but returns 32 bit
* words, each with a boolean saying whether the integrity bits for
* that word are valid or not.
*
* @param word_offset The offset, in words, of the first word that should be
* read.
*
* @param num_words The number of words to read.
*/
EccWords ReadWithIntegrity(uint32_t word_offset, uint32_t num_words) const;
/** Write data with validity bits, starting at the given offset
*
* This is equivalent to MemArea's Write method, but takes a vector of pairs
* with a bit saying whether the integrity bits for the word are valid or
* not.
*
* @param word_offset The offset, in words, of the first word that should be
* written.
*
* @param data The data that should be written.
*/
void WriteWithIntegrity(uint32_t word_offset, const EccWords &data) const;
protected:
void WriteBuffer(uint8_t buf[SV_MEM_WIDTH_BYTES],
const std::vector<uint8_t> &data, size_t start_idx,
uint32_t dst_word) const override;
void ReadBuffer(std::vector<uint8_t> &data,
const uint8_t buf[SV_MEM_WIDTH_BYTES],
uint32_t src_word) const override;
/** Extract the logical words corresponding to the physical memory contents
* in \p buf, together with validity bits. Append them to \p data.
*
* @param data The target, onto which the extracted memory words should
* be appended.
*
* @param buf Source buffer (physical memory bits)
*
* @param src_word Logical address of the location being read
*/
virtual void ReadBufferWithIntegrity(EccWords &data,
const uint8_t buf[SV_MEM_WIDTH_BYTES],
uint32_t src_word) const;
/** Insert a memory word into buf from one or more 32-bit words in data.
*
* @param buf Destination buffer (physical memory bits)
*
* @param data Source data, from which the 32-bit words should be read
*
* @param start_idx The index of the first 32-bit word in data to read
*
* @param dst_word Logical address of the location being written
*/
virtual void WriteBufferWithIntegrity(uint8_t buf[SV_MEM_WIDTH_BYTES],
const EccWords &data, size_t start_idx,
uint32_t dst_word) const;
};
#endif // OPENTITAN_HW_DV_VERILATOR_CPP_ECC32_MEM_AREA_H_