OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
ProGe::ProcessorWrapperBlock Class Reference

#include <ProcessorWrapperBlock.hh>

Inheritance diagram for ProGe::ProcessorWrapperBlock:
Inheritance graph
Collaboration diagram for ProGe::ProcessorWrapperBlock:
Collaboration graph

Public Member Functions

 ProcessorWrapperBlock ()=delete
 
 ProcessorWrapperBlock (const ProGeContext &context, const BaseNetlistBlock &processorBlock)
 
virtual ~ProcessorWrapperBlock ()
 
virtual void write (const Path &targetBaseDir, HDL targetLang=VHDL) const override
 
- Public Member Functions inherited from ProGe::BaseNetlistBlock
 BaseNetlistBlock ()
 
 BaseNetlistBlock (BaseNetlistBlock *parent)
 
 BaseNetlistBlock (const std::string &moduleName, const std::string &instanceName, BaseNetlistBlock *parent=nullptr)
 
virtual ~BaseNetlistBlock ()
 
const std::string & instanceName () const
 
void setInstanceName (const std::string &name)
 
const std::string & moduleName () const
 
const std::string name () const
 
virtual size_t subBlockCount () const
 
virtual const BaseNetlistBlocksubBlock (size_t index) const
 
virtual bool hasSubBlock (const std::string &instanceName) const
 
virtual bool isSubBlock (const BaseNetlistBlock &block) const
 
virtual bool hasParameter (const std::string &name) const
 
virtual const Parameterparameter (const std::string &name) const
 
virtual size_t parameterCount () const
 
virtual const Parameterparameter (size_t index) const
 
virtual size_t portCount () const
 
virtual const NetlistPortport (size_t index) const
 
virtual std::vector< const NetlistPort * > portsBy (SignalType type) const
 
virtual const NetlistPortportBy (SignalType type, size_t index=0) const
 
virtual bool hasPortsBy (SignalType type) const
 
virtual const NetlistPortport (const std::string &portName, bool partialMatch=true) const
 
virtual size_t portGroupCount () const
 
virtual const NetlistPortGroupportGroup (size_t index) const
 
virtual std::vector< const NetlistPortGroup * > portGroupsBy (SignalGroupType type) const
 
virtual const Netlistnetlist () const
 
virtual bool hasParentBlock () const
 
virtual const BaseNetlistBlockparentBlock () const
 
virtual bool isVirtual () const
 
virtual void build () override
 
virtual void connect () override
 
virtual void finalize () override
 
virtual void writeSelf (const Path &targetBaseDir, HDL targetLang=VHDL) const
 
virtual size_t packageCount () const
 
virtual const std::string & package (size_t idx) const
 
PortContainerTypeports ()
 
virtual bool isLeaf () const
 
BaseNetlistBlockshallowCopy (const std::string &instanceName="") const
 
- Public Member Functions inherited from ProGe::IGenerationPhases
virtual ~IGenerationPhases ()
 

Private Member Functions

void addInstructionMemory (const NetlistPortGroup &)
 
void addDataMemory (const MemoryBusInterface &)
 
void addDataMemory2 (const MemoryBusInterface &)
 
void connectLockStatus (const NetlistPort &topPCInitPort)
 
void connectPCInit (const NetlistPort &topPCInitPort)
 
void handleUnconnectedPorts ()
 

Private Attributes

const ProGeContextcontext_
 
BaseNetlistBlockcoreBlock_
 The target TTA processor.
 
unsigned imemCount_ = 0
 

Additional Inherited Members

- Public Types inherited from ProGe::BaseNetlistBlock
typedef std::vector< BaseNetlistBlock * > BlockContainerType
 
typedef std::vector< ParameterParameterContainerType
 
typedef std::vector< NetlistPort * > PortContainerType
 
typedef std::vector< NetlistPortGroup * > PortGroupContainerType
 
- Protected Member Functions inherited from ProGe::BaseNetlistBlock
Netlistnetlist ()
 
virtual NetlistPortport (size_t index)
 
virtual BaseNetlistBlocksubBlock (size_t index)
 
