Aspect-Oriented Design in SystemC ... - Semantic Scholar

4 downloads 720 Views 144KB Size Report
Sep 1, 2006 - new programming paradigms is aspect-oriented program- ming (AOP) [Kiczales et al. ... (a bank system, an air ticket system, etc.), while the rest.
Aspect-Oriented Design in SystemC: Implementation and Applications ∗



David Deharbe ´

Sergio Medeiros

Universidade Federal do Rio Grande do Norte Departamento de Informatica ´ e Matematica ´ Aplicada Natal, RN, Brazil

Universidade Federal do Rio Grande do Norte Departamento de Informatica ´ e Matematica ´ Aplicada Natal, RN, Brazil

ABSTRACT

1. INTRODUCTION

New programming languages paradigms have commonly been evaluated and eventually incorporated into hardware description languages. Aspect-oriented programming (AOP) is a new paradigm that provides new modularity constructs on top of object-oriented and structured languages such as Java, C++ and C. This paper presents and assesses possible applications of AOP in the context of integrated system design. More specifically, we apply AOP in applications developed using SystemC to model important system aspects such as metrics measure, communication and cache policy to demonstrate the benefits of this approach. The impact of this new approach in the simulation time of the applications is also discussed in the paper.

Along the history of the development of hardware description languages (HDL) [Chu et al. 1992, Borrione et al. 1992], we observe that these languages share many similarities with programming languages and that new programming languages paradigms have proved useful also to the hardware design area. For instance, we can note how close the languages VHDL and Verilog are related to ADA and C, respectively. SystemC, based on C++, and SpecC, based on C, are two more recent examples of this phenomenon. It is thus of interest to the integrated systems and circuit design community to keep up to date on the evolution of programming languages and evaluate how new paradigms can be used. Currently, an important concern in the domain of programming languages is to improve the expressiveness of the object-oriented paradigm and one of the most promising new programming paradigms is aspect-oriented programming (AOP) [Kiczales et al. 1997]. To conduct this study, we need to have a concrete feedback on possible applications of AOP to system design. The choice of at least an implementation language is therefore necessary. Considering that implementations of AOP concepts are mainly target towards programming languages (Java in particular), our immediate choice was to consider a system description language based on such a programming language, and we thus adopted SystemC [Panda 2001], in combination with AspectC++ [Spinczyk et al. 2002], a tool that enables the use of AOP with C++. The AOP approach is based on the idea that the structured and object-oriented approaches do not make it easy to cleanly separate code with different purposes, because some aspect(s) of the system (such log generation, real-time constraints, synchronization, etc.) cannot be cleanly encapsulated in a single unit (a class, a method, etc.) This limitation of the traditional paradigms leads to an extra difficulty to understand, to maintain and to reuse the code where these aspects arise. Using the AOP approach, a system can be designed in such a way that code with different purposes becomes encapsulated in different units, that can be later composed following some specific rules. We investigate the use of AOP in the context of hardware design using the SystemC library as our system description language and the AspectC++ tool. The remainder of this paper is organized as follows: Section 2 presents related work; Section 3 presents the aspect-oriented paradigm

Categories and Subject Descriptors B.7.2 [Integrated Circuits]: Design Aids; D.2.2 [Software Engineering]: Design Tools and Techniques; D.3.3 [Programming Languages]: Language Constructs and Features; J.6 [Computer Applications]: ComputerAided Engineering—Computer-Aided Design

General Terms Languages,Design

Keywords Aspect-oriented programming, hardware description languages, SystemC ∗Partially supported by CNPq grant 500473/2003-0. †Partially supported by CNPq grant Plano Nacional de Micro-eletrˆ onica.

Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. SBCCI’06, August 28–September 1, 2006, Minas Gerais, Brazil. Copyright 2006 ACM 1-59593-479-0/06/0008 ...$5.00.

119

• the difficulty to understand the code, because code with different purposes is mixed;

and its implementation in the AspectC++ tool; Section 4 provides different applications of AOP concepts to improve modularity of SystemC designs, dealing with aspects such as simulation and communication; Section 5 presents an analysis performance of applications developed using SystemC and AOP; and Section 6 draws conclusions and describes future work.

2.

• the code related to a concern is not encapsulated in a single unit, but it is scattered along the system (among different classes and files), and any modification to this concerns needs to be carried out in several places, difficulting the evolution/maintenance of the system; • the mix of functional and non-functional code impacts negatively the reusability of components.

RELATED WORK

There is not much evidence about the usage of AOP in the context of HDLs. The related work include mainly [Jeda 2005] and [Vachharajani et al. 2004], which tried to use AOP in the hardware design by introducing a new language. The application of the AOP approach is then limited to a specific phase of the project (verification and instrumentation of models, respectively). The approach presented in this paper, however, does not require the introduction of a new language, and does not restrict itself to a particular phase of the project. [Yan Chen and Peng 2004] proposed the usage of AOP during test coverage to perform the log generation of the executed functions according to some test bench. But very little information about the implementation is provided and no specific results are presented. [Jakacki 2003] suggested the utilization of AOP to capture the function calls related to the communication of the SystemC modules, but the aspect declaration syntax presented is awkward and no mention is made of a possible tool support.

3.

It would therefore be more convenient to have the code of a single concern well localized in a single unit to facilitate its design, implementation, verification and maintenance. AOP provides such a new modularization concept, called an aspect. Thus, component and aspect are two basic concepts in the AOP approach [Kiczales et al. 1997]: • Component: A property that can be cleanly encapsulated in a generalized procedure (i.e. object, method, procedure); • Aspect: A property that can not be cleanly encapsulated in a generalized procedure.

3.2 Join Points and Advices In the AOP approach, the aspect-related code is cleanly separated from the component code at the source level, and therefore needs to be later composed. The role of join points is to identify the locations in the component code where the aspects act: they are a set of well localized points in a program thread execution. In most implementations of AOP, the aspects can add behaviour before or after the join point, as well as get the entire control on the join point replacing its original code. The aspect related code together with the corresponding join points is defined in an entity called an advice.

AOP

Object-orientation prevails today as one of the most successful packaging and modularization technique in programming languages, where a system is built by decomposing a problem into classes and then writing their code [Elrad et al. 2001]. But object-orientation often fails to provide a good modular representation for some properties of a system, such as: syncronization, quality of service, distributed transactions, log generation, etc. The code in such systems is divided into one part handling the basic functionalities of the application being developed (a bank system, an air ticket system, etc.), while the rest is related to some aspect that is essential for the system to achieve its purpose (syncronization, log generation, etc.). In the object-oriented approach, these two kinds of code are scattered along the code of the classes, making them harder to understand and maintain. As already pointed out in [Dijkstra 1976], the separation of concerns is fundamental for a good understanding of the system. Because of this, the post-object programming (POP) mechanisms that look to increase the expressiveness of the OO paradigm are a fertile arena for current research [Czarnecki and Eisenecker 2000, Elrad et al. 2001]. To date, aspect-oriented programming (AOP) has been one of the most successful among such approaches [Kiczales et al. 1997].

3.3 Weaving Aspects To join the component and aspect code, a tool called an aspect weaver is a specialized source code pre-processor that inserts the aspect code in the corresponding join points, in a process called aspect weaving. The aspect code can be changed whenever necessary, the aspect weaver only needs to be executed again and a new version of the system will be generated based in the component code and in the aspects code.

3.4 AspectC++ As we intend to use the SystemC library based on C++, we will use the tool AspectC++ [Spinczyk et al. 2002] to do the weaving between the component code and the aspect code. Using this tool, we can declare an aspect in a similar fashion as a C++ class, but using the keyword aspect instead of class. Local variables, advice and methods can then be declared. An advice declaration specifies code that should be executed when a join point, described by a match expression, is reached. The code of an advice is joined to the component code at compilation time using the AspectC++ tool. A match expression is a chain representing a search pattern. The character % is a wildcard for names and the chain ... matchs any number of parameters in a function or any number of scopes in a qualified name. The following examples illustrate these possibilities:

3.1 Component and Aspect It is often not possible to implement a concern of the system in a modular way, and the code related to this concern can be tangled with the code related to other system’s concerns or scattered along all the system. This situation is an example of a crosscutting concern. This kind of code leads to several remarks, such as:

120

1 aspect Measure { 2 int cycles, idle_cycles, requesting_cycles, 3 pushing_cycles, popping_cycles; 4 advice execution("int main(...)") : around() { 5 cout target()); 13 ++cycles; 14 switch(mm->state) { 15 case (RESET): init(); 16 break; 17 case (IDLE): ++idle_cycles; 18 break; 19 case (PUSHING): ++pushing_cycles; 20 break; 21 case (REQUESTING): ++requesting_cycles; 22 break; 23 case (POPPING): ++popping_cycles; 24 break; 25 } 26 } 27 public: 28 void init() { ... } 29 void show_results() { ... } 30 };

