如何在SoC设计中使用事务处理(一)
扫描二维码
随时随地手机看文章
建模、验证与调试需要统一标准的符号和框架,以便使架构师和设计工程师能够协同进行复杂SoC的开发。事务处理级模型(TLM)是进行这种分析的理想模型,在片上系统(SoC)设计中使用事务处理级建模,可让设计从高效率协同仿真和高产出的分析与调试中受益。
片上系统(SoC)平台是异质性的实体。它们通常包含至少一个处理器部件(譬如微处理器或DSP),以及外围设备、随机逻辑、嵌入式存储器、通讯基础结构和传感器、传动装置之类的外部接口元件。这些变化多样的设计平台正在将设计焦点和折衷分析转移至通讯层面。
由 于SoC内的功能单元常常是通过若干标准及基于数据总线的专有协议来实现通信,所以理解模块间通讯已经成为验证的一个关键。设计活动向通讯基础架构设计的 转移,也促进了对混合级建模以及调试技术的使用。这些技术使设计工程师能够完全应对从电阻晶体管逻辑电路(RTL)到更高事务处理级的转移,而且无需中断 使用目前的功能验证方法。
有鉴于现今协议的复杂性,要详尽理解信号级上的同步互动是艰难而又费时的。此外,由于不同的团队和个人都将设计视为从规格到实现的提炼过程,所以各个设计团队之间以及团队内部都需要找到一个通用参考框架(frame)。
有代表性的参考标准必须足够灵活以便适合于多个应用领域。它也必须经得起抽象和提炼,以便适用于由上而下设计或由下而上的配置。事务处理级建模(TLM)被用作所需的中间建模抽象级,成为连接顶层和底层的桥梁。
事务处理级建模的概念
目前的SoC设计流程是一个混合过程,包括由上而下的从规格制定到实现、从下而上的设计模块集成,以及对来自外部供应商或内部重用模块的知识产权的验证。事 务处理可以作为连接不同设计建模层间间隙的一个最终优化规范。这包括用高级语言实现的无时序(untimed)纯功能性建模、通过架构估计得到大致时序的 功能级,一直到实现级、循环精确的RTL。
除此之外,事务处理级建模也作为系统工程师和专用模块开发者之间的一个通用描述性媒介而发挥着 作用,该媒介超越了不同的适用于具体设计或验证活动的语言的界限。于是,事务处理就变成实施构架开发和折衷分析的一种形式。它是一种通过分析系统功能有效 性和性能度量(譬如整体吞吐量、模块与存储器交互延迟等)来自动进行设计理解和调试过程的手段。
图1显示的是从算法级到实现级的各个抽象级,通常包括SystemC(IEEE P1666)、SystemVerilog(IEEE P1800)和e(IEEE P1647)在内的几种功能建模与验证语言(及标准)被用于设计。另外,先进的方法实践,例如从OpenVera的“参考验证法指南”以及e的“e再使用法推荐”抽取出的方法实践,为算法、构架以及事务处理级建模提供参考。
事务处理级建模是一个相当普通的应用,它涉及并描述设计的每一个功能线程。事务处理级的焦点是“如何”进行,特别是通讯交互“如何”进行,而不在于功能是 “什么”。事务处理所提供的是执行细节在时间上的抽象与空间上的封装在――这是最初注重通讯基础架构而不是功能模块的思想的体现。做这样的抽象建模的好处 是验证效率高。事实上,对事务处理的运用正变得日益广泛、多种多样,并成为主流。
在模块间捕捉同步传输的事务处理也注定会成为折衷分析中的重要角色。因此,建模与记录事务处理对提升基于事务处理的验证和调试技术非常关键,而验证和调试技术是提高开发效率与设计质量所必须的。
如何进行事务处理级建模
高级语言(也称为“HLL”,例如SystemC)、其它的硬件验证语言(也称为“HVL”,例如OpenVera、e)以及测试向量(testbenchz)与硬件设计语言(例如SystemVerilog)对事务处理都有程度不一的内在支持。SystemC (www.SystemC.org)可为建模语言内置的用户驱动事务处理的创建提供支持,并可把它们记录到数据库中,就如同采用SCV函数库的sc_trace()写入数据库一样。SCV有许多预先定义的非常有用的类,包括下面三个主要的记录对象:scv_tr_db: 事务处理数据库对象,它允许用户控制记录。该对象是通用的且独立于数据库格式。第三方记录API供应商可以将底层服务对应到他们自己的数据库方案中。[!--empirenews.page--]
scv_tr_stream: 事务处理流建模对象。流是一种抽象通讯方法,包括重叠事务处理在内的事务处理可以发生流中,例如一个带有读/写事务处理的存储流。因此一个流可以被认为是一个抽象信号,在这个信号中事务处理是可以被信号使用的抽象值,例如一个数据传送总线的地址或数据流。
scv_tr_generator: 围绕一个特定的事务处理类别并且允许创建和增加属性的对象,可以是包括设计信号和信息以及通用有效负载数据在内的任何对象。
下面的代码段 显示了如何利用SCV以一种相对比较直接的方式创建事务处理。每一个代码段前的注释均指出其后语句的目的。事务处理可以以一种无缝的方式(不需要用户的直 接干预)被记录进数据库中。为了实现这一点,工具供应商可以通过在上述三个类中提供的注册机制来注册回叫,从而实现记录功能。用户只需要增加一些初始化调 用即可。
// Inside sc_main() or some other context
// SCV startup
scv_startup();
// Initialization
API_vendor_initialization(); // set SCV callbacks here
scv_tr_db db("my_db");
scv_tr_db::set_default_db(&db);
// Define a stream and a generator
scv_tr_stream mem_stream("memory", "transactor");
scv_tr_generator read_gen("read", mem_stream, "mem");
scv_tr_handle tr_handle;
// Modeling code here
// Transaction begin with a tr_data attribute
tr_data.addr= addr_signal;
tr_data.data=data_signal;
tr_handle=write_gen.begin_transaction(tr_data);
// Transaction end
tr_handle.end_transaction();
// Other modeling code here
SCV也有许多其它的类,例如,在不同的事务处理之间建立关系的scv_tr_relation。在确定诸如前续-后继之类的因果关系、如父-子之类的层次关系以及成分分析集合体时,关系在分析以及调试方面都相当有用。
由于OpenVera(www.open-vera.org)是一种面向对象的建模语言,它可以轻而易举地容纳事务处理级建模的封装概念。该语言目前不具备与SCV类似的内置事务处理类。但可有可能为了这一目的而创建类,例如下面的极小集:trans_db:用于数据库;
trans_stream:事务处理流建模对象;
trans_type:创建事务处理以及事务处理的属性;
trans_handle:便于操控句柄。