预备打工人之SystemC学习

  • 例子
  • SystemC头文件
  • 模块
    • 模块的构造和析构函数
      • 构造函数
      • 析构函数
    • 模块的内部函数
  • 端口和信号
    • 端口和信号的定义
      • 端口
      • 端口的使用
    • 延时
    • 多驱动处理器
  • SystemC时钟和时间模型
    • 时钟
    • 时间
  • 基本数据类型
    • sc_bit和sc_logic数据类型
    • 固定精度整型数据类型
    • 任意长度比特和逻辑向量
    • 用户自定义类型
  • 定点数据类型
  • 进程
    • wait()和next_trigger()
      • wait()
      • next_trigger()
    • dont_initialize()和sensitive
  • 仿真与波形
    • 顶层函数sc_main()
    • 仿真控制
    • SystemC波形

例子

SystemC头文件

任何SystemC设计都必须包含合适的SystemC库定义的头文件,一般使用

#include “systemc.h”

但是在大型设计,常常希望只包括需要的名字空间以加快仿真,减少名字冲突。

模块

模块是设计的一个最基本的单位,是完成一个特定功能的基本单元。整个设计就是顶层模块。模块化的管理允许设计者把复杂的电子系统划分为更小的模块,每个模块独立进行设计和验证。

一个模块可以包含一些其他的基本元素,比如一个sram模块。

SC_MODULE(sram8x256){......//具体内容
};

其中,SC_MODULE就是模块的意思,name就是模块的名字。SC_MODULE是SystemC库中定义的一个宏,使用它就是定义了一个新的C++类:

#define SC_MODULE(name)\struct module_name: public sc_module

模块的构造和析构函数

构造函数

上面也说了,SC_MODULE 就是一个C++的类,所以也具有构造函数和析构函数。这两个函数的定义就不介绍了。而SC_MODULE 的构造函数除了初始化等功能外,还需要指定敏感表。例如:

SC_CTOR(sram8x256){men=new sc_uint<8>[256];for (int i=0;i<256;i++) mem[i]=0;SC_METHOD(sram_prc);sensitive<<clk.pos();
};

SystemC的构造函数用SC_CTOR标识与构造,其中构造函数的名字必须与模块的名字相同。sensitice表示敏感表,这说明这个模块对clk的上升沿敏感。而SC_METHOD表示这个模块是个进程。

SystemC包括三个基本的进程:SC_METHOD,SC_CTHREAD和SC_THREAD等。

析构函数

SystemC也有类似的类的析构函数,一般也有虚析构函数。

~sram8x256(){if(mem){delete mem;mem=0;}
}

与C++中一样,析构函数一般会清除函数申请的内存。

模块的内部函数

一个模块可以声明内部变量来保存模块内存的数据。

端口和信号

端口和信号的定义

端口

芯片通过关键与电路板上其他芯片或者原件通讯,管脚有输入、输出和双向管脚。在SystemC中,模块通过端口(Port)与与其他模块通讯,分为Input,Output和Inout。而两个模块间的端口用信号(Signal)连接,父/子模块的端口可以直接相连。

端口的数据类型可以是:
· C++数据类型,如int,char等
· SystemC专有数据类型sc_int、sc_bigint等
· 用户自定义结构
· 抽象端口

端口的定义方法:
sc_out <端口类型> 端口名

端口的使用

SystemC的端口定义了于特定端口类型相关的方法,如read()和write()。下面的语句是等效的。

mem[addr.read()]=wr_data.read();
mem[addr.read()]=wr_data;

而下面的语句是非法的:

mem[addr]=wr_data.read();

因为addr是sc_uint<8>类型,而数据的索引是unsigned int,c++不支持该类型转换。

延时

延时是模块的端口与模块内数据的重要区别之一。为了真实仿真硬件,所以需要手动添加延时。

多驱动处理器

在实际电路中多驱动也是很常见的。在SystemC中引入了解析逻辑向量信号来解决多驱动的问题。

sc_in_rv<n> x;//x是n比特的向量型输入端口