virtual BaseNetlistBlockparentBlock ()
 
void setModuleName (const std::string &name)
 
void addSubBlock (BaseNetlistBlock *subBlock, const std::string &instanceName="")
 
void deleteSubBlock (BaseNetlistBlock *subBlock)
 
void removeSubBlock (BaseNetlistBlock *subBlock)
 
NetlistPortaddPort (NetlistPort *port)
 
void removePort (NetlistPort *port)
 
void addPortGroup (NetlistPortGroup *portGroup)
 
void removePortGroup (NetlistPortGroup *portGroup)
 
void setParameter (const Parameter &param)
 
void addParameter (const Parameter &param)
 
Parameterparameter (const std::string &name)
 
NetlistPortfindPort (const std::string &portName, bool recursiveSearch=false, bool partialMatch=true) const
 
void addPackage (const std::string &packageName)
 
void connectClocks ()
 
void connectResets ()
 

Detailed Description

Definition at line 51 of file ProcessorWrapperBlock.hh.

Constructor & Destructor Documentation

◆ ProcessorWrapperBlock() [1/2]

ProGe::ProcessorWrapperBlock::ProcessorWrapperBlock ( )
delete

References write().

Here is the call graph for this function:

◆ ProcessorWrapperBlock() [2/2]

ProGe::ProcessorWrapperBlock::ProcessorWrapperBlock ( const ProGeContext context,
const BaseNetlistBlock processorBlock 
)

Definition at line 53 of file ProcessorWrapperBlock.cc.

55 : BaseNetlistBlock("proc", ""),
56 context_(context),
57 coreBlock_(processorBlock.shallowCopy()) {
58 assert(processorBlock.portCount() > 0);
60
61 // Wrapper interface //
64 NetlistPort* coreLocked = new OutPort("locked", "1");
65 addPort(coreLocked);
66
67 // Instantiate core //
69
70 // Memory instantiations and connections //
71 for (size_t i = 0; i < coreBlock_->portGroupCount(); i++) {
72 const NetlistPortGroup& portGrp = coreBlock_->portGroup(i);
73 SignalGroupType type = portGrp.assignedSignalGroup().type();
75 addInstructionMemory(portGrp);
76 } else if (type == SignalGroupType::BITMASKED_SRAM_PORT) {
77 auto dmemIf = dynamic_cast<const MemoryBusInterface*>(&portGrp);
78 assert(dmemIf != nullptr);
79 addDataMemory(*dmemIf);
80 } else if (type == SignalGroupType::BYTEMASKED_SRAM_PORT) {
81 auto dmemIf = dynamic_cast<const MemoryBusInterface*>(&portGrp);
82 assert(dmemIf != nullptr);
83 addDataMemory2(*dmemIf);
84 }
85 }
86
89 connectLockStatus(*coreLocked);
90
91 // Package holding instruction bus constants
92 std::set<std::string> procPackages{context.globalPackage().name()};
93
94 // Other packages possibly holding constants used in core ports.
95 for (size_t i = 0; i < processorBlock.packageCount(); i++) {
96 procPackages.insert(processorBlock.package(i));
97 }
98
99 for (auto packageStr : procPackages) {
100 addPackage(packageStr);
101 }
102
103 addPackage(context.coreEntityName() + "_params");
104
105 // Handle unknown ports
107}
#define assert(condition)
void addSubBlock(BaseNetlistBlock *subBlock, const std::string &instanceName="")
NetlistPort * addPort(NetlistPort *port)
virtual size_t portGroupCount() const
virtual const NetlistPortGroup & portGroup(size_t index) const
virtual size_t portCount() const
void addPackage(const std::string &packageName)
SignalGroup assignedSignalGroup() const
static NetlistPort * resetPort(Direction direction=IN)
static NetlistPort * clockPort(Direction direction=IN)
BaseNetlistBlock * coreBlock_
The target TTA processor.
void addInstructionMemory(const NetlistPortGroup &)
void addDataMemory2(const MemoryBusInterface &)
void addDataMemory(const MemoryBusInterface &)
void connectLockStatus(const NetlistPort &topPCInitPort)
SignalGroupType type() const
@ BYTEMASKED_SRAM_PORT
Signal group type for one port SRAM having read and write capability and bitmask for writing with sep...
@ BITMASKED_SRAM_PORT
Signal group type for one port SRAM having read and write capability and bitmask for writing.
@ INSTRUCTION_LINE
Signal group type for serial TTA instruction bus.

