还剩5页未读,继续阅读
文本内容:
System C基本语法__胡玲娜张小军邓鸿威 摘要随着VLSI的集成度越来越高,设计也越趋复杂传统的设计方法如原理图输入、HDL语言描述在进行复杂系统设计时,设计效率往往比较低特别是在算法由软件转化为硬件的环节上,传统的设计方法的效率不是很高,设计者往往要耗费大量的时间和精力手工进行算法的转化为解决这些问题,一种新的系统级的设计方法SYSTEMC被提出SYSTEMC是一种方法,也是一个C++库,用SYSTEMC可以很方便地实现一个软件算法的硬件实现,以及完成一个系统级的设计关键词SystemC;硬件描述语言;FPGA
一、概述随着VLSI的集成度越来越高,设计也越趋复杂一个系统的设计往往不仅需要硬件设计人员的参与,也需要有软件设计人员的参与软件设计人员与硬件设计人员之间的相互协调就变的格外重要,它直接关系到工作的效率以及整个系统设计的成败传统的设计方法没有使软件设计工作与硬件设计工作协调一致,而是将两者的工作割裂开来软件算法的设计人员在系统设计后期不能为硬件设计人员的设计提供任何的帮助同时现在有些大规模集成电路设计中往往带有DSPCore或其它CPUCore这些都使得单纯地用原理图或硬件描述语言来设计、仿真这么复杂的系统变得十分困难SystemC就是在这些矛盾的背景下提出的它的出现为复杂的系统设计提供了一条有效的解决途径SystemC是由SynospyInc.提出的,目前最新的版本为V
2.0它提出的目的就是以一种系统设计的思想进行系统设计它将软件算法与硬件实现很好的结合在一起,提高了整个系统设计的效率和正确性SystemC是一个C++库,也是一种使设计者可以有效地设计出一个软件算法的准确循环模型,硬件结构以及系统级设计的方法设计者可以用SystemC__工具或在标准C++__工具中加如SystemC库制作系统级模型,快速地仿真和优化设计,以及研究不同的算法,并且为硬件和软件设计人员提供一个设计系统的可执行规范可执行规范本质上是一个C++程序,它显示了和设计系统同样的性能,为软件设计人员和硬件设计人员提供了一个设计的标准SystemC库提供了创造系统结构模型的必须结构,包括那些在C++没有的功能如硬件时序,并行和触发功能C++这种面对象语言提供了通过增加类来扩展语言的能力,而这种能力是C语言所不具备的因此,SystemC使用大家熟悉的C++语言和__工具
二、SYSTEMC的特点SystemC支持对硬件和软件的联合设计,支持描述一个既包含硬件部分也包含软件部分的复杂系统结构它也支持对接口的描述,有以下几个显著的特点1.SystemC可以为软件设计人员和硬件设计人员提供一个系统的可执行规范设计人员使用该可执行规范可以避免设计中矛盾和错误的产生,并确保设计的完备性这是应为在设计可执行规范时,系统设计者必须设计出也一个和系统具有同样工作状态的程序,通过这个程序可以发掘出潜在的矛盾和错误,并将这些矛盾和错误消除在整个设计的开始阶段,而不是在整个系统进行调试阶段才发现和解决这些矛盾和错误这个程序还可以帮助设计者确保整个系统设计的完备性2.设计人员利用这个可执行的系统规范,还可以发现设计中概念模糊的地方无论什么时候,设计人员对设计产生疑惑,就可以运行这个可执行程序以明确在这个问题上系统设计人员是如何处理的,从而确保系统设计的正确性而现在的设计方法不能使设计人员方便迅速的解决这些疑惑甚至这些疑惑是系统设计人员也不曾考虑过,这可能导致系统要重新进行设计3.在系统设计被实现以前,设计人员还可以通过用SystemC设计的系统可执行规范来验证整个系统设计这样可以避免由于在系统设计上的失误,而使系统实现不能达到要求现在的设计方法不能提供这样的手段在设计完成前进行系统的验证,对系统的验证必须是在系统设计完后即使在完成前进行验证,由于不能完全模拟实际系统的工作,其结果也只能作为一种参考4.SystemC设计的可执行规范所使用的TESTBENC__件可以通过小范围的修改或直接用在实现后的系统仿真这就为设计实现人员带来很大的好处,他们不必花很多的时间去编写用来验证实现后系统正确性的TESTBENC__件而现在采用的设计方法所使用的TESTBENC__件却没有提供这样的便利条件这是应为软件设计人员和硬件设计人员两者的设计思想和设计手段都是不同的,一个软件设计人员所使用的TESTBENC__件并不能被硬件设计人员使用,甚至不能给硬件设计人员任何帮助
三、SYSTEMC设计与传统设计比较现在的系统设计一般是由系统工程师用C语言或C++语言设计出一个系统模型,并在系统级层次上检验概念和算法当这些概念和算法被检验为正确无误时,C/C++模块被分解为功能相对__的子模块这些相对对立的子模块由硬件设计人员手工地转化为VHDL或Verilog语言用以硬件实现这一个设计流程被显示在图1中图1从图1所示的设计流程中我们可以发现以下几个问题1.人工将C\C++程序转换为HDL程序容易产生错误在现在的这种设计方法中,系统工程师先按期望的设计要求设计出一个C模块,并验证这个模块使其达到期望的设计要求然后系统工程师所设计的C模块被硬件设计人员手工转换为HDL模块这个转换过程不仅容易产生错误,而且还很浪费时间这是因为C\C++语言和HDL语言有着显著的区别首先,HDL的处理方式比C\C++的复杂C\C++程序采用顺序执行的处理方式,而HDL程序中既有顺序执行也有并行执行的处理方式要将C\C++程序转化为HDL程序必然要引入一些控制__,由这些__控制HDL程序的运行,但这样也容易产生错误其次,C\C++语言不涉及到时序关系由于C\C++语言不支持对时序的描述,系统工程师设计的系统模型只是验证了概念和算法,而只能对时间耗费上有一个大概的估计这就使得硬件实现时,为满足系统在时间上的要求,硬件设计人员必须对软件算法进行一定的改造或优化而这些改造或优化也有可能引入各种错误2.系统模块和HDL模块间缺乏__当系统模块被转换为HDL模块后,HDL模块成为整个系统设计的焦点为适应硬件实现的特点,硬件设计人员会更改系统设计人员的设计,但这种更改只是在HDL模块中进行,而系统设计人员设计的C模块并没有因此更改这就使得系统工程师设计的C模块和当前硬件设计人员设计的HDL模块缺乏必要的__当硬件设计人员遇到概念模糊或理解错误的地方时,往往不能马上从C模块中得到明确的解答此时,C模块的设计人员也不一定能为HDL设计人员提供有效的帮助3.多系统测试不但C模块要转换为HDL模块,对C模块的测试也要人工转换为在HDL环境下的测试这种转换也很复杂,而且浪费时间HDL设计人员是根据他所设计的HDL模块和系统要求来设计TESTBENCH,这使得硬件设计人员不可能利用软件设计人员所使用的测试文件同时,HDL人员要设计出一个好的TESTBENCH也需要比较长的时间为解决在现在设计流程中所带来的种种弊端,一种全新的设计流程被提出,这就是SystemC设计流程它能很好的解决上面所提到的各种设计弊端,大大提高设计效率图2是SystemC的硬件设计流程图2这种设计方法与现在常用的设计方法相比有很多优点1.精炼的设计方法使用SystemC设计系统,系统设计人员不必花费很大的精力将整个系统设计由C语言描述转换为HDL描述系统设计人员可以通过在C模块中很小的区域范围内加入必要的硬件和时序结构描述,从而将C模块方便准确地转化为一个有效的硬件设计,而避免将另行设计一个硬件模块利用SystemC设计方法,设计人员可以很轻松地实现一个设计的更改,或在优化算法时检测出一些设计错误并及时修改2.单一语言书写使用SystemC设计系统,整个设计都用一种语言设计系统,降低了对设计人员的要求,减少了语言转换时所造成的错误这一优点也使得设计人员可以在一个比较高的层次上进行系统模块设计在较高层次的设计会导致产生小的设计代码,使设计和仿真的速度比传统的设计方法要快很多这一点是很显著的
四、SYSTEMC基本概念1.模块模块是SystemC设计中的基本设计单元模块可以使得设计者将一个复杂的系统分割为一些更小但易于管理的部分SystemC模块的功能和作用与HDL语言中的模块是相类似的,这使得一位习惯于用HDL进行设计的设计人员可以很容易的转向用SystemC进行设计模块在SystemC中的关键字为SC_MODULE紧跟着关键字后的是模块的名称,如SC_MODULEfifo,这就定义了一个叫fifo的模块定义的模块也可以像HDL语言一样包含端口、__、其它模块、处理过程和结构体,这些单元实现用以实现模块的功能通过端口可以将几个模块连接起来模块被保存为.__件如果在一个模块中调用其它模块,只需像C++中引入库一样将要调用的模块作为一个库引入即可2.过程模块中的处理过程(pro__ss)类似于C语言中的子程序,与C语言中的子程序不同的的是它具有HDL语言中的触发功能处理过程(pro__ss)的具体工作部分被保存为.cpp文件处理过程的调用类似于在C语言中子程序的调用根据不同的要求,SystemC中有三种处理过程●Methods:SC_METHOD●Threads:SC_THREAD●ClockThreads:SC_CTHREADSC_METHOD是用来描述组合逻辑,它由输入__的变化触发,但不能在两次调用中保存控制状态并且在SC_METHOD中不能包含无限循环由于组合逻辑有可能导致毛刺的产生,从而影响系统性能,所以SC_METHOD不易太复杂下面是一个简单的SC_METHOD例子SC_MODULEexample{sc_inbooldin;sc_outbooldout;//端口voidinverter;//处理过程声明SC_CTORexample{SC_METHODinverter;sensitivedin;//处理过程由输入变化触发}};处理过程inverter如下voidexample::inverter{boolinternal;internal=din;//输入数据取反后由输出端口输出dout=~internal;}SC_THREAD是最常用的处理过程,基本上可以用在任何地方它是由输入__的变化触发,但与SC_METHOD不同的是它可以在两次调用这保存控制状态它的功能类似于积存器的功能SC_THREAD中可以包含有wait函数,这使得处理过程可以被挂起SC_CTHREAD是SC_THREAD的一种特殊情况SC_CTHREAD能产生更好的综合效果SC_CTHREAD中可以使用wait函数在不同的状态间加入wait函数,设计人员可以用SC_CTHREAD来实现状态机这种设计风格是简便的而且容易理解SC_CTHREAD只能由时钟__沿触发,而SC_THREAD可以由其它非时钟__触发如果在时钟上跳边触发,可以使用pos函数,反之用neg为进一步说明SC_CTHREAD,下面给出了一个SC_CTHREAD的例子SC_MODULEexample{sc_in_clkclock;//输入时钟sc_inbooltriggerdin;sc_outbooldout;voidinvert;SC_CTORexample{SC_CTHREADtogglerclock.pos;//时钟上升沿触发}}voidexample::invert{boollast=false;for;;{wait_untiltrigger.delayed==true;//等到下个时钟上升沿//且trigger=1再执行last=din;dout=last;wait;last=~din;dout=last;wait;//下个上升沿才更改数据}}3.端口与__与HDL语言相似,使用SystemC库就可以在C程序中加入端口和__这些原先C语言中没有的功能,使设计更复合硬件设计的要求模块与模块之间是通过端口__加一__只要两个端口被连接在一起,__就可以在它们之间进行传递对于这一点习惯用HDL进行设计的设计人员是很容易理解和接受的,因为这和HDL中端口的功能是一样的__只是在一个模块的内部使用,这也是和HDL中__的用法是一致的下面给出端口和__声明的例子sc_in“类型”din//输入端口dinsc_out“类型”dout//输出端口doutsc_inout“类型”q//输入输出端口qsc_signalsc_logici
[16];//创建一个具有16比特的逻辑型__i4.数据类型考虑到硬件设计的要求,SystemC中也加入了一些硬件设计中常用的数据类型具体如下sc_int有符号整数类型,最大有64个比特位sc_uint无符号整数类型,最大有64个比特位sc_bigint有符号整数类型,任意比特位,其最大比特位定义在sc_constants.h中sc_biguint无符号整数类型,任意比特位,其最大比特位定义在sc_constants.h中sc_bit二值数据,单比特位sc_logic四值数据,单比特位sc_bv二值数据,任意比特位sc_lv四值数据,任意比特位sc_fixed参数固定的有符号定点数sc_ufixed参数固定的无符号定点数sc_fix参数不固定的有符号定点数sc_ufix参数不固定的无符号定点数Userdefinedstructs用户自定义结构以上是一些SystemC的基本概念
五、结论SystemC是一种很有效的设计方法,它不仅可以帮助设计人员完成一个复杂的系统设计,还可以避免传统设计中的各种弊端,并提高设计人员的工作效率它的这些优点使SystemC在复杂的系统设计中大有作为并且习惯用HDL的设计人员,可以很容易地转到用SystemC设计。