How to connect your SystemC Reference Models to your verification VMM based framework
Posted by Shankar Hemmady on August 17th, 2009
Nasib Naser, Phd, CAE, Synopsys
In this blog I will discuss the Use Model demonstrated in Figure 1 where a VMM layered testbench is used to verify an RTL DUT against a SystemC transaction level model. SystemVerilog allows for the creation of a reusable layered testbench architectures. The VMM methodology provides the basis for such a layered architecture. With a layered approach, transaction-level reference models can be easily integrated at the appropriate level to provide self-checking functions. In this Use Model the VMM Function layer is communicating with SystemC model using the TLI mechanism to perform read/write transactions, and using the same testbench scenarios the VMM command layer is driving the DUT at pin level.
Figure 1 – VMM driving TLM and RTL with checking
Synopsys’ VCS functional verification solution addresses the challenge of this use model with its SystemC-SystemVerilog Transaction-Level Interface (TLI). Using TLI SystemC interface methods can be invoked in SystemVerilog and vice versa. The **value add** for using TLI is that the SystemVerilog DPI based communication code that synchronizes both domains is automatically generated.
Let’s take a look at the various code components in SystemC and SystemVerilog based on the VMM methodology that enables such a verification use model. In the following example we define the read and write transactions as SC Interface methods.
class Buf_if: virtual public sc_interface {
public:// do the pure virtual function read()/write() declarations here
virtual void read(unsigned int addr, unsigned int* data) = 0;virtual void write(unsigned int addr, unsigned int data) = 0;
};
Following code shows VMM Transactor invoking SystemC transactions read and write at function layer. VMM transactor tb_mast is communicating to SystemC TLM using vmm channel tb_mast_out_ch1 and with the RTL model using the vmm channel tb_mast_out_ch2 channel, as shown in the following code:
class tb_master extends vmm_xactor;
virtual tb_if.master ifc;
tb_data_channel tb_master_in_ch;
tb_data_channel
tb_master_out_ch1;
tb_data_channel
tb_master_out_ch2;
…
extern virtual task main();
endclass: tb_mastertask tb_master::main();
tb_data tr, tr_out;
super.main();
forever begin
...
// Send the Instruction to SC Reference Model
tb_master_out_ch2.put(tr_out);
// Send the Instruction to RTL
tb_mast_out_ch1.put(tr_out);
end
endtask: main
The following code shows VMM reference Transactors calling the SystemC transaction functions via the adaptor alu_tl_if_adpt_vlog which was automatically generated by VCS TLI.
class tb_ref extends vmm_xactor;
tb_data_channel tb_ref_in_ch;
alu_tl_if_adpt_vlog alu_tl_if_adpt_vlog_inst0;
extern function new (string instance,
integer stream_id = -1,tb_data_channel tb_ref_in_ch = null);
extern virtual task main();
endclass: tb_ref
task tb_ref::main();
super.main();
forever begin
…
case(tr_out.tb_data_type)
SA_SB_OP_GO : begin
alu_tl_if_adpt_vlog_inst0.write(addrA,a);
alu_tl_if_adpt_vlog_inst0.write(addrB,b);
alu_tl_if_adpt_vlog_inst0.write(addrOP,op);
alu_tl_if_adpt_vlog_inst0.read(addrOut,d);
tr_out.data_out = d;
end
…
endcase…
end
endtask
This VCS TLI use model provides a complete and easy way to integrating blocking and non-blocking SystemC reference models into a VMM based multi-layer verification environment.








