SystemC时正吴昊PartOne软硬件协同设计的引入ProblemswithPastDesignMethod•缺少统一的软硬件表示方法•划分依靠先验定义•不能够验证整个系统•通过HW/SW边界时很难发现不兼容问题•上市时间问题•描述更改比较困难NeedHardware-SoftwareCo-Design软硬件协同设计理论体系•系统任务描述(SystemTaskDescription)•软硬件划分(Hardware/SoftwarePartition)•软硬件协同综合(Hardware/SoftwareCo-synthesis)•软硬件协同仿真(Hardware/SoftwareCo-simulation)•与系统设计相关的低压低功耗设计,可测性设计等等。Concurrentdesign(并行设计)TraditionaldesignflowConcurrent(codesign)flowHWSWStartStartHWSWDesignedbyindependentgroupsofexpertsDesignedbySamegroupofexpertswithcooperation软件硬件协同设计的设计流程•用HDL语言和C语言进行系统描述并进行模拟仿真和系统功能验证;•对软硬件实现进行功能划分,分别用语言进行设计,并将其综合起来进行功能验证和性能预测等仿真确认(协调模拟仿真);•如无问题则进行软件和硬件详细设计;•最后进行系统测试。Hardwaresynthesis•抽象等级:–系统级设计–行为级综合:algorithmicsynthesis–RTL综合–逻辑级综合:netlist•值得考虑的问题:reuseofhardware(Core)什么是SystemC?•SystemC是一个开发硬件的面向对象的新型建模方法,建立在C++基础上,是为了方便系统级设计。•SystemC是一个开放的标准,由13家EDA和电子行业的公司共同控制。•包括:–ARMLtd.CadenceDesignSystems,Inc.CoWareFujitsuMentorGraphicsMotorolaNECSynopsys•SystemC的源码可以从网站上免费下载。PartTwoSystemC是由一些C++的类库组成SystemCLanguageArchitectureMethodology-SpecificLibrariesMaster/Slavelibrary,etcLayeredLibrariesVerificationlibraryTLMlibrary,etcPrimitiveChannelsSignal,Fifo,Mutex,Semaphore,etcStructuralElementsModulesPortsInterfacesChannelsDataTypes4-valuedlogicBitsandBitVectorsArbitraryPrecisionIntegersFixed-pointtypesEvent-drivenSimulationEventsProcessesC++LanguageStandard•用SystemC开发的硬件模型可以用标准的C++编译器来编译:Unix/Linux/Solaris:gccWindows:MSVC•经编译后形成一个可执行的应用程序使用SystemC设计流程SystemC基本语法•模块的定义SC_MODULE(mmu){……//Detailsofthedesign}•SC_MODULE是SystemC库中的一个宏,使用它定义一个模块实际上以sc_module为基类,定义了一个新的C++类。classmmu:publicsc_module{……//Detailsofthedesign}数据类型•允许C++的基本数据类型,bool、int、short、char等;•SystemC的专有数据类型sc_int、sc_bit、sc_logic等,时钟作为一个特殊的对象处理sc_clock;•用户自定义类型structpacket{char[6]source_address;chardestination_address;chardata[1514];}模块的端口•模块的端口使数据能够在模块间通过,模块之间通过信号将端口连接起来。•SystemC的类库中预先定义的端口包括sc_in(输入端口),sc_out(输出端口),sc_inout(双向端口)。•SystemC允许通过对基本端口类型sc_portIF,N扩展生成更复杂的端口。模块的信号•一个顶层模块可能有几个模块组成,这些模块需要信号相互连接。•SystemC用sc_signalT来定义信号。端口和信号的绑定•位置关联:所有的端口都是按照申明的顺序位置进行一一对应的。sendersender1(SENDER1);sender1pkt_in1id1clock1;•名字关联:利用名字的一一对应来连接信号和模块的端口。sendersender1(SENDER1);sender0.pkt_out(pkt_in1);sender0.source_id(id1);sender0.CLK(clock1);模块的构造函数•模块的构造函数完成创建和初始化一个模块的最初工作,它在一个模块被创建时执行。•SystemC模块的构造函数,除了完成C++所要求的基本功能外,还用于初始化进程的类型并创建进程的敏感表。•SystemC的构造函数用SC_CTOR标识,构造函数的名字必须与模块名字相同。SystemC的基本进程•方法进程SC_METHOD:SC_METHOD(proc);sensitive…;•当敏感表上有事件发生发生,它就会被调用,调用后立刻返回。•只有SC_METHOD进程返回后,仿真系统的时间才有可能前进。线程进程SC_THREAD•SC_THREAD(proc);sensitive…;•线程进程的内部使用一个无穷循环。能够被挂起和激活。•SC_THREAD类进程使用wait()挂起,当敏感表有事件发生,线程进程被激活运行,直到遇到新的wait()语句再重新挂起。钟控线程进程SC_CTHREAD•钟控线程进程继承于线程进程,但只能在时钟的上升沿或者下降沿被触发或者激活。•SC_CTHREAD(proc,clk.pos());仿真与波形跟踪•SystemC设计的最顶层函数是sc_main(),在sc_main()将设计中的所有模块连接在一起,定义时钟,并引入波形跟踪。•intsc_main(intargc,char*argv[]){…//Body}仿真与波形跟踪•SystemC使用了sc_start()函数,sc_strat()一旦被调用,仿真就开始了。•Sc_start()函数控制了所有时钟的产生,并在适当的时刻激活SystemC调度器。•SystemC调度器控制整个仿真过程的调度工作。波形跟踪•SystemC波形跟踪在sc_main()函数中进行,可以生成vcd、wif、isdb三种标准的波形文件;•生成vcd文件的函数是sc_trace_file*trace_file=sc_create_vcd_trace_file(“filename);•SystemC调度器到底要跟踪哪些信号,使用sc_trace(trace_file,object,“name);•仿真结束时要将波形跟踪文件关闭sc_close_vcd_trace_file(trace_file);接口、端口和通道•接口是一个C++抽象类。它只定义了一组抽象方法,但不定义这些方法的具体实现。•接口是可以分层的,复杂的接口可以有多个简单的接口继承得到。•类sc_interface是所有接口类的基类。通道•接口只是定义了一组通信方法,而不具体负责这些方法如何实现。•通道是一个或多个接口方法的实现者,通道也可以连接两个或多个模块。•SystemC允许用户自定义通道。•通道分为两种:基本通道和分层通道。基本通道•SystemC定义了若干基本通道,他们不包含任何进程,也不能够直接或者间接的调用其它基本通道。•基本通道类型:sc_signalT;sc_mutex;sc_fifoT;sc_semaphore;sc_bufferT分层通道•分层通道是一个实现了一个或者多个接口的模块,可以包含进程,可以直接调用其它通道。•分层通道能够建模复杂的硬件模块。端口•端口用于和特定的通道接口相连,端口必须在模块中使用。除了基本端口类型,SystemC允许用户自定义端口类型。•一个端口可以同时连接到一个或者多个实现了同一接口的通道上。•端口的定义:sc_portinterface_type,channel_nember寄存器传输级SystemC设计•综合是指将RTL或者行为级的硬件描述语言的描述转换为满足约束条件的网表的过程。•综合技术中的逻辑综合,是在设计的寄存器传输级对系统进行描述,并且利用逻辑综合工具得到系统的门级实现。•SystemC描述可以使用的综合工具有synopsys公司的CoCentricSystemCCompiler。RTL设计的注意事项•模块的功能和端口的设计在行为级仿真要确定,在RTL仿真阶段对它们的修改,工作量会很大;•SystemC的可综合语言子集和可综合数据类型。•需要考虑延时问题SystemC#includesystemc.hSC_MODULE(dff_rst){sc_in_clkclk;sc_inboolrst;sc_inbooldin;sc_outbooldout;voiddo_it();•SC_CTOR(dff_rst){SC_METHOD(do_it);sensitive_posrstclk;}};voiddff_rst::do_it(){if(rst.read())dout.write(0);elsedout.write(din.read());}VerilogHDLTimescale1ns/1psModuledff_rst(clk,rst,din,dout);inputclk,rst,din;outputdout;regdout;Always@(posedgeclkorposedgerst)beginif(rst)dout=1’b0;elsedout=din;endendmoduleSystemC与VerilogHDL的比较SystemC的特点•高仿真速度和建模效率;•时序和行为可以分开建模;•支持从系统级到门级的无缝过渡;•支持系统级调试和系统性能分析发展前景•SystemC与VHDL和Verilog比较•SystemC与使用C语言描述的比较