0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemC TLM中的接口

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-02 15:54 次阅读

SystemC TLM中的接口

在SystemC TLM中,接口是一个C++的抽象类。抽象类中的所有方法都是用“=0”标识表示的纯虚函数。C++不允许创建抽象类的对象,因为抽象类对象是没有意义的。 在SystemC中,sc_interface是所有接口的基类,任何一个接口必须直接或间接继承sc_interface。

此外,接口不包含任何数据成员。下面是一个接口实例,首先定义一个存储器读接口mem_read_if,然后定义一个存储器写接口mem_write_if,接着定义一个存储器的复位接口reset_if,最后利用这3个接口定义随机存取存储器的接口ram_if:

# ifndef _MEM_IF_H
# define _MEM_IF_H
# include “systemc.h”
enum transfer_status {TRANSFER_OK=0, TRANSFER_ERROR}; template < class T >
class mem_read_if : public sc_interface
{
      public:
      virtual transfer_status read (unsigned int address, T& data)=0;
      // 定义存储器读的方法
};
template < class T >
class mem_write_if : public sc_interface
{
      public:
      virtual transfer_status write (unsigned int address, T& data)=0;
      // 定义存储器写的方法
};
class reset_if : public sc_interface
{
      public:
      virtual bool reset ( )=0; // 定义存储器复位的方法
};
template < class T >
class ram_if : public mem_write_if < T >, mem_read_if < T >, reset_if
{
public:
      virtual unsigned int start_address ( ) const=0; //定义获取存储器首地址的方法
      virtual unsigned int end_address ( ) const=0; //定义获取存储器终止地址的方法
};
#endif

从上面的存储器接口的定义可以看出,接口是可以分层的,复杂的接口可以由多个简单的接口继承而得到。

SystemC TLM中的通道

从接口的定义可以看出,在SystemC中的接口仅仅定义了一组通信方法,并不包含这些方法的具体实现。为了实现这些方法,使建模的模块具有实用的功能,SystemC中针对事务级建模引入了通道的概念。

通道是接口方法的具体实现,通过继承一个或多个接口实现模型的具体功能。针对上述存储器接口ram_if,其通道的定义如下:

#ifndef _RAM_H
#define _RAM_H
#include "systemc.h"
#include "mem_if.h"
template < class T >
class ram : public sc_module, ram < T >
{
      public:
      ram (sc_module_name name, unsigned int start_address, unsigned int end_address)
              : sc_module (name)
              , m_start_address (start_address)
              , m_end_address (end_address){
              sc_assert (end_address >=start_address);
              mem=new T[end_address -start_address];
} //构造函数ram ( ) {
    if (mem) {delete mem; mem=0}
} //析构函数
transfer_status read (unsigned address, T& data)
{
    if (address < m_start_address || address > m_end_address) {
        data=0;
        return TRANSFER_ERROR;
}
data=mem [address -start_address];
return TRANSFER_OK;
}
transfer_status write (unsigned address, T& data)
{
    if (address < m_start_address || address > m_end_address) {
        return TRANSFER_ERROR; }
    mem [address -m_start_address]=data;
    return TRANSFER_OK;
}
bool reset( ) {...}
inline unsigned int start_address ( ) const {...}
inline unsigned int end_address ( ) const {...}
private:
    T* mem;
    unsigned int m_start_address, m_end_address
};
#endif

SystemC TLM中的端口

在SystemC中,端口与特定的通道接口相连。进程通过特定的端口调用通道的接口提供的方法。对于(1)中提出的基本端口类型sc_in、sc_out以及sc_inout,可以调用的接口方法仅有write ( )和read ( ),但对于事务级建模,这些端口已经不能够满足需求。比如,当端口与总线接口或存储器接口相连时,需要同时提供地址和数据,事务级模型需要执行与数据读写无关的一些操作如复位操作等。

在SystemC中,一个端口可以同时连接到一个或多个实现了同一接口的通道之上。端口的定义如下:

sc_port < Interface Type, ChannelNumber=1 >

Interface Type是端口所要连接的通道的接口类型。ChannelNumber代表端口所要连接的最大通道数,默认值是1。对于上面定义的的接口ram_if,下面的端口定义都是合法的:

sc_port < ram_if > ram_port1; //连接到一个RAM上
sc_port < ram_if, N > ram_portN; //连接到N个RAM上

根据上述存储器接口ram_if及相应通道的定义,可以定义一个模块Component通过端口对其进行访问,如下:

