VCS Built-in TLI connectivity for UVM to SystemC TLM 2.0
Posted by vikasg on September 20th, 2012
Vikas Grover | Sr. Manager, Central Verification | AMD-India
One of the challenges faced in SOC verification is to validate the designs in mixed language and mixed abstraction level. SystemC is widely used language to define the system model at higher level of abstraction. SystemC is an IEEE standard language for System Level modeling and it is rich with constructs for describing models at various levels of abstraction i.e. Untimed, Timed, Transaction Level, Cycle Accurate, and RTL. The transaction level model simulates much faster than RTL model, besides OSCI defined the TLM 2.0 interface standard for SystemC which enables SystemC model interoperability and reuse at transaction level.
On the other side, SystemVerilog is a unified language for design and verification. It is effective for designing advance testbenches for both RTL and Transaction level models, since it has features like constraint randomization for stimulus generation, functional coverage, assertions, object oriented constructs(like class,inheritance etc). Early availability of standard methodologies (providing framework and testbench coding guidelines for resue) like VMM, OVM, UVM enabled wide adoption for System Verilog in industry. The UVM 1.0 Base Class Library which was released on Feb 2011 includes OSCI TLM 2.0 socket interface to enable interoperability for UVM with SystemC . Essentially it allows UVM testbench to include SystemC TLM 2.0 reference models. The UVM testbench can pass (or receive) transactions from SystemC models. The transaction passed across System Verilog ßàSystemC could be TLM 2.0 generic payload OR uvm_sequence_item. The implementation of UVM to SC TLM 2.0 communication is vendor dependent.
Starting with with the 2011.03 release, VCS provides a new TLI adaptor which enables UVM TLM 2.0 sockets to communicate with SC TLM 2.0 based environment to pass transactions across language domains. You can also check out a couple of earlier post from John Aynsley, (VMM-to-SystemC Communication Using the TLI and Blocking and Non-blocking Communication Using the TLI) on SV-SystemC communication using TLI. In this Blog, I am going to describe VCS TLI connectivity mechanism between UVM and SystemC. There are other advance TLI features in VCS ( like direct access of data, invoking task/functions across SV and SC language), message unification across UVM-SC, transaction debug techniques, extending TLI adaptor for user defined interface other than VMM/UVM/TLM2.0 which can be written about on later.
With the support for TLM2.0 interfaces in both UVM and VMM, the importance of OSCI TLM2.0 across both SystemC and SystemVerilog is now apparent. UVM provides the following TLM2.0 socket interfaces (for both blocking and non-blocking communication)
SystemC TLM2.0 consists of following TLM 2.0 interface
The Built-in TLI adaptor solution for VCS is a general purpose solution to simplify the transaction passing across UVM and SystemC as shown below. The transactions can be TLM 2.0 generic payload OR uvm_sequence_item object. The UVM 1.0 does have the TLM 2.0 generic payload class as well.
The Built-in TLI adaptor is available as a pre-compiled library with VCS. The user would need to follow two simple steps to include the TLI adaptor in his/her verification environment.
- Include a header file in System Verilog and SystemC code. The System Verilog header file provides a package which implements the bind function parameterized on uvm_sequence_item object.
- Invoke the bind function on System Verilog and SystemC side to connect each socket across language. The bind function has a string argument which must be unique for each socket connection across System Verilog and SystemC.
The code snippet for above steps is shown below. The TLI adaptor code is highlighted in orange/blue color. The UVM Initiator “initiator_udf” from System Verilog is driving SystemC Target “ target_udf” using the TLM blocking socket.
The TLI adaptor bind function uses the unique string “str_udf_pkt” to identify the socket connectivity across SystemVerilog and SystemC domain. For multiple sockets, the user needs to invoke the TLI bind function once for each socket. The TLI adaptor supports both blocking and non-blocking transport interfaces for sockets to communicate across System Verilog and SystemC.
Thus, the Built-in UVM-SC TLI adaptor capability of VCS ensures that SystemC can be connected seamlessly in UVM based verification environment.