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);//通过端口调用功能函数
…
}
…
}
随机推荐
- Analysis of Web.xml in Hello1project
一下是hello1 web inf 里的 web.xml <?xml version="1.0" encoding="UTF-8"?><w ...
- python selenium 三种等待方式详解[转]
python selenium 三种等待方式详解 引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...
- django 模板context的理解
context作为view与template之间的桥梁,理解它的工作原理对于djagno的模板工作机制至关重要. class ContextDict(dict):#上下文词典,由词典可以通过conte ...
- Mybatis的回顾学习
<!--id:statementId resultType:查询结果集的数据类型 parameterType:查询的入参 --> <selectid="getUserByI ...
- mysql root密码修改
1.假如之前没设置密码,现在想成test mysqladmin -u root password test 2.假如之前密码是1234,现在想改成test mysqladmin -u root -p1 ...
- APP-7-百度地图移动轨迹
1.代码部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...
- python 可迭代对象与迭代器
生成器函数的工作原理只要 Python 函数的定义体中有 yield 关键字, 该函数就是生成器函数. 调用生成器函数时, 会返回一个生成器对象. 也就是说, 生成器函数是生成器工厂. 调用生成器函数 ...
- Cookie安全小结
Cookie机制:一般来说,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中.服务端响应头的Set-Cookie字段可以添加 ...
- 遍历DOM树,获取所有兄弟节点
获取兄弟节点的常用方法有: 方法 说明 siblings() 选取所有兄弟节点 next() 选取后面兄弟节点 nextAll() 选取所有后面的兄弟节点 nextUntil() 选取所有 ...
- 全局异常 同时ajax或是web跳转
F8功能强大 在java代码debug的时候,F8键可直接跳到下一个类中.免去下一步 只用把之前两种方式合并即可,就是在exception包中不要ajax的异常,将其放入到web异常中,用if ...