Scenario adapters were developed around the idea of components getting in and out of an execution scenario, allowing actions to be executed at these points, therefore, a scenario must define at least two different operations: enter and leave. These actions must take place respectively before and after each of the component’s operation in order to setup the conditions required by the scenario. For example, in a compressed scenario, enter would be responsible to decompress the component’s input data, while leave would compress its outputs. In the software domain, components are objects which communicate using method invocation (considering an OOPbased approach) and the execution of all operations are naturally sequential, so the scenario adapters were originally developed to provide means to just efficiently wrap the method calls to an object with enter and leave operations. However, in the hardware domain, components have input and output signals instead of a method or function interface, and all operations are intrinsically parallel. These different characteristics required some modifications on the original scenario adapter. The new scenario adapter is shown in figure of a scenario adapter. System C defines hardware components by the specialization of the sc_module class. Components communicate using special objects called channels. System C channels can be used to encapsulate complex communication protocols at register transfer or higher levels of abstraction. However, these complex channels lie outside the System C synthesizable subset, so we use only sc_in and sc_out, which define simple input and output ports for components. Methods which implement the component’s behavior must be defined as System C processes. In our examples we use System C clocked threads (SC_CTHREAD), in which all operations are synchronous to a clock signal. The implementation of the Component::controller method in figure 1 shows the common behavior of a SC_CTHREAD. System C wait() statements must be used to synchronize the operations with the clock, in other words, all operations defined between two wait() statements occur in the same clock cycle. Using these constructs, we define each aspect as a single and independent hardware component (Aspect class). Enter and leave operations are defined using a simple handshaking protocol (op_rdy_out and op_req_in signals) to trigger its execution. The remaining input/output ports define which operation are being triggered (this is specific of each aspect).
With this kind of handshaking communication protocol we can produce more reusable components, since the number of clock cycles it requires for each operation is hidden by the protocol, thus making it easier to synchronize component execution with the rest of the design.