SystemC时钟和时间模型

时钟

时钟是电路中不可缺少的基本要素。在SystemC代码中可以找到

typedef sc_in<bool> sc_in_clk;

因此,时钟也可以自己定义。

此外,时钟被作为一个特殊的处理对象,是sc_clock类。
可以用如下的语句定义

sc_clock clk1("clk1",20,SC_NS,0.5,5,true);

表示20个时间单位,时间单位是ns,占空比是0.5,在5ns时第一次变化,开始是高电平

时间

时间常用来初始化或者改变其他变量。

sc_time time1(20,SC_NS);

第一个是时间长度,第二个是时间单位

另一个是等待时间

wait (10,SC_NS);

但是,SystemC时间分辨率是仿真系统处理器的最小实际单位。

基本数据类型

作为C++的一个硬件库,SystemC当然支持所有的C++数据类型,同时SystemC还定义了专有的数据类型。具体如下:

sc_bit和sc_logic数据类型

数字系统中最常用的四个逻辑为:
‘0’——逻辑低电平
‘1’——逻辑高电平
‘Z’——高阻态
‘X’——不定值

sc_bit只有‘1’和‘0’两种,而sc_logic还多有‘Z’和‘X’两种。sc_bit可以和bool型混用。

固定精度整型数据类型

sc_int和sc_uint类型这两种是固定宽度的整型数据。这两是1~64比特中任意宽度的整型数据类型。

sc_bigint和sc_biguint是任意位的整数.

任意长度比特和逻辑向量

sc_bv表示的比特向量类型

用户自定义类型

这里和C++一样,一般使用struct来创建。

定点数据类型

SystemC的四种基本定点数据类型

  • sc_fixed ,参数是静态的,设定后无法更改
  • sc_ufixed,是无符号数,参数是静态的。
  • sc_fix,是非静态的,其字长和整数部分长度可以是变量。
  • sc_ufix,wufuhao 是非静态的,其字长和整数部分长度可以是变量。

例如,

sc_fixed <16,8,SC_RND_ZERO,SC_SAT> sx_val;

说明一下,16表示总字长,8表示整数部分字长,SC_RND_ZERO是量化模式,SC_SAT是溢出模式
总结是,

sc_fixed <wl,iwl,q_mode,o_mode,n_bits> sx_val;

进程

在操作系统中,进程是程序在并发环境中给的执行过程,具有动态性、并发性、独立性、异步性和结构性五大特征。在SystemC中,进程是一个级别的执行单位。模块就可以是进程。
而SystemC中,进程是一个基本执行单位,共有三种

  • SC_METHOD,这个是最基础的模块,算是方法进程。每次敏感列表上有事件时,就会被调用,调用后就立刻返回。注意,这类进程中不能使用wait()这样的语句。
  • SC_THREAD,线程进程,能够被挂起和重新激活。线程进程使用wait进行挂机。当敏感列表上有事件时,线程进程被重新激活知道遇到新的wait再重新挂架。在一次仿真中,线程进行一旦退出,就不能再次进入。线程进程的一个方便的用途是藐视testbench的输入激励和输出获取。
  • SC_CTHREAD,钟线程进程是特殊的线程进程,他集成与线程进程,但是只能在上升沿或者下降沿被处罚或者激活。这可以更好的行为综合。

wait()和next_trigger()

wait()

wait()只能用于线程进程和钟控线程进程

  • wait(),等待敏感表中有事件发生。
  • wait(const sc_event&),等待事件发生,如下面的例子
sc_event e1,e2,e3;
wait (e1);
wait (e1|e2|e3);
wait (e1&e2&e3);
  • wait(double v,sc_time_unit tu),等待一段时间
wait(100,SC_NS)
  • wait(double v,sc_time_unit tu,const sc_enent &e),如果时间内事件发生或者超过时间,进程将被激发
  • wait(0,SC_NS)等待一个延时时间

next_trigger()

只能用于SC_METHOD进程。与wait参数相同,调用后立即返回,可以多次使用。

dont_initialize()和sensitive

