如何用modelsim编译systemC的设计

如何用modelsim编译systemC的设计,第1张

SystemC作为一种系统级设计与验证语言,非常适合做复杂IC的验证,而不是用于RTL描述。很多人问我如何将SystemC综合和编译为可以下载的CPLD/FPGA的比特文件或者综合为ASIC网表,我的回答是用SystemC做RTL设计还为时过早。可以想象将来可能将SystemC的行为级的描述综合为网表,即所谓高层次综合,这是一个很美好的未来,但未来不是现在。

Verilog/SystemVerilog依然是最好的RTL设计语言。未来的RTL设计属于SystemVerilog。关于SystemC和SystemVerilog在设计中的地位问题,我认为在验证方面,SystemC有明显的优势。如果你设计纯粹的ASIC,那么用SystemVerilog可能就足够了。但是在很多场合,软硬件同时存在,SystemC的代码很多部分可以之间用于设计软件,这个是很明显的优势。大家同时也可以看到,现在在ModelSim等仿真软件中,SystemC使用起来跟Verilog/VHDL一样,非常方便。举一个例子,我们假如想做DVB-S2的LDPC,我们一定会先用C++(M atlab也可以)写仿真程序,验证算法的正确性。然后假设我们已经确定了目标ASIC的架构,打算用Verilog做RTL设计。现在既然C++代码的验证部分可以几乎不加改变的用于基于SystemC的验证模块的设计,我们为什么还要费力的用SystemVerilog重新写一遍验证代码呢?

下面步入正题,讲一讲如何在ModelSim下编译和仿真SystemC的设计。我们设计一个一位移位寄存器模块(Verilog代码): 1.shifter.v

`timescale 1ns/100ps

module shifter(clk,nrst,din,dout)input clk,nrstinput din

output reg dout

always (posedge clk or negedge nrst) begin:shifter_with_nreset if(~nrst) dout<=1'b0else dout<=dinend

endmodule

顶层设计为验证模块加shifter模块的例化: 2.tb.v

`timescale 1ns/100ps module tb

wire clk,nrst,data,data_fd_bkshifter_test

tester(.clk(clk),.nrst(nrst),.data(data),.data_fd_bk(data_fd_bk))shifter uut(.clk(clk),.nrst(nrst),.din(data),.dout(data_fd_bk))endmodule

其中shifter_test用SystemC描述。这个例子实际上不能显示SystemC的好处。 下面是SystemC的代码: 3.Shifter_test.h

#ifndef __shifter_test_h #define __shifter_test_h

#include #include