References addDataMemory(), addDataMemory2(), addInstructionMemory(), ProGe::BaseNetlistBlock::addPackage(), ProGe::BaseNetlistBlock::addPort(), ProGe::BaseNetlistBlock::addSubBlock(), assert, ProGe::NetlistPortGroup::assignedSignalGroup(), ProGe::BITMASKED_SRAM_PORT, ProGe::BYTEMASKED_SRAM_PORT, ProGe::PortFactory::clockPort(), ProGe::BaseNetlistBlock::connectClocks(), connectLockStatus(), ProGe::BaseNetlistBlock::connectResets(), coreBlock_, ProGe::ProGeContext::coreEntityName(), ProGe::ProGeContext::globalPackage(), handleUnconnectedPorts(), ProGe::INSTRUCTION_LINE, ProGe::GlobalPackage::name(), ProGe::BaseNetlistBlock::package(), ProGe::BaseNetlistBlock::packageCount(), ProGe::BaseNetlistBlock::portCount(), ProGe::BaseNetlistBlock::portGroup(), ProGe::BaseNetlistBlock::portGroupCount(), ProGe::PortFactory::resetPort(), and ProGe::SignalGroup::type().

Here is the call graph for this function:

◆ ~ProcessorWrapperBlock()

ProGe::ProcessorWrapperBlock::~ProcessorWrapperBlock ( )
virtual

Definition at line 109 of file ProcessorWrapperBlock.cc.

109{}

Member Function Documentation

◆ addDataMemory()

void ProGe::ProcessorWrapperBlock::addDataMemory ( const MemoryBusInterface coreDmemPort)
private

Definition at line 179 of file ProcessorWrapperBlock.cc.

179 {
180 using SigT = SignalType;
181
182 const NetlistPort& addrPort = coreDmemPort.portBySignal(SigT::ADDRESS);
183 const NetlistPort& dataPort = coreDmemPort.portBySignal(SigT::WRITE_DATA);
184
185 SinglePortSSRAMBlock* dmemBlock = new SinglePortSSRAMBlock(
186 addrPort.widthFormula(), dataPort.widthFormula(),
187 TCEString("tb/dmem_") + coreDmemPort.addressSpace() + "_init.img",
188 /* isForSmulation = */ true);
189 addSubBlock(dmemBlock, TCEString("dmem_") + coreDmemPort.addressSpace());
190
191 if (!netlist().connect(dmemBlock->memoryPort(), coreDmemPort)) {
194 "Could not connect two port groups together.");
195 }
196}
#define THROW_EXCEPTION(exceptionType, message)
Exception wrapper macro that automatically includes file name, line number and function name where th...
Definition Exception.hh:39
virtual void connect() override
virtual const Netlist & netlist() const

References ProGe::MemoryBusInterface::addressSpace(), ProGe::SinglePortSSRAMBlock::memoryPort(), ProGe::NetlistPortGroup::portBySignal(), THROW_EXCEPTION, and ProGe::NetlistPort::widthFormula().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ addDataMemory2()

void ProGe::ProcessorWrapperBlock::addDataMemory2 ( const MemoryBusInterface coreDmemPort)
private

Definition at line 199 of file ProcessorWrapperBlock.cc.

200 {
201 using SigT = SignalType;
202
203 const NetlistPort& addrPort = coreDmemPort.portBySignal(SigT::AADDR);
204 const NetlistPort& dataPort = coreDmemPort.portBySignal(SigT::RDATA);
205
206 SinglePortByteMaskSSRAMBlock* dmemBlock =
207 new SinglePortByteMaskSSRAMBlock(
208 addrPort.widthFormula(), dataPort.widthFormula(),
209 TCEString("tb/dmem_") + coreDmemPort.addressSpace() + "_init.img",
210 /* isForSmulation = */ true);
211 addSubBlock(dmemBlock, TCEString("dmem_") + coreDmemPort.addressSpace());
212
213 if (!netlist().connect(dmemBlock->memoryPort(), coreDmemPort)) {
216 "Could not connect two port groups together.");
217 }
218}