dont_initialize()是希望进程在仿真的0时不被执行,sensitive是敏感表

仿真与波形

顶层函数sc_main()

SystemC本质上是C++,因此,使用大多数C++编译器都可以编译和连接。若将SystemC目标设计为可执行文件,必须设计SystemC顶层函数sc_main()。

int sc_main(int argc,char *argb[])

仿真控制

sc_start()在sc_main中调用,是指仿真开始。

  • void sc_start(); 没有参数就表示仿真一直进行到sc_stop()函数为止。

  • void sc_start(const sc_time & duartion); 是时间数据类型,说明仿真duartion个时间单位。

  • void sc_start(double t,sc_time_unit tu); sc_time_unit 表示时间单位

SystemC波形

SystemC运行将仿真结果保存为VCD格式,可以用HDL仿真软件打开。具有以下特点

  • 只有在整个仿真期间都存在的信号和变量才能被耿总
  • 任何类型的信号和变量都能被跟踪
  • 不同格式的波形文件可以在同义词仿真过程中同时产生。

预备打工人之SystemC学习(三) 基本语法相关推荐

  1. python学习三-基础语法

    python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...

  2. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

  3. C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  4. 统计学习三要素 模型+策略+算法

    统计学习方法都是由模型. 策略和算法构成的. 即统计学习方法由三要素构成, 可以简单地表示为:方法=模型+策略+算法 模型 统计学习首要考虑的问题是学习什么样的模型. 在监督学习过程中, 模型就是所要 ...

  5. 深度学习三巨头也成了大眼萌,这个一键转换动画电影形象的网站竟因「太火」而下线...

    机器之心报道 作者:魔王.杜伟 想不想在动画电影中拥有自己的角色?这个网站一键满足你的需求,不过竟因流量太大成本过高而下线. 近期热映的电影<花木兰>总是让人回想起 1998 年上映的同名 ...

  6. 2020届 AAAI Fellow名单新鲜出炉!!!深度学习三巨头终于齐聚

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 AAAI 是国际人工智能领域最权威的学术组织,Fellow 是该学会给予会员的最高荣誉 ...

  7. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  8. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

  9. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

最新文章

  1. AHOI2008 聚会
  2. 服务端渲染vs客户端渲染到前后端同构
  3. RNN以及LSTM的介绍和公式梳理
  4. Java阻塞队列 LinkedBlockingDeque
  5. C# 移动窗口 适用于有标题栏和无标题栏窗体 超级简单版
  6. Redis(1) 简介以及linux环境下的安装
  7. Windows 7 下右键发送到菜单项没了
  8. VIPKID义务援手韦博英语,承接其“嗨英语”部分学员
  9. 【elasticsearch】Elasticsearch : alias数据类型
  10. Powershell远程管理服务器客户端
  11. git status命令
  12. 高性能MySQL笔记——MySQL基础(一)
  13. 体验迟到:果然是魔鬼定律,一路上多种障碍
  14. educoder 数据挖掘算法原理与实践:决策树
  15. Matplotlib可视化图表
  16. 大学计算机专业吐槽,大学专业吐槽集锦:分分钟让你感觉“前途无亮”!
  17. SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数)
  18. 2022 ICPC Gran Premio de Mexico 2da Fecha Final standings - K. Krystalova‘s Trivial Problem
  19. LocalDateTime计算时间差
  20. mySQL提取姓氏_MySQL 提取姓名大写首字母缩写

热门文章

  1. Kubuntu一行命令重启音频引擎,解决声卡的小问题
  2. 通过结构计算矩形的面积
  3. 【华为OD机试 2023】 最多几个直角三角形(C++ Java JavaScript Python)
  4. html中实现input不可编辑的方法
  5. FTP服务搭建(ftpd、pure-ftpd、vsftpd)
  6. Quartz 定时任务时间设置
  7. jbpm4.4 使用之活动标签
  8. Nordic 芯片包 sdk 软件相关下载地址
  9. Dota2实时比赛数据结构
  10. 【邀请函】相约2022中国(南京)软博会,现场见!