系统级设计描述语言SystemC.ppt

上传人:sccc 文档编号:5753731 上传时间:2023-08-16 格式:PPT 页数:72 大小:399.08KB
返回 下载 相关 举报
系统级设计描述语言SystemC.ppt_第1页
第1页 / 共72页
系统级设计描述语言SystemC.ppt_第2页
第2页 / 共72页
系统级设计描述语言SystemC.ppt_第3页
第3页 / 共72页
系统级设计描述语言SystemC.ppt_第4页
第4页 / 共72页
系统级设计描述语言SystemC.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《系统级设计描述语言SystemC.ppt》由会员分享,可在线阅读,更多相关《系统级设计描述语言SystemC.ppt(72页珍藏版)》请在三一办公上搜索。

1、系统级设计描述语言SystemC,徐宁仪Xuny smth东主楼9区324房间62781914,版权所有 2004,第三部分 SystemC行为建模基础,教材:陈曦 徐宁仪SystemC片上系统设计,科学出版社,2003本ppt大部分内容参考此书,仅作为大学教学之用,请勿用于商业,课程主要内容,共讲4次,争取讲清楚Why&How,重点是Concept,内容包括:为什么用SystemC做片上系统设计?SystemC基本语法*SystemC行为建模基础*SystemC交易级建模与通信细化*SystemC 方法库Master/Slave库验证库,第三部分,SystemC行为建模基础,一些重要概念回顾

2、,SystemC是一种系统描述语言,而不仅仅是一种新的硬件描述语言。,SystemC 的主要目的是实现用单一语言完成设计规范、系统体系结构分析、验证平台和行为模型。,用SystemC的行为模型描述的算法模块比RTL模块快10100倍。,SystemC的更大价值在于其提供高层次设计流程。行为级综合工具经过多年的发展渐渐成熟,SystemC和行为综合工具结合的设计方法将会大大提高设计和验证效率.SystemC特别为行为综合设计的语法将使它成为非常适合行为级综合的设计语言。,行为建模的目的,系统体系结构探索当要建模的目标系统十分复杂时,利用行为模型迅速建模,使得设计者对目标设计有更清楚的理解则有利于

3、软硬件划分、减少系统功耗。,嵌入式软件开发与调试基于行为模型的软硬件协同验证更使得设计初期(尤其在硬件平台已经做好之前)就可以对软件进行初步调试,从而节省设计周期。基于行为模型的验证方法也能够保证验证平台的一致性。,利用行为级综合工具得到RTL级的设计。,SystemC 行为建模,SystemC行为级建模中一个很重要的概念被称为交易级建模(Transaction Level Modeling或者TLM)。(稍后讲述),SystemC的接口(Interface)、端口(Port)和通道(Channel)三个概念是进行SystemC 行为建模的基础。(本部分的重点是理解这三个概念),系统抽象:行为

4、,通信和时序,系统抽象的三个关键元素行为:算法(运算,控制)通信:各个算法模块之间的数据交互,控制配合时序:行为和通信的在时间域上的协调举例,系统抽象的三个元素举例存储器,存储器的行为读:read(address)写:write(address,data)复位:reset存储器的通信RTL级:地址总线,数据总线,读信号,写信号,复位信号交易级:目的地址,数据时序信号配合时序读写速度复位时间,系统抽象的三个元素举例OFDM接收机,行为:OFDM(正交频分复用)的接收算法通信:数据通路,控制通路时序:各个模块之间的时钟周期配合,算法本身配合,系统抽象的三个元素举例嵌入式处理器,行为:完成汇编语言描

