1、http://baike.baidu.com/view/1018980.htm
百度百科介绍的很好,举例很清晰。
2、SystemC的三个基本进程:SC_METHOD,SC_THREAD,SC_CTHREAD及其举例。
①SC_METHOD:当敏感列表上有事件发生时,才被调用,(用法很像verilog中描述组合逻辑)调用后迅速返回;
②SC_THREAD:能够被挂起和重新激活,当敏感表上有事件发生,线程被重新激活运行到新的wait()语句再重新挂起,(主要用于对程序的验证);
③SC_CTHREAD:继承于线程进程,只能在时钟的上升沿或者下降沿被触发或者激活,(用于时钟精确的建模)。
SC_METHOD实例:
#ifndef_FULLADDER_H
#define_FULLADDER_H
#include<systemc.h>
SC_MODULE(FullAdder)
{
sc_in<sc_bit>A,B,Ci;
sc_out<sc_bit>S,Co;
void do_add()
{
S=(A.read())^ (B.read())^(Ci.read());
Co= (A.read())&(B.read())|
(B.read())&(Ci.read())|
(A.read())&(Ci.read());
};
SC_CTOR(FullAdder) //systemc的
构造函数
{
SC_METHOD(do_add); //表示do_add对A,B,Ci敏感
sensitive<<A<<B<<Ci;
}
};
#endif
SC_THREAD实例:
#ifndef_MONITOR_H
#define_MONITOR_H
#include<systemc.h>
SC_MODULE(Monitor)
{
sc_in<sc_bit>m_a,m_b,m_cin,m_sum,m_cout;
void pre_monitor()
{
while⑴{
cout<<m_a.read()<<m_b.read()<<m_cin.read();
wait(); //当执行到时程序被挂起,当敏感列表被触发时程序继续执行
cout<<m_sum.read()<<m_cout.read();
}
};
SC_CTOR(Monitor)
{
SC_ THREAD(pre_monitor); //表示当变量发生变化时, pre_monitor被激活或者重新激活;
sensitive<<m_a,m_b,m_cin,m_sum,m_cout ;}
};
#endif
SC_CTHREAD实例
#ifndef_DRⅣER_H
#define_DRⅣER_H
#include”systemc.h”
SC_MODULE(Drive){
sc_in_clk clk;
sc_out<sc_bit> d_a,d_b,d_cin;
void prc_drive();
SC_CTOR(Drive){ //表示prc_drive对时钟上升沿敏感
SC_CTHREAD(prc_drive,clk.pos());
}
} ;
#endif
接口
接口:集合一组固定的通信方法
Class mem_read_if: public sc_interface
{public:
virtual transfer_status read(…)=0;//读
虚函数(没有数据)
}
存储器读接口:
Class mem_write_if: public sc_interface
{public:
virtual transfer_status write(…)=0;//写
虚函数(没有数据)
}
Class ram_if: public mem_read_if,mem_write_if{
…
}
通道
通道实现了接口的内容,即它是一个实现通信功能的“模块”,只不过它仅完成通信功能。
例子:Ram通道:
Class ram :public sc_module,ram_if{
…
Transfer_status read(…)//定义读函数(需要用户自己定义具体功能)
{
…
}
Transfer_status write(…)//定义写函数(需要用户自己定义)
{
…
}
}
端口
端口:模块通过端口与通道连接
模块的端口的定义要与接口同一类才能连接
SC_MASTER(Master){
sc_in_clk clk;
sc_port<ram_if>ram_port; //实例化端口
Int data;
Unsigned int address;
…
void main_action{ //需要用户自己定义
…
Transfer_statusstatus=ram_port->write(address,data);//在功能函数中通过端口
… ;调用通道函数
Transfer_statusstatus=ram_port->read(address,data);//通过端口调用功能函数
…
}
…
}
随机推荐
- poi excel 合并单元格
结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip, colId, colId + c ...
- cors跨域问题
同源策略: 是由NetScape提出的著名的安全策略,所有支持javaScript的浏览器都使用这个策略.同源策略限制了一个源中加载文本或脚本与来自其它源中资源的交互方式. IE特例: 授信范围(Tr ...
- 如何在notepad++实现代码自动化排版(调用Astyle)
我先介绍这个怎么在notepad++中调用原版的astyle的方法. 在notepad++:运行或是F5, 在输入框中选择astyle.exe所在的目录,什么你没有astyle,下载地址https:/ ...
- Linux系统基础5周入门精讲(Linux发展过程)
什么是操作系统 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上,应用软件是无法直接操作硬件的,应用软件对硬件的操作必须调用操作系统的接口,由 ...
- 爬虫--Scrapy-持久化存储操作
总体概况 持久化存储操作: a. 磁盘文件 a) 基于终端指令 i. 保证parse方法返回一个可迭代类型的对象(存储解析到的页面内容) ii. 使用终端指令完成数据存储到制定磁盘文件中的操作 1. ...
- 好玩的Raft动画演示,原理秒懂
关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理: http://thesecretlivesofdata.com/raft/ 动画中 ...
- CC攻击与DDOS攻击区别
二者的攻击方式主要分为三种:直接攻击.代理攻击.僵尸网络攻击 CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些.这种攻击你见不到虚假IP,见不到特别大的异常流 ...
- Zabbix实现自动发现端口并监控
1.新建客户端需要的脚本 # vim discovertcpport.sh #!/bin/bash portarray=(`sudo netstat -tnlp|egrep -i "$1&q ...
- mysql主从复制搭建中几种log和pos详解
一.主从原理 Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...
- 关于AVAYA CM6和Asterisk(Freepbx)对接的笔记
最重要的两份参考文档: http://blog.sina.com.cn/s/blog_6db134880102vipo.html https://personalprojects.wordpress. ...