• "void %::print()": matches all methods print, without arguments and without return value, of any class; • "void Memory::set%(...)": matches all methods of class Memory with return type void, with any number of arguments, whose names start by set; • "int function(int, %)": matches function with two arguments, the first must be an int and the second can be of any type, and the return value must be of type int.

4.

APPLICATION OF AOP FACILITIES IN THE DESIGN PROCESS

We present different applications of AOP to system design, through some examples and discuss the benefits of this approach. Several stages of the system development are explored: in the design-space exploration phase, where collection of metrics is necessary to help the designer in its choices, and the impact of using different implementations of a component needs to be investigated; in the verification phase, where intensive tests need to be applied to the system. We also present examples where AOP can be used to model hardware1

Figure 1: An aspect that implements the collection of a simple metrics

4.1 Simulation-based metrics collection the code of the original function should be replaced by the code of this advice. This advice calls the aspect method init() to initialize the variables and then calls the method proceed() of the tjp pointer. The tjp pointer contains information related to the current join point and by calling its method proceed(), makes a call to the original code of this join point, i.e. the function main in this case. When this function has completed its execution, the aspect method show results is called to print the collected values. Line 10 declares a second advice whose code should be executed after each execution of function UpdateState of the module Module. This advice looks up the current state of the module and updates the corresponding counter. Lines 28 and 29 declare the methods init() and show results() (the definition body of these methods was omitted). Finally, the code related to the metrics collection is grouped in the aspect Simulation, and the module that implements the virtual channel becomes clearer because it does not have code related with the simulation anymore. To turn the simulation aspect off, the module affected by the aspect is compiled again without enabling the aspect weaving, or by using a conventional compiler, which is a much cleaner approach than would be a pure SystemC/C++ solution, probably scattering the design description with printing statements and pre-processing directives.

The simulation of a SystemC application is a very important stage, where the designers observe and adjust the behaviour of the application being developed. It is often the case that some extra variables and instructions need to be introduced to gather information during the simulation. But all this extra code is not related to the basic functionalities of the application, so it is not part of the component code but an aspect related to the measure of some metrics during the simulation. This situation is the primary example where AOP can be put to use to the benefit of code modularity, readability and reusability. This can be illustrated by an example that was developed in the context of a Network-on-Chip (NoC) [Jantsch and Tenhunen 2003]. Each node of the network has input and output ports, and each port has a number of virtual channels. Each virtual channel was implemented in a FirstIn-First-Out way, so the packages are sent in the order they arrived. A virtual channel is modelled as a state machine and has a set of possible states. An aspect collects information about how the state of the component distributes over the possible states. Figure 1 shows a simplified aspect that counts how many cycles a module passed in each possible state since the last reset. It is also interesting to give a concrete examples of the different features of AOP presented in Section 3. Line 1 declares the aspect Measure, which is responsible for the collection of the metrics. Lines 2 and 3 declare variables to count the number of cycles spent in each state. Line 4 declares an advice responsible for the aspect code that should be executed when a join point, in this case the function main, is reached. The keyword around says

4.2 Cache Replacement Policy Replacement policy is one of the key factors to determine the effectiveness of a cache memory. State-of-the-art processors employ various policies such as Random, Least Recently Used (LRU) and First-In-First-Out (FIFO), indicating that there is no common wisdom about the best one [Al-Zoubi et al. 2004]. Thus, when constructing a cache, an important part in the exploration of the design space is to find the most appropriate replacement policy. We show how AOP can be

1 Due to space restrictions, we cannot present the source code of the examples in the paper; however, the interested reader is invited to visit an anonymized copy of the SystemC/AOP web page at the following URL: http://www. geocities.com/tampo 8/systemcaop/.

121

1 aspect FXPT { 2 3 pointcut ptwrapper() = "Wrapper"; 4 5 advice ptwrapper(): public: 6 sc_signal in_real; 7 advice ptwrapper(): public: 8 sc_signal in_imag; 9 advice ptwrapper(): public: 10 sc_signal out_real; 11 advice ptwrapper(): public: 12 sc_signal out_imag; 13 14 pointcut ptsink() = "Sink"; 15 16 advice ptsink(): public: sc_in in_real; 17 advice ptsink(): public: sc_in in_imag; 18 19 pointcut ptsource() = "Source"; 20 21 advice ptsource(): public: sc_out out_real; 22 advice ptsource(): public: sc_out out_imag; 23 24 pointcut ptfft() = "FFT"; 25 26 advice ptfft(): public: sc_in in_real; 27 advice ptfft(): public: sc_in in_imag; 28 advice ptfft(): public: sc_out out_real; 29 advice ptfft(): public: sc_out out_imag; 30 31 advice ptfft(): public: void func_butterfly ( ... ) 32 { ... }; 33 34 advice execution ("void FFT::entry()") && that (ff): 35 around (FFT& ff) 36 { ... } 37 38 };

used to determine the cache replacement policy of an application. At the top-level, it is easy to represent a cache policy as an aspect and to choose which cache policy you would like to use for each module just by selecting the corresponding aspect, without having to change the source code of the modules if you want to change the current cache policy. This approach was tested with an internal processor, named GPOP, and the cache policies Random, LRU and FIFO. This experiment is interesting from two points of view. First, it shows that AOP can cleanly encapsulate a hardware component. Second, it demonstrates that, in the design process, different hardware alternatives can be explored by plugging the corresponding implementations. Once the best alternative has been chosen, as the output of the AspectC++ weaver produces a standard SystemC/C++ description of the system, it can be employed in the following design stages, e.g. synthesis, using SystemC-only tools.

4.3 Functional Verification AOP is also a good candidate to realize functional verification tasks, as it offers simple means to observe values in a non-intrusive fashion. For instance, AOP can be combined elegantly with transaction-based verification methodologies, like the SystemC Verification Library (SCV), where AOP could help to determine the appropriate test set based on the context of the current join point and to modify the constraints that a class should obey. The Design by Contract (DBC) [Meyer 2000] approach also combines neatly with AOP. DBC has been shown to be a technique that ensures software quality, reliability, reusability that has already been successfully applied to the design of embedded systems [Brunel et al. 2004]. The AOP facilitates the application of the DBC methodology because its flexibility, transparency and capability to deal with separation of concerns [Diotalevi 2004]. The result is that the DBC approach, combined with the AOP approach, is very suitable to do the test-based verification of a system.

Figure 3: Aspect FXPT

provides a clear example of separation of control and data stream problem [Thekkath et al. 1994]. Our idea was to use AOP to encapsulate as an aspect the code related to the FFT implementation that crosscuts all the system and needs to be modified if we wish to change the data stream in the FFT implementation. This code is composed by several input/output ports and the functions that perform the FFT algorithm. The modules structure of our system is presented in Figure 2, the module Wrapper contains the code that connects the modules Sink, Source and FFT. There are two aspects, one for each FFT implementation, so we can choose which one to instantiate just by changing an option during the compilation. The aspect presented in Figure 3 is responsible by the FFT implementation for integer numbers. Line 1 declares the aspect FXPT and line 3 declares the pointcut ptwrapper. Next (lines 5-12), we introduce the variables related to the FFT implementation into the module Wrapper, so we are adapting this module to do a specific FFT algorithm. A similar approach is done for the other modules Sink (lines 14-17), Source (lines 19-22) and FFT (lines 24-29). The module FFT requires a special attention, because we also need to insert two functions related to the FFT algorithm implementation. Lines 31-32 add to the FFT module the function func butterfly and lines 34-36 introduce the function entry, both of them had their implementation ommited. We should notice, in line 34, the call to the function that, to obtain a pointer, named fft, to an object of type FFT that reached this join point.

4.4 Separation of Control and Data Stream This example is based on implementations of main the Fast Fourier Transform (FFT) available in the SystemC example Wrapper files. The goal of the original implementations was to provide two different FFT implementations, one for integers and one Sink FFT Source for reals. To achieve this goal, the implementation was divided into two directories that shared Figure 2: Structure of the same set of files. the FFT implementation However, we noticed that each one of this files only varied according to the FFT that should be performed. In that case, the FFT concern crosscuts all the SystemC modules. The difference between both versions was restricted to the data path of the modules, but the signals/ports related to the control were identical. This

122

With the approach presented here, the code related to the FFT implementation that was scattered through all the system became well localized, being represented by the aspect FXPT, without affecting the rest of the system anymore. This approach also presented a good way to separate the control and data stream.

Table 1: Performance analysis of the applications with and without AOP Example Cycles w/o AOP w/ AOP Integer FFT 450 0.172s 0.184s OCP Comm. 1000000 1.460s 1.495s FIFO Cache 300000 298.672s 300.280s

4.5 Communication We have also used AOP successfully to realize the communication between modules using the Open Core Protocol (OCP) [OCP 2003], modelling the communication protocol as an aspect. The aspect contains the variables and the methods implementing the communication protocol. This strategy allows to implement a low level communication solution, using ports and signals instead of channels and interfaces, while keeping a good separation of concerns. Using this approach, the code related to the communication can be cleanly encapsulated in a single unit instead of being mixed with the code related to the basic functionalities of the modules. The modules also become more reusable and easier to understand and to maintain, because their code and the code related to the communication are separated now, enabling the reuse of the same modules in a different context without having to change them.

5.

as description language and AspectC++ as implementation of AOP, resulting in a functional SystemC design environment supporting AOP. As demonstrated by the examples, that were successfully implemented and dealt with important aspects such as collection of metrics, cache replacement policy and communication, AOP shall be seriously considered by hardware and integrated systems engineers as an effective tool to improve the quality of their processes and products. We have indeed shown that the new encapsulation mechanisms that AOP offers could benefit both the design activities and the design artefacts. AOP can also be used in conjunction with other technologies that have shown successful in the realm of software development and are currently being adapted to the hardware design area. One example of this are the design patterns [Gamma et al. 1995], which have been recently applied in the hardware design area [Rincon et al. 2005, Damasevicius et al. 2003], and can gain from a combination with AOP [Garcia et al. 2005]. As future work we intend to investigate the use and reuse of aspects to model other features in hardware, such as security, codification (high-endian vs. low-endian) and we also plan to provide mechanisms that (at least partly) automate the codification of aspects in SystemC, such as metrics collection, by extracting information from SytemC code using, e.g. the Pinapa tool [Moy et al. 2005]. We also plan to measure the impact of the use of aspect-oriented features once the design is synthesized to lower levels of abstractions (such as register-transfer and gate levels).

PERFORMANCE ANALYSIS

For integrated circuits and systems designers, one decisive factor to adopt a new technology is its impact in the simulation time. To analyse the impact of the AOP in the simulation time of the SystemC applications, we measured the mean simulation time of some of the previous applications: • the FFT application for integers, described in Section 4.4; • the communication application using the OCP protocol, described in Section 4.5;

7. REFERENCES

• the cache replacement policy of the processor GPOP (the FIFO policy will be considered here), Section 4.2.

Al-Zoubi, H., Milenkovic, A., and Milenkovic, M. (2004). Performance evaluation of cache replacement policies for the SPEC CPU2000 benchmark suite. In Proceedings of the 42nd annual Southeast regional conference, pages 267–272. ACM Press. Borrione, D., Piloty, R., Hill, D., Lieberherr, K. J., and Moorby, P. (1992). Three Decades of HDLs: Part II, Conlan Through Verilog. IEEE Design & Test, 9(3). Brunel, J.-Y., Natale, M. D., Ferrari, A., Giusto, P., and Lavagno, L. (2004). Softcontract: an Assertion-Based Software Development Process that Enables Design-by-Contract. In DATE ’04: Proceedings of the conference on Design, automation and test in Europe, page 10358. IEEE Computer Society. Chu, Y., Dietmeyer, D. L., Duley, J. R., Hill, F. J., Barbacci, M. R., Rose, C. W., Ordy, G., Johnson, B., and Roberts, M. (1992). Three Decades of HDLs: Part I, CDL Through TI-HDL. IEEE Design & Test, 9(2). Czarnecki, K. and Eisenecker, U. (2000). Generative Programming: Methods, Tools and Applications. Addison-Wesley Professional. Damasevicius, R., Majauskas, G., and Stuikys, V. (2003). Application of design patterns for hardware

Before presenting and analysing the results, we should observe that the impact of the AOP approach in the simulation time depends of the amount of joinpoint information accessed by the advice code and of the inlining capabilities of the backend compiler. Table 1 contains the mean simulation time of each application. We notice that the penalty of using AOP is barely noticeable; actually, the difference is smaller than the error margin of the measurement tool we employed (the UNIX command time). Our conclusion is that the impact of the AOP in the simulation time is not meaningful and is not a factor that should hinder its use in the scope described in this paper. In the same way, we measured the size of the SystemC executable file generated by AspectC++, and we could notice that AOP does not have a significant impact on the size of the executable file.

6.

CONCLUSIONS

Based on historical reasons and in the foreseeable benefits, we applied AOP in the context of the development of hardware and hardware/software systems, employing SystemC

123

design. In DAC ’03: Proceedings of the 40th conference on Design automation, pages 48–53. ACM Press. Dijkstra, E. W. (1976). A Discipline of Programming. Prentice Hall. Diotalevi, F. (2004). Contract enforcement with AOP. http://www-128.ibm.com/developerworks/library/jceaop/. Page visited on March 2006. Elrad, T., Filman, R. E., and Bader, A. (2001). Aspect-oriented programming: Introduction. Communications of the ACM, 44(10). Gamma, E., Helm, R., Johnson, R., and Vlissides, J. (1995). Design patterns: elements of reusable object-oriented software. Addison-Wesley Longman Publishing Co., Inc. Garcia, A., Sant’Anna, C., Figueiredo, E., Kulesza, U., Lucena, C., and von Staa, A. (2005). Modularizing design patterns with aspects: a quantitative study. In AOSD ’05: Proceedings of the 4th international conference on Aspect-oriented software development, pages 3–14. ACM Press. Jakacki, G. (2003). Aspect-oriented techniques for extraction of communication models from systemc designs. In Proceedings of the 5th International Conference on ASIC, pages 262–265. IEEE Computer Society. Jantsch, A. and Tenhunen, H., editors (2003). Networks on chip. Kluwer Academic Publishers. Jeda (2005). Jeda Technologies. Available at http://www.jedatechnologies.net. Page visited on March 2006. Kiczales, G., Lamping, J., Mendhekar, A., Maeada, C., Videira, C., Loingtier, J., and Irwin, J. (1997). Aspect-Oriented Programming. In Proceedings of the European Conference on Object-Oriented Programming, number 1241 in LNCS. Springer-Verlag. Meyer, B. (2000). Object-Oriented Software Construction. Prentice Hall PTR.

Moy, M., Maraninchi, F., and Maillet-Contoz, L. (2005). Pinapa: an extraction tool for systemc descriptions of systems-on-a-chip. In EMSOFT ’05: Proceedings of the 5th ACM international conference on Embedded software, pages 317–324. ACM Press. OCP (2003). Open Core Protocol Specification. OCP-IP Association. Panda, P. R. (2001). Systemc: a modeling platform supporting multiple design abstractions. In ISSS ’01: Proceedings of the 14th international symposium on Systems synthesis, pages 75–80. ACM Press. Rincon, F., Moya, F., Barba, J., and Lopez, J. C. (2005). Model Reuse through Hardware Design Patterns. In DATE ’05, pages 324–329. IEEE Computer Society. Spinczyk, O., Gal, A., and Schr¨ oder-Preikschat, W. (2002). AspectC++: an aspect-oriented extension to the C++ programming language. In Proceedings of the 40th International Confernece on Tools Pacific, pages 53–60. Australian Computer Society. Thekkath, C. A., Levy, H. M., and Lazowska, E. D. (1994). Separating data and control transfer in distributed operating systems. SIGPLAN Not., 29(11):2–11. Vachharajani, M., Vachharajani, N., and August, D. I. (2004). The liberty structural specification language: a high-level modeling language for component reuse. In PLDI ’04: Proceedings of the ACM SIGPLAN 2004, pages 195–206. ACM Press. Yan Chen, Weidong Qiu, B. Z. and Peng, C. (2004). An automatic test coverage analysis for systemc description using aspect-oriented programming. In The 8th International Conference on Computer Supported Cooperative Work in Design Proceedings, pages 632–636. IEEE Computer Society.

124