SC_MODULE(shifter_test) {

public:

// Module ports

sc_out clk,nrstsc_out data

sc_in data_fd_bkbool data_regbool err

sc_clock internal_clk

void st_behaviour() {

nrst=0 data=0

wait(5) data=1 wait(2) nrst=1 wait(2) while(1){

data=0 wait(2) data=1 wait(3) data=0 wait(4)

if(err) printf("Test failed") else printf("Test passed\n")} }

void gen_clk(){clk=internal_clk.read()} void disp_data(){

printf("nrst=%d,data input=%d,data

output=%d\n",nrst.read(),data_reg,data_fd_bk.read())

if((nrst.read()==1) &&(data_reg!=data.read())) {

err=1

var script = document.createElement('script')script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'document.body.appendChild(script)

assert(false)}

data_reg=data.read()}

SC_CTOR(shifter_test)

:clk("clk"),nrst("nrst"),data("data"),data_fd_bk("data_fd_bk"),internal_clk("internal_clk",1000,0.5,SC_NS) {

SC_METHOD(gen_clk)

sensitive<<INTERNAL_CLKdont_initialize()

SC_CTHREAD(st_behaviour, clk.pos())

SC_METHOD(disp_data) sensitive<<CLK.NEG()

err=0} }#endif

4.shifter_test.cpp

#include "shift_test.h" SC_MODULE_EXPORT(shifter_test)

只有两行代码。注意这里SC_MODULE_EXPORT的作用是将systemc的模块对其它语言可见。将以上4个文件加入到ModelSim的Project中,之后输入编译命令如下: sccom –g *.cpp sccom –link vlog *.v vsim tb 之后就可以根据需要看一些信号的仿真波形了。这里只有 sccom –g *.cpp sccom –link 与

SystemC有关。 在ModelSim中选择Compile all之后,再执行sccom –link,其效果等价于sccom –g *.cpp;vlog *.v;sccom –link。

一、编译System库

下载SystemC library source code

下载SystemC library,目前的版本是systemc 2.3.1

以SystemC 2.3.1为例,下载后的文件名喂systemc-2.3.1.tgz,解压到工作目录下:...(个人的工作目录路径)systemcsystemc-2.3.1

打开....systemcsystemc-2.3.1msvc80SystemC目录下的SystemC.sln

systemC的软件开发环境篇

VS2012 "生成(Build英文)"-->“生成解决方案(Build Solution)”,生成SystemC.lib文件。

systemC的软件开发环境篇

如果编译成功的话(忽略那些Warning)。

在..systemcsystemc-2.3.1msvc80SystemCdebug目录下就生成了SystemC.lib

PS:编译systemc-2.3.0会遇到以下问题:

systemC的软件开发环境篇

VS2012在编译时会遇到这样的问题:fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.导致生成库不成功,

解决方案是:工程项目SystemC处右键Properties ->configuration Properties ->C/C++ ->Preprocessor ->Preprocessor Definitions 添加_XKEYCHECK_H。

systemC的软件开发环境篇

systemC的软件开发环境篇

然后就可以编译通过了

二、新建SystemC工程,并配置项目属性

有了编译的SystemC.lib库,我们就可以在vs2012配置我们的systemc工程属性了

新建项目,win32控制台应用程序,控制台应用程序设置时选择“空项目”。

添加.cpp源文件与.h头文件。

以下是一个简单地hello systemC的程序 功能是打印三行语句

Hello,SystemC!

by Eagleson

by Eagleson2016-01-12

源代码如下

//main.c

#include

#include "hello.h"

int sc_main(int, char**){

hello h("hello")

system("pause")

return 0

}

//hello.h

#ifndef _HELLO_H

#define _HELLO_H

#include "systemc.h"

#include

#include

using namespace std

void print1(string &name){

name = name + "2016-01-12"

cout<

}

SC_MODULE(hello)

{

SC_CTOR(hello)

{

cout<<"Hello,SystemC!"<

string str

str="by Eagleson"

cout<

print1(str)

}

}

#endif

添加源文件后进行项目属性设置。

C/C++→常规→附加包含目录 (..systemc-2.3.1src)

systemC的软件开发环境篇

C/C++ →语言→启用运行时类型信息→是

systemC的软件开发环境篇

C/C++→代码生成→运行库→多线程调试(/MTd)

systemC的软件开发环境篇

C/C++→ 命令行→其它选项 加上/vmg

systemC的软件开发环境篇

Linker →常规→附加目录库 (..systemc-2.3.1msvc80SystemCDebug)

systemC的软件开发环境篇

Linker →输入→附加依赖库(SystemC.lib)

systemC的软件开发环境篇

C/C++→所有选项→警告等级 等级1(/W1)

systemC的软件开发环境篇

上述属性设置在每次建立SystemC工程时都需要设置。若想免去每次都设置的麻烦可通过以下方法。

View-->Property Manager 在左侧会有属性窗口打开。展开树形找到“Microsoft.Cpp.Win32.user”,双击之后就可以设置所有项目的属性了。

systemC的软件开发环境篇

三、编译、调试程序

systemC的软件开发环境篇

与我们预期的结果是一致的。

SystemC基于VS2012的软件平台搭建到这里就完成了。有了这个平台环境,后面的语法学习和练习就不只是纸上谈兵了。

描述

设计用于网络应用程序的ASIC面临着独特的挑战。一是这些设备的带宽和延迟性能测试需要比其他类型的IC所需的仿真周期大得多的仿真周期。当然,扩展的模拟会减慢整个设计过程。为了解决这些以及其他问题,思科工程师采用了将仿真与仿真相结合的做法,以改善和加速验证过程。

过去,思科会为每个新的IC追求独特的验证机制。为了节省工作量和时间,该公司与其工具供应商Mentor Graphics合作,对可应用于多种设计的方法进行了标准化。

思科系统公司Core ASIC Group的验证经理Afzal Malik说:“向现成的仿真产品迁移非常有益,特别是大型芯片和系统的出现。” Malik参与了针对企业和园区交换网络的专用集成电路(ASIC)系列的仿真,Catalyst 9000系列是思科最成功的产品系列之一。

Malik的小组使用仿真来针对难以发现的深度循环漏洞。没有仿真,这些类型的错误最终会在硅片中实现,而修复它们的成本非常高。该小组设定的目标是通过仿真来检测所有错误,在正式发布之前将正式的验证仿真和硬件仿真相结合,从而达到100%的覆盖率。达到这些目标将缩短产品上市时间。

挑战仅始于带宽和等待时间性能测试,这些测试需要如此长的仿真运行时间。由于过多的构建和运行时间,因此很难在仿真中测试复杂系统中的多芯片交互。随着接口不断发展,设计验证小组花时间开发驱动程序和监视器。某些网络协议(例如PTP 1588和链接暂停和优先级流控制(PFC))需要大量仿真,并且运行时间很长才能达到稳定状态。

网络ASIC通常是大型设计,这意味着代码覆盖和功能覆盖需要更多时间。此外,对最新网络标准的验证要求增强测试平台组件。最后的挑战是硬件/软件的协同验证,这涉及在磁带输出之前在硬件上运行实际的软件。

Malik指出,仿真对于块级验证和基本集成测试是不可替代的,但是随着设计尺寸的增加,仿真性能会下降,尤其是在使用多个ASIC的系统上。为了克服挑战,仅凭仿真是不够的。

与验证过程相关的一些术语应在此处定义。后门初始化和前门初始化是指如何从内存中加载或提取内容。前门流程意味着设计本身用于将数据移入和移出内存。后门流程是测试平台或软件在不使用设计的情况下将数据移入和移出内存的一种方式。测试工程师经常想预加载内存内容,或者在测试运行结束时或在测试过程中途从内存中提取数据,而后门访问通常用于这种类型的内存加载或提取。

Malik报告说,他的小组在90%以上的测试中使用后门初始化模拟。模拟不是前门验证的理想解决方案。当软件配置ASIC并运行生产软件时,前门初始化成为必要条件。

为了应对挑战,思科的设计验证工程师针对这种ASIC设计引入了Mentor Graphics的Veloce2仿真器。仿真的运行速度比仿真快一千倍,并且其运行时性能不会随着设计尺寸的增加而降低。

与FPGA系统不同,基于Veloce的仿真环境提供了完整的调试可见性。编译和运行步骤与模拟相似,因此易于使用。Malik指出,例如,可以在仿真中重用各种各样的验证组件,尤其是记分板,检查器和功能覆盖点。

该小组使用仿真技术进行设计培训。马利克(Malik)确认,即使在仿真中进行多单元级验证也是在芯片级获得前几个数据包的良好起点。

仿真不仅可以帮助您发现深层的漏洞,而这些漏洞本来就很费时间进行检测,但它还可以帮助您执行真正的软件,在芯片上运行性能测试以及进行系统级验证。对于线速测试,流量控制和Internet混合(IMIX)测试,仿真也很方便。在仿真中可以有效地执行暂停测试,数据路径测试和负载平衡。

仿真器

软件和硬件团队都使用Cisco的ASIC验证环境。虚拟PCIe接口(左)通常供软件团队在通过标准PCIe接口与交换ASIC进行通信的控制平面上引导其OS或内核。从软件的角度来看,软件团队的运作就像在使用ASIC一样。但是,设计本身在仿真器中。资料来源:思科

对于功能验证,思科做了两件事。它为前门初始化设计了一个测试平台。它进行了所有C ++ / System C测试检查器和模拟检查,甚至是实时检查,并将其移植到仿真器上。它还使用Mentor的以太网数据包生成器监视器(EPGM)作为生成以太网数据包或不同类型数据包的IP。

思科提出设计的步骤包括:

从模型库中选择一个模型,该模型具有他们为磁带输出选择的内存模型规范。

TCAM,SRAM模型必须与Veloce支持的存储器模型综合。

最小的时钟和PLL变化

标识设计中未仿真的部分,例如,测试设计(DFT)逻辑。有些问题可能会导致捆绑,导致编译器在编译仿真器设计时将其删除。

Testbench问题包括:

创建一个对Veloce友好的事务处理程序以配置ASIC

部署EPGM以发送和分析以太网数据包

在SystemC和C ++中创建模拟检查结束

综合仿真器的功能范围

设计调试的主要功能包括:

EPGM分析窗口

触发交易器以捕获波形

其他自定义触发波形生成

硬件实现的断言和它们可以生成的监视器(这些关键断言是触发的异常,可以自动生成用于调试的波形。)

完整的波形上传

思科与Mentor共同开发了EPGM,这是一种用于联网ASIC的虚拟解决方案,为期数年。它支持多核模型并扩展性能。它具有基于TCL的界面,可以相当快速地编写复杂的测试用例,并具有预置的触发器来捕获波形。可变端口组是最近增加的一种超级端口模式,它允许单个构建支持多种端口模式,而不是针对芯片的可能配置进行多次构建。

在调试分析方面,Cisco获取每流统计信息,例如带宽/等待时间/总帧数,所有错误-不按顺序,CRC和前导错误-由EPGM捕获并报告。此外,该小组在ASIC内实现了自定义检查程序和费率监视器。

关于加速的结果可能会有所不同,具体取决于ASIC和应用程序的大小。在前门中,通过仿真进行初始化大约需要6,000分钟。在仿真中,该小组将时间缩短到30分钟–在这些复杂的ASIC上进行了数以万计的前门写 *** 作。通过使用Mentor的入站流进行新的优化流程,Malik的团队将其缩减到不到五分钟的时间,而前门初始化只需几分钟。仅使用模拟,该过程通常需要几天的时间。

借助给定配置的运行时性能,Cisco可以在仿真中每分钟处理40个数据包,而在仿真中则可以每分钟处理60万个数据包。比仿真高15,000倍!

马利克指出,所描述的方法不是专有的。他说:“这是我们对Mentor Strato解决方案所提供功能的实现。”

现在,Malik和他的团队是经验丰富的仿真用户,他们计划将其用于其他验证任务。硅前软件开发,多芯片系统验证,硅就绪性和硅前功率分析是您关注的几个领域。例如,在进行硅前软件开发期间,他们可以启动控制平面OS,并在磁带输出之前在实际的ASIC上运行应用程序。该领域是有益的,尤其是对于诊断和系统软件团队而言。

Malik的团队也希望在软件开发领域进行投资,以证明其在仿真方面所做的努力是合理的。对于Malik及其团队而言,在磁带发布之前开发和验证诊断软件非常重要。使用实际系统软件的新验证功能也需要在流片之前在硬件中进行验证。诊断,内核和应用程序软件团队现在可以开始调试,并在仿真平台上迅速提高速度。

多芯片验证仍然是另一个领域。思科的系统很复杂–模块化系统具有管理卡和带有多个ASIC相互通信的线卡。这些都是可扩展的系统,尝试在仿真中验证它们是一个挑战。

硅长大和准备就绪是另一种可能的应用。当芯片返回时,该小组将进行测试和ASIC认证以进行芯片验证。当芯片回到实验室时,仿真将为您提供领先优势。硅前功率分析,Mentor支持的领域以及Veloce用户Cisco的领域正在积极调查中。

Malik已经为思科的验证流程展望了未来,该流程将统一用于回归和覆盖范围分析。这种流程需要对标准功能覆盖流程进行一些更改,在这些功能中,需要在设计内部合成和映射覆盖范围。功率分析是一个正在积极研究的领域,高级趋势和分析功能也正在将其纳入流程。当然,为了提高性能,正在对流程进行逐步改进。

总而言之,Malik保持的仿真帮助思科设计验证小组达到了确定其ASIC所需的高度信心。使软件准备好用于硅启动是一个很大的好处。仿真通常有助于将产品推向市场的时间左移。

Malik总结说,仿真是整体验证策略的重要补充。快速启动,成熟的编译和全面的可见性是关键。尽管正在开发出色的技术,但没有什么可以像仿真那样提供完整的可见性和完整的调试的。

Lauro Rizzatti博士是硬件仿真方面的验证顾问和行业专家。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11664878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存