blob: 31055b1a3da3a6dd1faa7b0d85e8bac91328b44d [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_SCRAMBLED_ECC32_MEM_AREA_H_
#define OPENTITAN_HW_DV_VERILATOR_CPP_SCRAMBLED_ECC32_MEM_AREA_H_
#include <vector>
#include "ecc32_mem_area.h"
/**
* A memory that implements scrambling over a 32-bit ECC integrity protection
* scheme storing 39 = 32 + 7 bits of physical data for each 32 bits of logical
* data.
*/
class ScrambledEcc32MemArea : public Ecc32MemArea {
public:
/**
* Constructor
*
* Create an ScrambledEcc32MemArea 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.
*
* If the keystream of one single PRINCE instance should be repeated,
* set "repeat_keystream" to true. If this is set to false, multiple
* PRINCE instances are employed to produce the keystream.
*
*/
ScrambledEcc32MemArea(const std::string &scope, uint32_t size,
uint32_t width_32, bool repeat_keystream = true);
private:
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;
std::vector<uint8_t> ReadUnscrambled(const uint8_t buf[SV_MEM_WIDTH_BYTES],
uint32_t src_word) const;
void ReadBuffer(std::vector<uint8_t> &data,
const uint8_t buf[SV_MEM_WIDTH_BYTES],
uint32_t src_word) const override;
void ReadBufferWithIntegrity(EccWords &data,
const uint8_t buf[SV_MEM_WIDTH_BYTES],
uint32_t src_word) const override;
void WriteBufferWithIntegrity(uint8_t buf[SV_MEM_WIDTH_BYTES],
const EccWords &data, size_t start_idx,
uint32_t dst_word) const override;
void ScrambleBuffer(uint8_t buf[SV_MEM_WIDTH_BYTES], uint32_t dst_word) const;
uint32_t ToPhysAddr(uint32_t logical_addr) const override;
uint32_t GetPhysWidth() const;
uint32_t GetPhysWidthByte() const;
uint32_t GetPrinceReplications() const;
uint32_t GetNonceWidth() const;
uint32_t GetNonceWidthByte() const;
std::vector<uint8_t> GetScrambleKey() const;
std::vector<uint8_t> GetScrambleNonce() const;
std::string scr_scope_;
uint32_t addr_width_;
bool repeat_keystream_;
};
#endif // OPENTITAN_HW_DV_VERILATOR_CPP_SCRAMBLED_ECC32_MEM_AREA_H_