5、述的程序通信:Flash CPUCPURAMDMARAMIOCPU时序:系统总线,行为建模对语言的要求(1 of 2),行为和通信分离(分开描述,时序隐含)系统体系结构探索,需要对行为和通信的各种组合进行探索(1CPU?3CPU?共享总线?直接通道?)嵌入式软件开发与调试(软件开发不关心具体硬件通信细节)优点行为(或者计算)和通信分开,称为正交化处理。可以分别在各自的部分进行修改,而不影响另外一部分的功能和完整性。处理复杂问题的方法 分而治之时间:分步骤细节:分层本质:正交,行为建模对语言的要求(2 of 2),接口方法调用(Interface Method Call)解决”行为和通信分离后,

6、通信如何进行”的问题一组给定的通信方法(method)被称为接口(interface)接口(或者说通信方法)由通道实现。模块能够使用它们的端口(port)来与实现相应接口的通道进行互连。,接口的特性是不牵扯具体实现;所以它能够联系行为与通信,SystemC的行为建模语言支持,模块(module)是系统行为的主要载体。通道(channel)是通信的主要载体。时序隐含在模块和通道的描述中。特点行为和通信分开支持接口方法调用,Big Picture,接口(Interface),接口的实现:C+中的抽象类。(抽象类和纯虚函数),接口的特性是不牵扯具体实现;所以它能够联系行为与通信,接口(Interfa

7、ce),抽象类的特点是它定义了一组抽象方法(这里”方法”是C+中的一个名词,通常理解为类的成员函数),但不定义这些方法的具体实现(这里实现指的是给出成员函数的函数体部分),通道(channel)实现一个或者多个接口。,存储器接口实例,enum transfer_status TRANSFER_OK=0,TRANSFER_ERROR;存储器读接口:template class mem_read_if:public sc_interfacepublic:virtual transfer_status read(unsigned int address,T,存储器接口实例,存储器写接口:templa

8、te class mem_write_if:public sc_interfacepublic:virtual transfer_status write(unsigned int address,T,存储器接口实例,复位接口:class reset_if:public sc_interface public:virtual bool reset()=0;,存储器接口实例,完整的RAM接口:templateclass ram_if:public mem_write_if,mem_read_if,reset_ifpublic:virtual unsigned int start_address(

9、)const=0;virtual unsigned int end_address()const=0;,结论,我们将mem_read_if和mem_write_if定义为模板类是因为抽象的存储器的每一个单元可以存储的内容可以是任何类,如存储一个字节char,一个半字short,一个字int,一个packet。,接口是可以分层的,复杂的接口可以由多个简单的接口继承而得到。,类sc_interface是所有接口类的父类,所有其它类都直接或者间接的从类sc_interface继承而来。,端口(port),基本的SystemC端口类型:sc_in、sc_out、sc_inout,为了满足行为建模的需要

10、,SystemC允许用户自己定义端口类型。sc_port,连接模块内的进程(行为)和通道(通信),端口,设计中端口所实际连接的通道的数目可以通过size()方法来访问。如,可以通过ram_port0.size()得到实际连接到ram_port0的通道RAM的数量。,端口,端口必须与特定的通道接口相连,或者同父模块的端口相连。一个模块的端口连接到零个、一个或者多个通道,或者零个、一个或者多个父模块的端口,但必须至少连接到1个通道或者父模块的端口上。,类sc_port是所有端口的基类,它是一个模板类。IF是接口类型,N是所连接的同一类型的通道数目,也就是接口数,它的缺省值是1。,端口实例-RAM读

11、写端口,SC_MODULE(Master)sc_in_clk clk;sc_port ram_port;/端口实例 void main_action();/见下一页 int data;unsigned int address;SC_CTOR()SC_CTHREAD(main_action,clk.pos();,端口实例-RAM读写端口,void Master:main_action()wait();int i=0;address=0;/any valid address while(i+write(address,data)/Display data else coutread(address

12、,data)/Display data else coutRAM read failendl;wait();address+;,通道基础,在SystemC中,接口本身只是定义了一组通信方法,而不具体负责这些方法如何实现。通道才是这些接口方法的实现者。通道可以实现一个或者多个接口。通道可以连接一个或者多个模块。,SystemC中通道分为两种:基本通道和分层通道 基本通道不包含任何进程,也不对外展现出任何可见结构,它们也不能够直接的或者间接的调用其它基本通道。分层通道本身是一个模块,可以包含进程、子模块,也可以包含和调用其它通道。,端口与通道的关联,#include source.h#includ

13、e sink.h“#define PERIOD 20class Top:public sc_module public:sc_clock clk;sc_fifo fifo1;source source1;sink sink1;,Top(sc_module_name name,int size):sc_module(name),fifo1(Fifo1,size),source1(source1),sink1(sink1),clk(Clk,PERIOD,SC_NS)/端口与通道的关联 source1.write_port(fifo1);source1.clk(clk);sink1.read_por

14、t(fifo1);sink1.clk(clk);,基本通道,基本通道不包含任何进程,也不对外展现出任何可见结构,它们也不能够直接的或者间接的调用其它基本通道。,SystemC 2.01中定义了若干基本通道类型,它们是:sc_signal,sc_signal_rvsc_mutexsc_fifosc_semaphoresc_buffer,基本通道-sc_signal,sc_signal是最基本的通道,它用于连接模块的基本端口sc_in、sc_out和sc_inout。,最多只有一个sc_out或者sc_inout可以连接到sc_signal,否则就会产生典型的多驱动情况。,可以有多个sc_in同时

15、连接到sc_signal。,sc_signal继承于基本通道类,并实现了sc_signal_inout_if接口。sc_signal_inout _if接口 的最重要成员函数read()和write()。,基本通道-sc_signal_rv,sc_signal_rv是所谓“解析的”信号通道,与sc_signal的不同之处是它允许同时有多个端口连接到其上并进行写操作。,基本通道-sc_buffer,sc_buffer继承于sc_signal,并重载了write()和update()函数。,sc_buffer不管write()写的数据是否与原数据相同,都要求进行数据更新;而sc_signal首先要

16、检查新数据是否与原数据相同,如果不同才进行更新。,基本通道-sc_fifo,FIFO示意图,基本通道-sc_fifo,sc_fifo是SystemC核心语言库中已经实现了的FIFO通道。,Size代表FIFO的总单元数,对于sc_fifo,Size的默认值为16。,sc_fifo例化的例子,sc_fifo fifo1;/一个可以存储整型数据的深度为16的FIFO sc_fifo fifo2(64);/一个可以存储64个packet类型数据的FIFO,sc_fifo实现的接口,sc_fifo实现的是接口sc_fifo_in_if和sc_fifo_out_if,sc_fifo_in_if,temp

17、late class sc_fifo_in_if:virtual public sc_interfacepublic:/blocking read virtual void read(T,sc_fifo_out_if,template class sc_fifo_out_if:virtual public sc_interfacepublic:/blocking write virtual void write(const T,使用sc_fifo的例子信源信宿通过FIFO通信,信源(Source)和信宿(Sink)通过FIFO通信。,信源模块,class source:public sc_mo

18、dule public:sc_in_clk clk;sc_port write_port;SC_HAS_PROCESS(source);source(sc_module_name name):sc_module(name)SC_CTHREAD(main,clk.neg();void main();/See in next slide;,信源模块,void source:main()int i=0;const char str=For any problems,feel free to contact the author via Email:chenxiee!n;wait();while(tr

19、ue)if(rand(),信宿模块,#include class sink:public sc_module public:sc_in_clk clk;sc_port read_port;SC_HAS_PROCESS(sink);sink(sc_module_name name):sc_module(name)SC_CTHREAD(main,clk.neg();void main();/See in next slice;,信宿模块,void sink:main()char c;while(true)if(rand(),Top模块,#include source.h#include sink.

20、h“#define PERIOD 20class Top:public sc_module public:sc_clock clk;sc_fifo fifo1;source source1;sink sink1;,Top(sc_module_name name,int size):sc_module(name),fifo1(Fifo1,size),source1(source1),sink1(sink1),clk(Clk,PERIOD,SC_NS)/端口与通道的关联 source1.write_port(fifo1);source1.clk(clk);sink1.read_port(fifo1

21、);sink1.clk(clk);,sc_main(),#include#include tb.hint sc_main(int,char*)unsigned size=16;Top Top1(“Top1,size);cout Testbench started,the simulation result is:endl;sc_start(100000,SC_NS);coutnendl;return 0;,从本例看模块、接口、端口、通道之间的关系,接口是一个C+抽象类,它定义了一组抽象方法,但不定义这些方法的具体实现。,通道实现一个或者多个接口。也就是说,通道必须继承一个或者多个接口,这些接口

22、中定义的抽象方法必须在通道中实现。,端口总是与一定的接口类型相关联的,端口只能连接到实现了该类接口的通道上。,通过端口,模块中的进程可以连接到通道并使用通道提供的方法,基本通道-sc_semaphore,通常翻译为信号量。,信号量代表可用资源实体的数量,所以可以认为信号量就是一个资源计数器,它限制的是同时使用某共享资源(也称为临界资源)的进程的数量。信号量计数的值代表的就是当前仍然可用的共享资源的数量。,sc_semaphore实现的是sc_semaphore_if接口,定义见下页。,sc_semaphore_if,class sc_semaphore_if:virtual public sc

23、_interfacepublic:/lock(take)the semaphore,block if not available virtual int wait()=0;/lock(take)the semaphore,return-1 if not available virtual int trywait()=0;/unlock(give)the semaphore virtual int post()=0;/get the value of the semphore virtual int get_value()const=0;,sc_semaphore:wait(),其中,wait(

24、)方法获得一个信号量,其作用效果是获得一份资源的使用权,使信号量计数减一,如下面的实现代码。int sc_semaphore:wait()while(in_use()sc_prim_channel:wait(m_free);-m_value;return 0;,sc_semaphore的构造函数,sc_semaphore(int init_value_);sc_semaphore(const char*name_,int init_value_);,sc_mutex,具有锁定和非锁定两种状态。当互斥(器)已经由另外的进程锁定,这时申请互斥的进程就会被阻塞,直到锁定互斥的进程将互斥解锁。,sc_

25、mutex_if,互斥实现的接口为sc_mutex_if。,class sc_mutex_if:virtual public sc_interfacepublic:/blocks until mutex could be locked virtual int lock()=0;/returns-1 if mutex could not be locked virtual int trylock()=0;/returns-1 if mutex was not locked by caller virtual int unlock()=0;,直接通道调用,在同一模块内,各个进程之间也需要通信。它们

26、可以通过共享变量、握手信号、模块内通道等方式通信。如果它们之间的通信是通过模块内通道,则此时需要进行直接通道调用。,下面给出一个使用sc_mutex的直接通道调用的例子。,直接通道调用的实例,实例的代码,SC_MODULE(mutex_example)sc_in_clk clk;sc_out data;/Port to be protected sc_mutex protect;void writer1()wait();while(true)protect.lock();data.write(rand();protect.unlock();wait();/Other Details of th

27、e design,直接通道调用的另外一种形式,不通过端口,进行直接通道调用 ram*ram0;/通道实例ram0void main_action();SC_CTOR(PortLess)SC_CTHREAD(main_action,clk.pos();ram0=new ram(RAM,0,255);,直接通道调用的另外一种形式,void PortLess:main_action()while(addresswrite(address,data);/不通过端口直接调用通道/实现的方法coutRAM write at address:address,data is:dataendl;wait();,

28、通道的设计规则检查,设计规则是指设计中不能够违反的设计法则,如一个sc_signal只能被一个进程驱动,一个sc_fifo只能连接一个读端口和一个写端口等。在设计中进行规则检查能够尽早发现设计中产生的一些不合理性。,设计规则检查实际上是一种形式验证(Formal Verification),通道的设计规则检查,设计规则检查分为静态规则检查和动态规则检查。静态规则检查是指在系统运行前进行的静态检查,比如一个sc_fifo只能连接一个读端口和一个写端口的检查。但是只有静态规则检查是不够的,有些规则检查必须在运行时间进行,这就是动态规则检查。比如,一个sc_signal只能被一个进程驱动的规则只能在

29、运行时动态地进行检查。,通道的设计规则检查,作为SystemC的用户,首先要了解有哪些设计规则,在设计中不能够违反这些规则。其次用户在实际设计中也可以设计自己的规则检查,以使自己的代码更好的满足设计要求。,一个静态规则检查的例子,SystemC约定:当一个端口与一个通道相连接,这时相应通道的:register_port()函数就会被调用。用户可以自己重载这个函数进行专门的静态设计规则检查。,本例中要检查的设计规则:sc_fifo的读用户和写用户都只能有一个。重载的:register_port()函数如下页:,一个静态规则检查的例子,template Inline void sc_fifo:re

30、gister_port(sc_port_base,分层通道,分层通道具有可见结构,可以包含进程,可以直接调用其它通道,它是一个实现了一个或者多个接口的模块,分层通道,常见的分层通道有两种:一是在一个通道中直接例化并使用其它通道,被例化的通道可以是分层通道,也可以是基本通道。这种类型的通道比较常见,被称为一般分层通道;二是一个通道利用端口进行间接通道调用,调用穿越了一个以上的通道。被穿过的通道似乎被“合成”到了一起,这种通道是一种特殊的分层通道,称作合成通道(composite channel)。合成通道间接的体现了通道的层次性。,一般分层通道,凡是例化了其它通道的通道都可以归入一般分层通道之列

31、。如下例:,TLM FIFO的准代码,class tlm_fifo:public sc_module,public sc_fifo_in_if,public sc_fifo_out_if,public reset_ifpublic:sc_in clk;/Other Signal Declaration/FIFO in FIFO,rtl_fifo1 is an embedded channel rtl_fifo rtl_fifo1;/RTL FIFOprivate:unsigned m_size;/actual size of FIFOpublic:tlm_fifo(sc_module_name

32、 name,unsigned size):sc_module(name),rtl_fifo1(rtl_fifo1,size+1),m_size(size)assert(m_size0);rtl_fifo1.clk(clk);rtl_fifo1.rst(rst);/Other port assiciation,tlm_fifo:write(const T&data),virtual void tlm_fifo:write(const T,合成通道,一个模块可以利用端口穿越了一个以上的通道进行间接通道调用。被穿过的通道似乎被“合成“到了一起。,我们假定设计好了一个接口类GetFIFO_if,它的一

33、个成员函数getWriteFIFO()返回的是一个FIFO通道的指针,如返回上节中定义的tlm_fifo的指针tlm_fifo,再假设又我们实现了一个GetFIFO通道,data是一个初始化了的char型数据。那么在Source模块中就可以通过下面的方式来写FIFO:read_port-getWriteFIFO()-write(data);,本章总结,本章讲述了接口、端口、通道三个基本概念,重要的是弄清它们之间的关系。,本章结束,抽象类和纯虚函数,在C+中,不是所有类都有实际的意义。有一种类表达的是一种根本不存在的抽象概念,即所谓抽象类。,一个抽象类的例子如Shape,它本身作为一个抽象的形状是没有意义的,只有具体化成具体的形状如圆类Circle或者三角形类Triangle才有意义。,抽象类和纯虚函数cont,Shape作为抽象类,其定义可以如下:class Shapepublic:virtual void rotate(int)=0;virtual void draw(int)=0;virtual void is_closed()=0;它的所有方法用“=0”标识表示纯虚函数(只有函数声明,没有函数体)。C+不允许创建抽象类对象,因为一个抽象类对象是没有意义的,所以下面的代码是错误的:Shape S;/Shape是抽象类,Return,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号