References ProGe::MemoryBusInterface::addressSpace(), ProGe::SinglePortByteMaskSSRAMBlock::memoryPort(), ProGe::NetlistPortGroup::portBySignal(), THROW_EXCEPTION, and ProGe::NetlistPort::widthFormula().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ addInstructionMemory()

void ProGe::ProcessorWrapperBlock::addInstructionMemory ( const NetlistPortGroup coreImemPort)
private

Definition at line 120 of file ProcessorWrapperBlock.cc.

121 {
122 using SigT = SignalType;
123 bool isRISCV = context_.adf().isRISCVMachine();
124
125 const int imemWidthInMaus = (context_.adf().isRISCVMachine()) ? 4 : 1;
126 const int unusedBits = std::ceil(std::log2(imemWidthInMaus));
127
128 std::string addrWidth = context_.globalPackage().fetchBlockAddressWidth();
129 if (isRISCV) {
130 const int unusedBits = std::ceil(std::log2(imemWidthInMaus));
131 addrWidth = context_.globalPackage().fetchBlockAddressWidth() + "-" +
132 std::to_string(unusedBits);
133 }
134
135 SinglePortSSRAMBlock* imemBlock = new SinglePortSSRAMBlock(
137 "tb/imem_init.img", true);
138 addSubBlock(imemBlock, "imem0");
139 // todo: use core id instead of counter value.
140 std::string accessTrace = std::string("core") +
142 "_imem_access_trace.dump";
143 imemBlock->setAccessTraceFile(accessTrace);
144
145 if (isRISCV) {
146 // With RISC-V the two lower bits are unused
147 const int realAddrWidth = MathTools::requiredBits(
150 imemBlock->memoryPort(), coreImemPort,
151 {{SigT::READ_DATA, SigT::FETCHBLOCK},
152 {SigT::READ_WRITE_REQUEST, SigT::READ_REQUEST}});
154 imemBlock->memoryPort().portBySignal(SigT::ADDRESS),
155 coreImemPort.portBySignal(SigT::ADDRESS), 0, unusedBits,
156 realAddrWidth - unusedBits);
157 } else {
159 imemBlock->memoryPort(), coreImemPort,
160 {{SigT::ADDRESS, SigT::ADDRESS},
161 {SigT::READ_DATA, SigT::FETCHBLOCK},
162 {SigT::READ_WRITE_REQUEST, SigT::READ_REQUEST}});
163 }
164
165 imemBlock->memoryPort()
166 .portBySignal(SigT::WRITE_BITMASK)
167 .setToStatic(StaticSignal::VCC);
168 imemBlock->memoryPort()
169 .portBySignal(SigT::WRITEMODE)
170 .setToStatic(StaticSignal::VCC);
171 imemBlock->memoryPort()
172 .portBySignal(SigT::WRITE_DATA)
173 .setToStatic(StaticSignal::GND);
174 coreImemPort.portBySignal(SigT::READ_REQUEST_READY)
175 .setToStatic(StaticSignal::GND); // Active low
176}
static std::string toString(const T &source)
static int requiredBits(unsigned long int number)
const std::string fetchBlockAddressWidth() const
const std::string fetchBlockDataWidth() const
bool connect(const NetlistPort &port1, const NetlistPort &port2, int port1FirstBit, int port2FirstBit, int width=1)
Definition Netlist.cc:83
const TTAMachine::Machine & adf() const
const GlobalPackage & globalPackage() const
@ GND
All port signals set to low.
@ VCC
All port signals set to high.
virtual ULongWord end() const
virtual AddressSpace * addressSpace() const
virtual ControlUnit * controlUnit() const
Definition Machine.cc:345
bool isRISCVMachine() const
Definition Machine.cc:1057

