下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Lecture2 SystemC bascic grammerppt

Lecture2 SystemC bascic grammerppt.ppt

Lecture2 SystemC bascic grammer…

明月不知江心事
2017-09-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《Lecture2 SystemC bascic grammerpptppt》,可适用于IT/计算机领域

*系统级设计描述语言SystemC徐宁仪xunymailstsinghuaeducnXunysmth东主楼区房间版权所有第二部分SystemC的基本语法教材:陈曦徐宁仪《SystemC片上系统设计》,科学出版社,本课件大部分内容参考此书仅作为大学教学之用,请勿用于商业*课程主要内容共讲次争取讲清楚Why,WhatHow。内容包括:为什么用SystemC做片上系统设计?SystemC基本语法*SystemC行为建模基础*SystemC交易级建模与通信细化*SystemC方法库MasterSlave库验证库*第二部分SystemC的基本语法*目的掌握基本语法语义了解SystmeC的语言架构了解SystemC的语言能力编程中容易出现的错误养成良好的编程习惯*内容一个ldquoHelloSystemCrdquo实例SCMAIN()和全局函数一个输入与非门组合逻辑实例SystemC的仿真过程与时间模型语法模块端口和信号时钟和时间模型数据类型进程仿真和波形跟踪寄存器传输级SystemC设计简介*一个ldquoHelloSystemCrdquo实例输出ldquoHello,SystemCrdquo、SystemC版本信息、SystemC版权声明、当前仿真时间、SystemC缺省时间单位和时间分辨率。包括一个模块Hello和scmain函数。*一个ldquoHelloSystemCrdquo实例头文件helloh#ifndefHELLOH基本C#defineHELLOH#includeldquosystemchrdquo所有SystemC模块必须包含ldquosystemchrdquo#endifSCMODULE(hello){此处声明SystemC模块}SCCTOR(hello){此处声明SystemC构造函数coutldquoHello,SystemC!rdquoendl输出ldquoHello,SystemC!rdquocoutldquoscversion():rdquoendlcoutscversion()endl输出SystemC版本coutldquosccopyright():rdquoendlcoutsccopyright()endl输出版权声明coutsctimestamp():sctimestamp()endlcoutscgettimeresolution():scgettimeresolution()endlcoutscgetdefaulttimeunit():scgetdefaulttimeunit()endl}**一个ldquoHelloSystemCrdquo实例scmain函数运行结果主文件maincpp#includehellohintscmain(inti,char*av){helloh(ldquohellordquordquo)实例化模块return}**运行结果*从本例得出的结论SystemC的缺省时间单位为ns缺省的时间分辨率为ps用VerilogHDL可以描述为`timescalenspsSystemC中的模块用SCMODULE(modulename){hellip}来声明等效于VHDL的entity。SystemC的一个模块实际上是一个类所以它有构造函数和析构函数。SystemC的最顶层函数是scmain。既然SystemC是C为什么不用main()*main()scmain()所有的CC的代码的入口是main()。SystemC也不例外。但main()函数是SystemC核心语言库的一部分它调用scmain()所以SystemC用户代码的入口函数是scmain()。Return代表正常返回。如果SystemC库中的main()函数不能满足我们的要求我们可以修改这个函数。intscmain(inti,char*av)的两个参数中前面一个表示参数的数目后面一个是用字符串表示的参数的值这与C语言的main()函数的参数的意义一样。*SystemC的全局函数全局函数是在几乎任意位置的用户代码处使用的函数。scversion()、sccopyright()。Tscabs(constTval)返回实参的绝对值(模板函数)。Tscmax(constTa,constTb)返回a、b中较大的一个,scmin类似。scstart()开始运行仿真核scstop()停止运行。*内容ldquoHelloSystemCrdquo实例SCMAIN()和全局函数组合逻辑实例输入与非门SystemC的仿真过程与时间模型语法模块端口和信号时钟和时间模型数据类型进程仿真和波形跟踪寄存器传输级SystemC设计简介*组合逻辑实例输入与非门本例目的学习如何使用VisualC建一个SystemC项目以及如何用ModelSim查看波形。初步了解SystemC的仿真语义也就是仿真执行过程。SCMAIN*Nand模块ASystemCdescriptionofinputnandgateDesignedByChenxi,#includesystemch#includemathhSCMODULE(nand){scinboolA,BscoutboolFvoiddonand(){F=!(AB)}SCCTOR(nand){SCMETHOD(donand)声明donand为进程sensitiveAB}这里是donand进程的敏感表}*Nand模块的验证程序(Testbench)#ifndefTBH#defineTBH#includeldquosystemchrdquoSCMODULE(tb){scoutboola,bscinboolfscinclkclkvoidgeninput()voiddisplayvariable()SCCTOR(tb){SCCTHREAD(geninput,clkpos())SCMETHOD(displayvariable)sensitivefabdontinitialize()}}#endif*Nand模块的验证程序(Testbench)#includeldquotbhrdquovoidtb::geninput(){wait()a=b=wait()a=b=wait()a=b=wait()a=b=wait()a=b=wait()a=b=}voidtb::displayvariable(){couta=a,b=b,f=fendl}*Nand项目的scmain()函数#includenandhldquo#includetbhintscmain(int,char**){scsignalboola,b,fscclockclk(Clk,,SCNS)nandN(Nand)NA(a)NB(b)NF(f)tbtb(tb)tbclk(clk)tba(a)tbb(b)tbf(f)tracefilecreationsctracefile*tf=sccreatevcdtracefile(Nand)sctrace(tf,NA,A)sctrace(tf,NB,B)sctrace(tf,NF,F)scstart()scclosevcdtracefile(tf)Neverforgetthisfunctionreturn}GotoScheduler*SystemC安装ndash以MSVC为例下载SystemC库http:wwwsystemcorgftp:incoming各种讲义专用目录本系研究生课程SystemC周祖成秋SystemCLib解压缩C:tempsystemc打开项目文件C:tempsystemcmsvcsystemcsystemcdsw创建BuildBuildsystemclib(F)*NandCreatenewprojectFileNewProjectwinConsoleapplicationemptyprojectAddexistedfilesProjectAddtoProjectFilesmaincpptbhnandhBuildingargumentanddependencyprojectsettingsCCclanguageEnableruntimeinformationprojectsettingsCCpreprocessoradditionalincludedirectoryC:tempsystemcsrcAddSystemclib:projectaddtoprojectfilesC:tempsystemcmsvcsystemcdebugsystemclibBuild,Run*用ModeSim查看波形建一个ModelSim项目将Nandvcd复制到该项目的目录下。使用ModelSim行命令vcdwlf将VCD文件转化为WLF文件。命令格式为:vcdwlfsourcevcdtargetwlf这里我们输入:vcdwlfNandvcdNandwlf。请注意vcdwlf与Nandvcd、Nandvc与Nandwlf之间都有空格。如果没有任何提示则命令被正确执行这时将产生一个Nandwlf文件。*用ModeSim查看波形打开signal、structure和wave窗口。在wave窗口下选择Opendataset菜单将生成的Nandwlf文件导入进来。这时你将在structure窗口中看到设计SystemC:在signal窗口中选择所要看的信号放到wave窗口中你就可以看到波形了。*特别强调所有的支持标准C的编译器都可以编译SystemC。为了方便PC上的使用我们使用VisualC编译器。可以使用ModelSim、WaveViewer、VCS、SignalScan等查看波形。WaveViewer是免费的直接可以查看vcd文件记录的波形。*SystemC仿真过程SystemC可执行文件的执行(Execution)过程分为目标描述(Elaboration)、初始化(Initialization)和仿真(Simulation)三个阶段。SystemC的仿真过程是基于事件(Event)的。仿真时间只前进不后退。前进的尺度与仿真时间分辨率和时间单位有关。*目标描述(Elaboration)阶段从scmain()到scstart()的第一次执行。scmain(int,char**){Elaborationstartsherehelliphellipscstart()Elaborationendsherehelliphellip}Elaboration部分一般包括:模块实例和连接模块的通道的初始化、设置缺省时间单位和仿真分辨率、scclock的初始化、sctime类型数据的初始化。SystemC不支持模块的动态创建。(SystemC模块等效于VHDL的Entity)**初始化(Initialization)阶段整个SystemC仿真的执行过程由SystemC调度器控制Initialization是SystemC调度器执行的第一步。SystemC核心语言库定义了三种进程:SCMETHOD、SCTHREAD和SCCTHREAD。在初始化阶段缺省情况下每一个进程都被执行一次THREAD进程被执行到第一个wait()语句。通过donrsquotinitialize()函数可以关闭对进程的初始化。当进程的敏感表上有事件发生的时候没有初始化的进程的第一条语句才开始执行。*初始化(Initialization)阶段conrsquot在初始化阶段进程的初始化顺序是不确定的。但不同次执行中进程的初始化顺序是确定的。所以同一设计用不同的编译器得到的可执行文件由于初始化顺序不同可能产生不同的运行结果。看下页的例子:*初始化(Initialization)阶段conrsquot上述代码中第一次显示的addr的值是还是?SCMODULE(Example){scinclkclkscuintlastaddr()scuintaddr()voidinc(){while(true){addr=lastaddrwait()}}voiddisplay(){coutldquoAttime:rdquosctimestamp()coutldquo,addrchangedto:rdquoaddrendl}SCCTOR(Example){SCTHREAD(inc)sensitiveposclkSCMETHOD(display)sensitiveaddr}}都有可能!**初始化(Initialization)阶段conrsquot在VerilogHDL中的初始化过程(Initial语句)存在同样的问题。(此页的目的是说明初始化中的不确定问题并不只是存在于SystemC实际代码编写过程中应避免不确定性)moduleexampleintegerlastaddrwire:addrassignaddr=lastaddrinitialbeginlastaddr=$display(ldquoAttime:rdquo$time,ldquotheaddrchangedto:drdquo,addr)endendmodule*初始化(Initialization)阶段conrsquot上面代码中到底是赋值先执行还是$display先执行?都有可能。在默认选项下在VerilogXL显示的addr值为x(仿真命令为verilogexamplev)。VCS中的结果为(仿真命令为vcsndashoexampleoutexamplev然后执行exampleout)。仿真结果是不同的!原因是VerilogXL是执行完整个initial语句后才对addr赋值而vcs是在lastaddr被赋值后中断initial语句在执行完对addr赋值后返回initial。有趣的是如果将上例中第三和第四行合并为wireaddr=lastaddr则仿真结果就会相同!*仿真(Simulation)阶段Simulation阶段从第一次遇到scstart()开始到预先设定的仿真时间结束或者遇到scstop()。预先设定的仿真时间由scstart()确定。如:SCMODULE(Example){helliphellipscstart()helliphellip}如果缺省的时间单位为ns且代码中没有使用scstop()则仿真进行ns。*仿真(Simulation)阶段如果scstart()的参数为空则仿真进行到遇到scstop()。练习:对照Nand的例子分析仿真过程中的这三个仿真阶段*scstart()函数激活SystemC调度器开始运行。对进程的初始化是SystemC调度器的第一个工作。SystemC调度器控制仿真时序、进程的执行顺序、处理仿真过程中的事件和更新信号的值SystemC调度器也是基于Delta周期的。一个Delta周期包括求值和更新两个阶段。Delta周期是重要的概念在VHDL中已经讲过这里不详述。SystemC调度器*内容ldquoHelloSystemCrdquo实例SCMAIN()和全局函数组合逻辑实例输入与非门SystemC的仿真过程与时间模型语法模块端口和信号时钟和时间模型数据类型进程仿真和波形跟踪寄存器传输级SystemC设计简介*SystemC的模块模块是SystemC中是设计的最基本的单位可以将模块理解为完成一个特定功能的基本单元。SystemC中的模块相当于VerilogHDL的module或者VHDL的entity。一个模块可以包含一些其它的SystemC基本元素如端口、内部信号、内部数据、子模块、进程、构造函数和析构函数等。这些元素共同定义模块所表达的功能。*设计复用,系统的修改和维护*SystemC模块的定义模块使用SystemC中的关键字SCshyMODULE来声明如下例所示:thedirectmemoryaccesscontrollerforARMSCMODULE(DMA){helliphellipDetailsofthedesign}SCMODULE是SystemC库中定义的一个宏使用它定义一个模块实际上是定义了一个新的C类。*SystemC模块的定义conrsquot还可以直接用C类的定义方法来定义模块。举例如下:thedirectmemoryaccesscontrollerforARMclassDMA:publicscmodule{helliphellipPortDeclarationSCHASPROCESS(DMA)helliphellipOtherdetailsofthedesign}*SystemC模块的定义conrsquot在C中struct是一个特殊的类所以也可以利用struct来定义一个模块。举例如下:thedirectmemoryaccesscontrollerforARMstructDMA:publicscmodule{helliphellipDetailsofthedesign}*模块的端口模块的端口使数据能够在模块间通过模块之间通过信号将端口连接起来。端口分为in、out和inout三种类型如果需要将某一个端口的数据赋给模块自身的其它信号那么该端口就应该是inout类型(与VHDL类似)你也可以指定端口的数据类型允许的数据类型包括C基本数据类型如bool、int、short、char等或者是SystemC专有数据类型如scint、scunit、sclogic等或用户定义的任何数据类型。(bool型是布尔型只有真和假两个值)**端口的实例#defineMAXstructpacket{charsourceaddresschardestinationaddressintlengthchardataMAX}下面的代码就定义了一个输入端口端口的数据类型就是packet。scinpacketpktin*一个FIFO的端口定义scinclkclkclockscinboolrstresetscinboolwrenFIFOwriteenablescinboolrdenFIFOreadenablescinintdindatainput,bitbusscoutboolfull,almostfullscoutboolempty,almostemptyscoutunsignedshortdatacountFIFOdatacountscoutintdoutFIFOdataout*向量型端口和信号有时候需要声明一个端口向量如计算机的数据和地址总线这在SystemC中也是允许的举例如下:scinsclogica这句代码声明了a到a这个端口端口方向为输入端口数据类型为sclogic。信号(见后面的页)也可以使用类似的办法声明:scsignalsclogicabus上面这句代码声明了a到a这个信号信号类型为sclogic。*抽象端口SystemC为了支持交易级建模还支持抽象端口。假设接口directif的定义如下:classdirectif:publicvirtualscinterface{public:directBUSSlaveinterfacevirtualbooldirectread(int*data,unsignedintaddress)=virtualbooldirectwrite(int*data,unsignedintaddress)=}endclassdirectif那么下面的代码定义了一个抽象端口:scportdirectifarbiterport读者可能希望更好的理解抽象端口和接口参见SystemC行为建模部分*端口和信号的读写在SystemC中端口的读写可以是与VHDLVerilogHDL一样的赋值。如果定义了scinbooldatain那么在进程中可以进行下面的读操作:if(datain==TRUE){helliphellip}boolflag=datain*端口和信号的读写conrsquot另外在SystemC中对端口还定义了read()和write()助手函数以帮助完成可能需要的隐式类型转换。上面的代码也可以写成如下格式:scoutintdataouthelliphellipif(datainread()==TRUE){helliphellip}if(datainread()==){helliphellip}boolflag=datainread()dataoutwrite()dataoutwrite(datainread())*端口和信号的读写conrsquot对于需要隐式类型转换的场合只能是用助手函数read()和write()进行读写操作。如上面例子中dataoutwrite(datainread())是允许的而直接赋值dataout=datain就是非法的因为两者类型不同。前者是int型后者是bool型编译器不知道重载哪一个函数。所以:推荐使用read()和write()进行端口的读写操作。*端口和信号的多驱动处理下图中result的值应该为什么?答案:result=x*端口和信号的多驱动处理conrsquotSystemC的逻辑值解析表*端口和信号的多驱动处理conrsquot普通的信号是不允许多驱动的。SystemC中引入了解析逻辑向量信号(ResolvedLogicVectorsignal)来解决多驱动的问题。可以使用下面的方法定义解析型端口:scinrvnxx被定义为n比特宽的解析逻辑向量型输入端口scoutrvnyy被定义为n比特宽的解析逻辑向量型输出输出端口scinoutrvnzz被定义为n比特宽的解析逻辑向量型双向端口这里n是任意正值。类似的解析型信号的定义方法如下:scsignalrvnx宽度为n比特的解析型向量信号x。*一个多驱动的例子mdashmdash选的三态门方框图如下:*一个多驱动的例子mdashmdash选的三态conrsquotSCMODULE(Tristate){scinboolinsela,inselbscinboolinascinboolinbscoutrvoutMethodforfirstthreestatedrivervoidtristatea()Methodforsecondthreestatedrivervoidtristateb()ConstructorSCCTOR(Tristate){SCMETHOD(tristatea)sensitiveinselainaSCMETHOD(tristateb)sensitiveinselbinb}}*信号和变量信号不能用inout或inout来声明信号的传输方向取决于连接部分的端口状态。信号的定义方法:scsignaldatatypesignalname如:scsignalboolascsignalscuintdatabusSystemC中信号与变量的区别与VHDL中一样。信号常被用来连接模块和用于进程间通信变量则用于进程和模块的本地存储。变量仿真的赋值是立刻发生的,没有delta延时而信号和端口的值刷新要经过一个delta延时变量的定义与标准C是一样的。按照上面的说法信号应常被综合为逻辑块间的连线。变量常被综合为逻辑块可以是组合或者时序逻辑。*信号和端口的关联关联(Association)基本等于连接(Connect)也称为绑定(Bind)关联(Association)分为位置关联和名字关联与VHDL一样。名字关联就是按照名字一一对应位置关联就是按照端口定义的顺序一一对应。*名字关联实例#includenandh#includetbhintscmain(int,char**){scsignalboola,b,fscclockclk(Clk,,SCNS)nandN(Nand)NA(a)NB(b)NF(f)tbtb(tb)tbclk(clk)tba(a)tbb(b)tbf(f)helliphellipRestofthecodeomittedreturn}*位置关联实例#includenandh#includetbhintscmain(int,char**){scsignalboola,b,fscclockclk(Clk,,SCNS)nandN(Nand)N(a,b,f)tbtb(tb)tb(clk,a,b,f)helliphellipRestofthecodeomittedreturn}*两种关联方式的对比位置关联在一个只有少量端口的模块的初始化中是非常合适的它能够使描述简单化。然而在对一个有大量端口的模块的初始化中使用位置关联将是非常危险的因为实际工作中设计者可能会不经意间修改了模块的端口的顺序这时就会产生关联错误而这种错误很可能是很难发现的。遇到这种情况最好使用下文所述的名字关联。所以对于一个大的SystemC项目一般建议统一的使用名字关联。*模块的构造函数C中的构造函数创建模块内部数据结构并把这些数据结构初始化为已知的值。SystemC构造函数还用于初始化进程的类型并创建进程的敏感表。SystemC的构造函数用SCCTOR标识构造函数的名字必须与模块的名字相同。*一个构造函数的实例ASystemCdescriptionofinputnandgateDesignedByChenxi,#includesystemch#includemathhSCMODULE(nand){scinboolA,BscoutboolFvoiddonand(){F=!(AB)}SCCTOR(nand){SCMETHOD(donand)声明donand为SCMETHOD进程sensitiveAB}这里是donand进程的敏感表}*另外一个构造函数的例子#includesystemchOtherincludesSCMODULE(simplesoc){CPU*cpuMemoryUnit*muGPIO*gpioDMA*dmahelliphellipdeclareclockandothersingalsConstructorSCCTOR(simplesoc){helliphellipSeenextslide}~simplesoc(){helliphellip}Destructor}*另外一个构造函数的例子conrsquotsimplesoc的构造函数如下:SCCTOR(simplesoc){cpu=newCPU(CPU)helliphellipconnectportsmu=newMemoryUnit(MU)helliphellipconnectportsgpio=newGPIO(GPIO)helliphellipconnectportsdma=newDMA(DMA)helliphellipconnectports}*在构造函数中对端口的初始化方法SCMODULE(Tb){scoutbooldatasourceOtherportdeclarationsboolvaluevoidGenInput(){datasourcewrite(value)value=!value}SCCTOR(Tb){SCMETHOD(GenInput)sensitiveposclkdatasourcewrite(TRUE)Wrong!datasource=TRUEWrong!datasourceinitialize(true)OK!value=TRUEOk!}}(IntBoolTestdsw)*析构函数析构函数释放代码中申请的内存simplesoc的析构函数如下:Destructor~simplesoc(){if(cpu){deletecpucpu=}if(mu){deletemumu=}if(gpio){deletegpiogpio=}if(dma){deletedmadma=}}*SystemC时钟模型在SystemC中时钟被作为一个特殊的对象处理它就是scclock类。时钟端口作为一个特殊的端口。如:scinclkclk可以用scinboolclk代替在SystemC中scclock一共有个重载的构造函数。如:scclock(scmodulenamename,constsctimeperiod,doubledutycycle=,constsctimestarttime=SCZEROTIME,boolposedgefirst=true)*SystemC时钟定义实例scclockclk(clk,,,,true)*SystemC时钟定义实例scclockclk(clk,,,,true)*以上两例的缺点在clk和clk的定义中没有给出时钟的具体时间单位系统默认的时间单位将被采用不同的系统的默认时间单位可能不同这将不利于IP核的设计复用。假设clk的周期为MHz则更合适的定义方法为:scclockclk(clk,,SCNS,,,SCNS,true)*其它生成时钟的办法另外一种定义时钟的办法scsignalboolclockscinitialize()for(inti=i=i)clock=sccycle()clock=sccycle()}上面的这段代码等价于:scclockclk(ldquomainclockrdquo,,)scstart()*其它生成时钟的办法conrsquot采用这种方法初始化时钟的好处是可以同时插入对其它信号的初始化。scsignalboolclk,rstscinitialize()Runforcyclesfor(inti=i=i){clk=sccycle()clk=sccycle()}*其它生成时钟的办法conrsquotrst=sccycle()clk=sccycle()rstwaskeptlow,continuegenerateclkfor(){clk=sccycle()clk=sccycle()}*SystemC定义的时间单位*SystemC时间模型SystemC采用基于整数的时间模型系统时间用一个位无符号整数来表示。不用实数主要是考虑下溢(underflow)问题。时间分辨率是仿真系统能够处理的时间的最小精度比时间分辨率更精细的时间将被四舍五入到时间分辨率所定义的精度。假设系统的时间分辨率为ps则下面的语句wait(,SCNS)实际上等效于wait(,SCNS)*SystemC时间模型conrsquotSystemC缺省的时间分辨率为ps同时提供了scsettimeresolution(double,sctimeunit)函数允许修改系统的时间分辨率。如下面的代码将系统的时间分辨率设置为ps。scsettimeresolution(,SCPS)SystemC对时间分辨率的设置有以下的要求:时间分辨率必须是的幂。时间分辨率只能在仿真开始之前设置。时间分辨率只能设置次。时间分辨率必须在任何的非零的sctime声明之前设置。*SystemC时间模型SystemC缺省的时间单位是SCNS同时允许通过调用scsetdefaulttimeunit(double,sctimeunit)来修改缺省的时间单位。如下面的代码将时间单位设置为ps。scsetdefaulttimeunit(,SCPS)SystemC对缺省时间单位的设置有以下的要求:缺省时间单位必须是的幂。缺省时间单位必须大于等于时间分辨率。缺省时间单位只能设置一次。缺省时间单位只能在仿真开始之前设置。*SystemC时间模型conrsquot在时间单位设置为ps的情况下下面的clk的周期为xps=ns。scclockclk(ldquoclkrdquo,)*内容ldquoHelloSystemCrdquo实例SCMAIN()和全局函数组合逻辑实例输入与非门SystemC的仿真过程与时间模型语法模块端口和信号时钟和时间模型数据类型进程仿真和波形跟踪寄存器传输级SystemC设计简介*基本数据类型*基本数据类型*四值逻辑数字系统中最常见的四个逻辑为:lsquorsquomdashmdash逻辑低电平lsquorsquomdashmdash逻辑高电平lsquoZrsquomdashmdash高阻态lsquoXrsquomdashmdash不定值。在SystemC中这四个值用lsquorsquo、lsquorsquo、lsquoZrsquo、lsquoXrsquo或者SCLOGIC、SCLOGIC、SCLOGICZ和SCLOGICX表示可以用于对scbitsclogic类型进行赋值。*scbit和sclogic在进行布尔代数操作时scbit可与C的bool类型混合使用,但推荐的做法是多使用bool型。scbit只有lsquorsquo和lsquorsquo两个值。sclogic数据类型比scbit多两个值rsquoXrsquo和rsquoZrsquo它所支持的运算与scbit一样。*scbit和sclogic例子:scbitascbitb下面的操作合法:a=trueb=##boolequal=a==b等效于boolequal=(a==b)下面的操作是非法的:a~=boperatornotdefined*scint和scuintSystemC中引入了scintW和scuintW来实现到比特中任意宽度的整型数据类型。W=scinta定义了一个位的有符号整型数scuintb定义了一个位的无符号整型数SystemC引入了scbigint和scbiguint来实现任意宽度的整型操作。*scint和scuint支持的操作除最基本操作外还支持以下操作*scint和scuint支持的操作*scint和scuint的例子scintx,yscintzz=(x,y)将x和y串连后赋值给zx=zrange(,)取z的高位赋值给x。booltemp=xorreduce()将x的各个位相或后得到的bool值赋给temp*scbigint和scbiguint的例子下面是scbigint和scbiguint使用的例子:scbiguintbscbiguintbscbiguintbb=b*bb*b运算的结果有位只有低位被赋值给b。*scint和scuint的相互赋值当一个无符号整uint(scuintM)数被赋值给有符号整数int(scintN)时uint首先被扩展(高位直接填零)为位然后从低位开始取N位赋值给int。scintintascuintuintbuintb=xFFFFinta=uintbcoutinta=intaendl运行结果:inta=xFF=*scint和scuint的相互赋值scintintascuintuintbuintb=xFFinta=uintbcoutinta=intaendl运行结果:inta=xFF=*scint和scuint的相互赋值当int被赋值给uint时系统首先将它按符号(负数高位填正数填)扩展为位然后从低位开始取M位赋值给uintscuintuintascintintbintb=xFFuinta=intbcoutuinta=uintaendl运行结果:uinta=xFFFF=*scint和scuint的相互赋值scuintuintascintintbintb=xFFFFuinta=intbcoutuinta=uintaendl运行结果:uinta=xFF=*用户自定义类型除C固有数据类型和SystemC专有数据类型外SystemC作为C的扩展还支持用户自定义数据类型。下面的例子定义了一个packet结构可以认为是一个新的数据类型:#defineMAXLENGTHstructpacket{scuintlengthcharMAXLENGTHinfoscintfcs}*用户自定义类型conrsquot为了能够对它进行操作必须定义运算符重载和方法函数。下面的例子定义了ldquo==rdquo运算符的重载。inlinebooloperator==(constpacketrhs)const{return(rhsinfo==inforhslength==lengthrhsfcs==fcs)}*定点数据类型实际电子系统很多是定点的。定点数据类型在加法器、乘法器和FFT运算、滤波器等需要算术逻辑的设计中特别有用。为了能够精确的建模和描述定点硬件必须使用定点数据类型。SystemC专门定义了有符号和无符号的定点数据类型而且还允许设定定点数据类型的量化和溢出行为。SystemC的种基本定点数据类型为:scfixedscufixedscfixscufix*定点数据类型conrsquotscfixed和scufixed的参数是静态的在程序中设定后不能再修改而scfix和scufix的参数是非静态的其字长和整数部分长度可以是变量。scfixed和scfix是有符号整数而。scufixed和scufix是无符号整数。定点数据类型的定义方法如下:scfixedwl,iwl,qmode,omode,nbitsxscufixedwl,iwl,qmode,omode,nbitsyscfixx(listofoptions)scufixy(listofoptions)*scfixed和scufixed的参数的含义wlmdashmdash字长即用于表示一个定点数的总的比特数。iwlmdashmdash整数部分字长即小数点左边的比特数。qmodemdashmdash量化模式。当一个运算的结果的精度大于定点数所能表示的精度时就要根据量化模式将尾数进行取舍。omodemdashmdash溢出模式。当一个运算的结果大于定点数所能够表示的最大值时就要根据溢出模式将数据进行处理。nbitsmdashmdash饱和比特的位数。该参数仅用于溢出模式它定义了在特定的具有饱和行为的溢出模式下饱和比特的位数。*定点数据的字长和整数部分字长字长wl是用于表示一个定点数的总的比特数它必须是大于的。整数部分长度iwl也称为整数字长可以是正数、负数也可以大于总字长。*实例下面列出了几种典型的情况图中X代表任意值S是符号扩展位根据符号的情况可以是或者。*实例下面列出了几种典型的情况图中X代表任意值S是符号扩展位根据符号的情况可以是或者。*实例下面列出了几种典型的情况图中X代表任意值S是符号扩展位根据符号的情况可以是或者。*浮点数据类型的量化模式*一个定点数据类型的量化例子定点数据类型声明的一个例子如下:scfixed,,SCRNDZERO,SCSATfxvalscfixed,xscfixed,,S

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/149

Lecture2 SystemC bascic grammerppt

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利