SC_MODULE (Component) {
   sc_in_clk clk;
   sc_port < ram_if < int > > ram_port; // 实例化端口
   void action ( );
   int data;
   unsigned int address;
   SC_CTOR ( ) {
   SC_METHOD (action, clk.pos( ));
}
};
void Component :: action ( ){
   wait ( );
   int i=0;
   while (i++< 100) {
      address=0;
      if (transfer_status status=ram_port - > write (address, data)) {
      // 通过端口ram_port调用存储器写方法
      cout < < "Write RAM successfully" < < endl;
}
else cout < < "Write RAM fail" < < endl;
if (transfer_status status=ram_port - > read (address, data)) {
// 通过端口ram_port调用存储器读方法
      cout < < "Read RAM successfully" < < endl;
}
  else cout < < "Read RAM fail" <
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8497

    浏览量

    150835
  • ESL
    ESL
    +关注

    关注

    1

    文章

    74

    浏览量

    21329
  • systemc
    +关注

    关注

    2

    文章

    25

    浏览量

    14547
  • TLM
    TLM
    +关注

    关注

    1

    文章

    32

    浏览量

    24734
收藏 人收藏

    评论

    相关推荐

    全面的SystemC TLM驱动式IP设计与验证解决方案

    用于早期软件开发和调试的虚拟平台可能包含由SystemC TLM模型组成的子系统。得益于它们的快速执行,为创建硬件设计而开发的模型也可用来加速软件设计。
    的头像 发表于 09-05 12:23 5284次阅读
    全面的<b class='flag-5'>SystemC</b> <b class='flag-5'>TLM</b>驱动式IP设计与验证解决方案

    如何在ModelSim下用SystemC的做验证?

    SystemC和SystemVerilog在设计的地位问题,我认为在验证方面,SystemC有明显的优势。如果你设计纯粹的ASIC,那么用SystemVerilog可能就足够了。但是在很多场合,软硬件同时存在
    发表于 03-01 11:30

    Verilog generate if 语句如何用systemc实现?

    Verilog generate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-28 12:06

    Verilog generate if语句如何用systemc实现?

    1.Verilog generate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-29 16:11

    systemC设计如何实现上拉和下拉?

    在verilog实现上拉和下拉很容易,使用pullup 和 pulldown 就行,但在systemC设计如何实现上拉和下拉?
    发表于 07-22 22:37

    SystemC是什么?SystmeC的作用是什么?

    SystemC是什么?SystmeC的作用是什么?SystemC的用途是什么?
    发表于 06-21 07:37

    AMBA-PV TLM扩展用户指南

    )和调试接口。 •可互操作,此类允许使用映射AMBA®总线的模型在符合Accellera的SystemC环境工作。
    发表于 08-10 06:56

    ARM System C循环模型用户指南

    1666的SystemC环境。 仅在CPAK环境中支持TLM包装器的顶级重新编译。 基于PIN的系统C周期模型可以在CPAK的范围之外使用。
    发表于 08-12 07:02

    海信TLM3229G、TLM3729G彩电电路图

    海信TLM3229G彩电电路图海信TLM3229G彩色电视机电路图,海信TLM3229G彩电图纸,海信TLM3229G原理图
    发表于 05-08 17:31 89次下载
    海信<b class='flag-5'>TLM</b>3229G、<b class='flag-5'>TLM</b>3729G彩电电路图

    Systemc From The Ground Up

    Systemc From The Ground Up:The first question any reader should ask is “Why this book?” We
    发表于 07-10 17:27 0次下载
    <b class='flag-5'>Systemc</b> From The Ground Up

    利用基于SystemC/TLM的方法学进行IP开发和FPGA

    利用基于SystemC/TLM的方法学进行IP开发和FPGA建模 随着系统级芯片技术的出现,设计规模正变得越来越大,因而变得非常复杂,同时上市时间也变得更加苛刻。通常RTL已
    发表于 01-04 13:11 5379次阅读
    利用基于<b class='flag-5'>SystemC</b>/<b class='flag-5'>TLM</b>的方法学进行IP开发和FPGA

    TLM驱动式新方案探讨

    引言 Cadence设计系统公司目前提供一种全面的SystemC TLM 驱动式IP设计与验证解决方案,包括方法学指南、高阶综合、有TLM感知的验证以及客户服务,推动用户向TLM驱动设
    发表于 08-25 09:56 1304次阅读
    <b class='flag-5'>TLM</b>驱动式新方案探讨

    UVM基于SOCKET通信的TLM2.0介绍

    TLM2.0在2009年成为OSCI标准,主要用于构造总线系统的SystemC模型。
    的头像 发表于 06-25 09:58 2400次阅读
    UVM<b class='flag-5'>中</b>基于SOCKET通信的<b class='flag-5'>TLM</b>2.0介绍

    SystemC的模块与进程

    SystemC的模块 模块(SC_MODULE)是SystemC系统建模的一个基本单位。一个系统由许多个模块构成,各个模块实现系统不同的功能。在设计
    的头像 发表于 11-02 15:31 880次阅读

    SystemC的数据类型概念

    SystemC的事件 在SystemC,事件提供了一个底层的处理程序间同步及重新启动的方式,它能用来实现通道的功能,定义事件的语法如下: sc_event event_name;
    的头像 发表于 11-02 15:44 896次阅读
    <b class='flag-5'>SystemC</b><b class='flag-5'>中</b>的数据类型概念