References TTAMachine::FunctionUnit::addressSpace(), ProGe::BaseNetlistBlock::addSubBlock(), ProGe::ProGeContext::adf(), ProGe::Netlist::connect(), context_, TTAMachine::Machine::controlUnit(), TTAMachine::AddressSpace::end(), ProGe::GlobalPackage::fetchBlockAddressWidth(), ProGe::GlobalPackage::fetchBlockDataWidth(), ProGe::ProGeContext::globalPackage(), imemCount_, TTAMachine::Machine::isRISCVMachine(), ProGe::SinglePortSSRAMBlock::memoryPort(), ProGe::BaseNetlistBlock::netlist(), ProGe::NetlistPortGroup::portBySignal(), MathTools::requiredBits(), ProGe::SinglePortSSRAMBlock::setAccessTraceFile(), and Conversion::toString().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ connectLockStatus()

void ProGe::ProcessorWrapperBlock::connectLockStatus ( const NetlistPort topPCInitPort)
private

Definition at line 221 of file ProcessorWrapperBlock.cc.

222 {
223 assert(
224 coreBlock_->port("locked") != nullptr &&
225 "Could not found lock status port.");
226 if (!netlist().connect(*coreBlock_->port("locked"), topLockStatusPort)) {
229 "Could not connect \"locked\" signal to the toplevel");
230 }
231}
virtual const NetlistPort & port(size_t index) const

References assert, and THROW_EXCEPTION.

Referenced by ProcessorWrapperBlock().

◆ connectPCInit()

void ProGe::ProcessorWrapperBlock::connectPCInit ( const NetlistPort topPCInitPort)
private

◆ handleUnconnectedPorts()

void ProGe::ProcessorWrapperBlock::handleUnconnectedPorts ( )
private

Handles unconnected ports of the top-level TTA processor by connecting them to the toplevel

Definition at line 238 of file ProcessorWrapperBlock.cc.

238 {
239 for (size_t i = 0; i < coreBlock_->portCount(); i++) {
240 const NetlistPort& port =
241 ((const BaseNetlistBlock*)coreBlock_)->port(i);
243 NetlistPort* topPort = port.clone();
244 addPort(topPort);
245 netlist().connect(*topPort, port);
246 }
247 }
248}
virtual NetlistPort * clone(bool asMirrored=false) const
bool hasStaticValue() const
bool isPortConnected(const NetlistPort &port) const
Definition Netlist.cc:273

References ProGe::NetlistPort::clone(), and ProGe::NetlistPort::hasStaticValue().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ write()

void ProGe::ProcessorWrapperBlock::write ( const Path targetBaseDir,
HDL  targetLang = VHDL 
) const
overridevirtual

Does nothing on self but calls write function on each sub block.

Reimplemented from ProGe::BaseNetlistBlock.

Definition at line 112 of file ProcessorWrapperBlock.cc.

113 {
115 targetBaseDir / std::string("tb"), targetLang);
116 BaseNetlistBlock::write(targetBaseDir, targetLang);
117}
virtual void write(const Path &targetBaseDir, HDL targetLang=VHDL) const override
virtual void writeSelf(const Path &targetBaseDir, HDL targetLang=VHDL) const

References ProGe::BaseNetlistBlock::write(), and ProGe::BaseNetlistBlock::writeSelf().

Referenced by ProcessorWrapperBlock(), and ProGe::TestBenchBlock::write().

Here is the call graph for this function:

Member Data Documentation

◆ context_

const ProGeContext& ProGe::ProcessorWrapperBlock::context_
private

Definition at line 74 of file ProcessorWrapperBlock.hh.

Referenced by addInstructionMemory().

◆ coreBlock_

BaseNetlistBlock* ProGe::ProcessorWrapperBlock::coreBlock_
private

The target TTA processor.

Definition at line 76 of file ProcessorWrapperBlock.hh.

Referenced by ProcessorWrapperBlock().

◆ imemCount_

unsigned ProGe::ProcessorWrapperBlock::imemCount_ = 0
private

Definition at line 77 of file ProcessorWrapperBlock.hh.

Referenced by addInstructionMemory().


The documentation for this class was generated from the following files: