|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SystemC Mixed-HDL IP Reuse MethodologyRudra Mukherjee, Gaurav Kumar Verma, Arnab Saha Abstract Due to increased complexity in today's embedded system designs, the importance of design reuse, verification, and debug becomes inescapable. Also, current mixed-language methodologies are not efficient enough to address the verification needs of today's competitive market, which is seeing more and more of these types of design. There is an urgent need to have an efficient SystemC-HDL cross-language methodology that breaks the language barriers and tightly integrates the different standards as one. This methodology will help designers reduce their verification process by using verification IP that is developed using a rich set of verification features and methodologies across multiple languages.This paper proposes a methodology which addresses the clear needs of the ever-growing SystemC mixedlanguage designs by delivering critical capabilities, including advanced verification features such as; SystemVerilog Assertions (SVA), cover-groups, SystemC Verification (SCV), and more. Potential reusability issues are highlighted which require a careful mixed-language design process and planning. I. INTRODUCTION SystemC[1], SystemVerilog[2], and VHDL[3] have unique strengths which make them more suitable to certain application domains. SystemC mixed-language designs are proliferating because designers want to use the powerful features of SystemC for creating test benches for designs written in SystemVerilog or VHDL and because designers are importing VHDL or SystemVerilog intellectual property libraries to use with their SystemC designs. Designers may also wish to use the powerful verification features of SystemVerilog to create test bench for their designs written in SystemC. Either can be achieved by directly instantiating a SystemC module in VHDL or SystemVerilog, or vice versa. This paper proposes a methodology which addresses the clear needs of SystemC mixed-language designs by delivering critical capabilities, including advanced verification features such as; SystemVerilog Assertions (SVA), cover-groups, SystemC Verification (SCV), and more. The proposed SystemC–HDL mixed-language design reuse techniques provide a bridge to formal verification and the ability to apply assertions across multiple design languages. This paper explains in detail how the proposed solution can be used to facilitate accurate and efficient use of designs (with ports of type record/struct, class, union, enum, multi-d array, and others) across the language boundaries. Potential reusability issues are highlighted which require a careful mixed-language design process and planning. Critical issues have been discussed, such as type checks, and state mapping while making direct port connections at the SystemC mixed-language boundary. II. SYSTEMVERILOG AND SYSTEMC The most important languages to emerge for advanced design, verification, and modeling are IEEE Std 1800 SystemVerilog with its advanced verification, modeling, and hardware design capabilities, and IEEE Std 1666 SystemC, with its powerful modeling features and tight links to the C/C++ programming languages. The challenge faced by many SoC teams is how to use these languages together for mixed-language, mixedabstraction level verification. We will discuss using these two very capable languages for verification, system simulation, behavioral high-level synthesis, RTL design, and modeling. SystemVerilog-SystemC Design Methodology The proposed SV-SC design methodology not only overcomes various limitations of current mixed-language design methodologies but also extends the scope of IP integration and reuse. To achieve substantial productivity gains in current and future mixed-language design projects the designers and mixed-language EDA tools should
Types of SV-SC Reusability A. Data Types With the introduction of new SystemVerilog (SV) data types, designers will be able to directly use the equivalent SystemC object model for SystemVerilog data types defined in packages, facilitated by the mixedlanguage design tools. Compatible SystemVerilog data types can be imported to define SystemC variables and constants. Example: SystemVerilog data type import SystemVerilog Package package ethernet_ip_pack;typedef struct { bit [0:61] preamble; bit [0:47] dest_addr; bit [0:47] src_addr; bit [0:15] frame_type; bit [0:367] data; bit [0:31] crc; } ethernet_frame; endpackage SystemC Module SC_IMPORT(ethernet_ip_pack); //Data-Types imported from SVethernet_frame frame; Tables 1 and 2 show compatible data types in SV and SystemC to assist designers and mixed-language design EDA tools relate cross-HDL data types. Table 1: SV-SC Compatible Data Types
Conversely, designers will be able to directly use the equivalent SystemVerilog object model for SystemC data types defined in header files, facilitated by the mixed-language design tools. Compatible SystemC data types can be imported to define SystemVerilog variables and constants. Example: SystemC data type import SystemC header file (sc_pack.h) typedef struct {sc_bv<62> preamble; sc_bv<48> dest_addr; sc_bv<48> src_addr; sc_bv<16> frame_type; sc_bv<368> data; sc_bv<32> crc; } ethernet_frame; typedef enum { IDLE, SEND, RECEIVE, FAILED } states; SystemVerilog Module import sc_ethernet_ip::*; //Data Type imported from SCinput ethernet_frame in1; Table 2: SC-SV Compatible Data Types
* SystemC array of signals have no direct equivalent type in SystemVerilog. They, however, have a very close similarity with multi-d vectors. As such, SystemC signal arrays can be connected to compatible SystemVerilog multi-d vectors. A SystemC signal array of ‘N’ signals is compatible with a SystemVerilog unpacked array of size ‘N’. The packed dimension of the SystemVerilog array is one of the compatible types of the signal of SystemC signal array. Example: Using SystemC Signal Array SystemC Signal Array SC_MODULE(cpu) {sc_in<sc_bv<32> > sig1[16]; … }; Instantiating CPU in SystemVerilog typedef bit[0:31] mdarray[0:15];marray sv_sig1; cpu_inst cpu(.sig1(sv_sig1), …); In SystemVerilog, an enum can be defined with any base type, but SystemC allows only enums to have a base type of int (32-bit, 2-state integer). As such, a SystemVerilog enum may be used at the SC-SV mixed-language boundary only if its base type is int. Such compatible enums may be defined inside an SV package, or SystemC header file, which can be imported and used in the other language. Example: Importing SV enum type SystemVerilog Package package sv_pack;typedef enum{ idle, state1, state2, state3, state4 } state_t; endpackage SystemC Module SC_IMPORT(sv_pack);//Data-Types imported from SV SC_MODULE(sc_inst) { sc_in<state_t> state; … }; B. Classes Support for classes at the SystemC-SystemVerilog mixed-language boundary allows coupling at a higher level of abstraction. This enables complex cross-HDL components to work together seamlessly, obviating any extra piece of code required to map SystemC, complex aggregate types to SystemVerilog scalar data types at interfaces. It also helps designers to partition complex designs at any logical boundary that makes best use of both languages. Classes can form the basis for mixed-language transaction-level modeling. A class can represent a transactor with its methods transactions. The objectoriented features of classes are ideal for modeling at this level of abstraction. Support for mixed-language classes enables development of IP using the class based methodology. A class may be defined inside a SystemVerilog package which can be imported by a SystemC module. Conversely, a class can be defined inside a SystemC header file which can be imported like a normal SV package by a SV module. Since all SystemC class declarations must precisely correlate with classes declared in the SystemVerilog domain, a SystemC class must not use constructs that are not available in SystemVerilog. For example, SystemC classes with overloaded functions will not be allowed at the mixed-language boundary, as function overloading is not allowed in SystemVerilog. Table 3 shows compatible class constructs in SV and SystemC to assist designers and mixed-language design EDA tools relate cross-HDL data types. Table 3: Corresponding Class Constructs
Some SystemC class constructs (such as multiple inheritance, friend declarations, and copy constructors) do not have equivalent constructs in SystemVerilog and, hence, may not be allowed for classes crossing the language boundary. Member functions and tasks of classes are handled the same way as normal functions and tasks, as described in section F. Example: Using classes in mixed-language TLM SystemVerilog Package package pci_ip_pack;class pci_master; … task pci_master_write( input bit [31:0] data, input bit [31:0] address, input bit [4:0] enable); task pci_master_read(…); … endclass endpackage SystemC Module SC_IMPORT(pci_ip_pack);pci_master pci = new pci_master(…); pci.pci_master_write(…); Example: Importing SV class type SystemVerilog Package package sv_pack is class C; … endclass end sv_pack; SystemC Module SC_IMPORT(sv_pack);SC_MODULE(sc_inst) { sc_in<C> C_obj; … }; C. Events The equivalent of an event in SystemVerilog is sc_event in SystemC. An event passed across the SystemCSystemVerilog interface follows the same semantics as used for passing regular data types. Passing an event leads to creation of an event in the other language. These two events point to the same underlying synchronization object, so triggering one will trigger its counterpart. As described in the SV LRM, assigning an SV event to the special value of NULL or to another event will break the link with the SystemC event. Figure 1 illustrates the behavior of the new event created at the mixed-language boundary. Figure 1: Events at the SC-SV language boundary
Example: Using events at SC-SV language boundary //Consumer is connected to the producer via an//event. Consumer triggers an event every time //it is ready to consume a packet. This event //triggers the event in the producer to //dispatch a packet to the consumer. SystemVerilog Module module producer(input send_pkt, …); SystemC Testbench SC_MODULE(consumer) {sc_event ready_event; prod_inst = new producer(“prod_inst”); prod_inst->send_pkt(ready_event); … }; D. Functions and Tasks Functions declared in SystemC header files will be available for use directly in the SystemVerilog module. Similarly, a function/task defined inside a SystemVerilog package will be available in the SystemC module. The arguments of these functions and tasks will follow the same type compatibility/mapping conventions as followed by ports at the mixed-language boundary. Example: SC function import SystemC header file, sc_pack.h int addInt(int a, int b) {return a + b; } SystemVerilog module import sc_pack::*module(…) int a, b, sum; … sum = addInt(a, b); E. Overloaded Operators Both SystemC and SystemVerilog allow operator overloading. The need for operator overloading arises from the fact that the operators in the language are defined only for operands of some predefined type. Operator overloading can be used in conjunction with data-type import to allow the defined arithmetic operators to be applied to the imported data types, such as structures, unions, classes, and enumerations. Example: SystemC Overloaded Operators Import SystemVerilog bind == function ethernet_frame comp_frames(ethernet_frame, ethernet_frame); SC Module SC_IMPORT(ethernet_ip_pack);ethernet_frame frame1, frame2; … // implicit call to overloaded SV “==” operator if (frame1 == frame2) ... III. VHDL AND SYSTEMC Pre-defined language environments in the form of packages are available with all VHDL implementations. Standard IEEE packages provide rich sets of data types and subprogram definitions that are heavily used across various VHDL design units. To reuse any subprogram or data type at the mixed-language boundary requires direct translation of VHDL packages by SystemC designers because there is not a reuse facility available in either the SystemC language standard or the supporting tools. The close similarity of SystemC with C++ and the inbuilt flexibility of header files offer a unique opportunity for VHDL designers to import VHDL packages into the SystemC domain. SystemC includes statements that provide direct visibility of VHDL packages in the SystemC domain. SC_IMPORT(vhdl_pack);SC_IMPORT(std_logic_1164); Reusing VHDL packages in the SystemC domain requires direct import of all user and pre-defined data types, functions/subprograms, resolution functions, overloaded operators and functions, constants, and enumeration literals. Tables 4 and 5 show compatible data types in VHDL and SystemC to assist designers and mixed-language design EDA tools relate cross-HDL data types. Table 4: VHDL-SC Compatible Data Types
Table 5: SC-VHDL Compatible Data Types
* SystemC array of signals have no direct equivalent type in VHDL. They, however, have a very close similarity with VHDL multidimensional arrays. As such, SystemC signal arrays can be connected to compatible VHDL multi-d arrays. A SystemC signal array will be compatible with an array of size ‘N’ of the VHDL type compatible with the element of the SystemC signal array. Example: SC signal array at SC-VHDL boundary SystemC Signal Array SC_MODULE(cpu) {sc_in<sc_bv<32> > data_bus[16]; … }; Instantiating cpu in VHDL type data_arr is array (0 to 15) ofbit_vector(0 to 31); signal vh_data_bus : data_arr; cpu_inst cpu(data_bus => vh_data_bus, …); VHDL Procedures and Overloaded Functions Import VHDL provides subprogram facilities in the form of both procedures and functions. SystemC extends all the functionality of C++ when it comes to support for functions. This allows reuse of VHDL procedures and functions in an efficient and intuitive manner. While calling VHDL subprograms with complex argument types from the SC side, VHDL equivalent SC data types can be specified as actual argument types to any of the argument types. To facilitate the use of output and inout ports in VHDL subprograms, these arguments must be passed by reference when the function is used in SystemC.
VHDL Package package vhdl_pack is-- VHDL procedure declaration procedure word_32_or (driver1, driver2 : in word_32; en: in bit := '0'; or_out : out bit ); end vhdl_pack; SC Module SC_IMPORT(vhdl_pack);... void module_func() { // function interface for VHDL subprogram call. word_32_or(data1, data2, 1, &sum_or); end Both SystemC and VHDL allow overloaded functions. With package import it is possible to reuse VHDL overloaded functions in the mixed-language domain. IV. EXTENDING SV ASSERTIONS TO SYSTEMC SystemVerilog offers a rich set of testbench automation capabilities, native assertions, and functional coverage. These features make SystemVerilog increasingly appealing to users who need to implement an efficient and effective functional verification methodology. These unique feature sets can be extended to SystemC using the SystemVerilog bind construct. Assertions can be included directly in the source code of the modules in which they apply. They can even be embedded in procedural code. Alternatively, verification code can be written in a separate program block and that program block can then be bound to a specific module or module instance. The SystemVerilog bind construct provides modules and program blocks access to both external ports and internal signals in the bound SystemC object. Among other things, this capability can be used to monitor SystemC functionality with SystemVerilog Assertions (SVA) or assess the functional coverage of SystemC designs. Suppose the user wants to use SVA to monitor a SystemC module. To do this effectively, he or she will need SVA to access the module’s ports and internal signals without modifying the SystemC code. The procedure for binding SystemVerilog and SystemC includes: A. Creating a SystemVerilog program or module to hold the verification code. B. Developing a wrapper module or program block to bind the SystemVerilog code to the SystemC module. C. Automatically loading multiple top-level modules into the simulator or instantiating the SystemVerilog bind wrapper. For example, let’s take the following SystemC code: SC_MODULE(cpu) {sc_in<sc_logic> clock; sc_in<sc_logic> flag; sc_signal<sc_logic> data; ... } Definition of the properties to be monitored using a SystemVerilog program: program cpu_props(input d,e,f);… assert property(@(posedge d) e |-> ##[1:2] f ); … endprogram // A SystemVerilog module can also be // used in a similar way Tying SVA to the SC module using a wrapper module: module sva_wrapper;bind cpu // Bind to all occurrences of cpu cpu_props cpu_sva_bind // Bind cpu_props to cpu // and call this instantiation cpu_sva_bind (.d(clock),.e(flag),.f(data)); // Connect the // SV ports to SystemC ports and to the // internal signals endmodule This wrapper module can then be either instantiated or loaded together with the top-level design unit in the simulator to enable actual binding in the simulator. The SystemVerilog bind construct may also be used to extend the critical capabilities offered by including advanced verification features to SystemVerilog. To facilitate the use of these features in SystemVerilog modules, a similar SystemVerilog module may be created as described earlier in this section. V. OBSCURE PORT CONNECTIONS As is evident from the difference in the way SystemC, SystemVerilog, and VHDL are modeled, there will be some types in these languages which do not have any equivalent type in another language. We call these obscure types, since the other language will not be able to see through them at the mixed-language boundary. For the purpose of the second language, these types are treated as a black box. Type-checking is stopped for obscure types at the language boundary and the use model of these types is restricted to propagating connections through the design hierarchy. Consider a case where a SV design unit wishes to pass an incompatible class object down the design-hierarchy to leaf-level SV instances. If there are any intermediate SystemC models through which the object must pass, they may have no need to interact with that object, but they will have a responsibility to pass it through the hierarchy to their children with its full semantic meaning and integrity intact. Obscure type connections can be used to facilitate such propagation of incompatible objects in the design-hierarchy. As an example of the use-model of obscure connections, consider the SystemC-SystemVerilog hierarchy in Figure 2. Figure 2: Using Obscure Port Connections at the SC-SV Boundary
Signal S1 of an unsupported SystemC type is passed to the SystemC instance through an obscure port connection. SC_MOD1 further passes this signal through an obscure port connection to the SystemVerilog module SV_MOD2 and to another SystemC module instance, SC_MOD_2. SV_MOD2 uses this signal in a process and returns another signal, S6, of an unsupported SystemC type back to the testbench. SC_MOD2 further passes S1 to the instantiated SystemVerilog module SV_MOD3. Process PR7 in SC_MOD3 uses this signal and drives signal S3 of some incompatible SystemVerilog type to the testbench through the SystemC hierarchy using obscure port connections. There is an intrinsic support for obscure types in SystemC in the form of void handles. As such, design hierarchies containing sandwiched SystemC modules can be supported without significant changes in the language. However, for a more general solution, if language A wishes to pass an incompatible type through a design hierarchy consisting of language B, language B must have support for obscure types and define the connection rules. As such, obscure types will need to be formally defined as an extension to each language. VI. CONCLUSION The productivity of complex hardware system design directly depends on reusable components. The reusability of mixed-language IP is crucial in coping with the challenges in ASIC and FPGA domains. The advent of SystemVerilog, with its rich set of design constructs, forces existing mixed-language design methodologies to be revamped. The methodology presented in this paper defines a new approach that allows seamless communication between mixed-HDLs at various levels of abstraction. Extending the type of reusability HDL packages across the languages and raising the abstraction level during component reuse results in complex mixed-language designs that are far better and more efficient than single HDL designs. The idea can be realized to take advantage of unique SystemC verification and modeling features without rewriting the functionality available with legacy VHDL packages and IP. VII. REFERENCES [1] SystemC LRM IEEE 1666-2005 [2] SystemVerilog LRM IEEE 1800-2005 [4] Rudra Mukherjee et al, “SystemVerilog-VHDL Mixed Design Reuse Methodology”, DVCon 2006 [5] Arnab Saha et al, “Inter Language Function Calls Between SystemC and SystemVerilog”, DVCon 2007
|
Home | Feedback | Register | Site Map |
All material on this site Copyright © 2017 Design And Reuse S.A. All rights reserved. |