SystemC学习(1)— SystemC安装与HelloWorld
一、前言
参考文档:
1、ubuntu系统安装systemc-2.3.4流程
2、SystemC语言学习笔记
3、SystemC资料2.ppt
4、SystemC入门笔记
二、安装包下载与安装
我们可以直接从官网下载SystemC的库安装包,SystemC官网地址:https://www.eda.org/downloads/standards/systemc
由于较高版本安装有些问题,所以我们选择systemc-2.3.3版本,如下所示选择下载:
下载好后解压:
然后我们需要新建一个安装目录:
mkdir /home/softs/systemc
然后进入解压后的目录,新建一个文件夹并进入:
cd systemc-2.3.3/
mkdir build && cd build
然后配置安装信息,指定安装目录:
../configure --prefix=/home/softs/systemc
如果要指定 C++11 标准,使用如下命令
../configure CXXFLAGS="-std=c++11" --prefix=/home/softs/systemc
如果要指定gcc工具的路径,使用如下命令
../configure --prefix=/home/softs/systemc/2.3.2 CC=/usr/local/gcc9/bin/gcc CXX=/usr/local/gcc9/bin/g++
然后使用如下命令进行编译和安装:
make -j 8
make install
然后在~/.bashrc添加如下内容设置环境变量
export SYSTEMC_HOME=/home/softs/systemc
export LD_LIBRARY_PATH=${SYSTEMC_HOME}/lib-linux64/:$LD_LIBRARY_PATH
如果是tcsh则添加如下内容设置设置环境变量
setenv SYSTEMC_HOME /home/softs/systemc
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${SYSTEMC_HOME}/lib-linux64
三、Hello测试
编写一个测试文件hello.cpp如下所示:
#ifndef _HELLO_H
#define _HELLO_H
#include "systemc.h"
SC_MODULE(hello)
{
SC_CTOR(hello)
{
cout<<"Hello, SystemC!"<<endl;
}
};
#endif
//main.cpp
int sc_main(int i, char* a[])
{
hello h("hello");
return 0;
}
使用如下命令进行编译:
g++ hello.cpp -I${SYSTEMC_HOME}/include/ -L${SYSTEMC_HOME}/lib-linux64 -o hello -lsystemc
然后使用如下命令执行:
./hello
然后可以成功看到打印:
四、逻辑实例
如下所示,编写一个2输入与非门的组合逻辑实例:
SC_MODULE(nand2) {
sc_in<bool> A,B;
sc_out<bool> F;
void do_nand(){
F = !(A&B);
}
SC_CTOR(nand2){
SC_METHOD(do_nand);
sensitive<<A<<B;
}
};
编写对应的testbench
SC_MODULE(tb) {
sc_out<bool> a,b;
sc_in<bool> f;
sc_in_clk clk;
void gen_input(){
wait(); a=0; b=0;
wait(); a=0; b=1;
wait(); a=1; b=0;
wait(); a=1; b=1;
wait(); a=0; b=0;
wait(); a=0; b=0;
}
void display_variable(){
cout<<"a="<<a<<",b="<<b<<",f="<<f<<endl;
}
SC_CTOR(tb) {
SC_CTHREAD(gen_input, clk.pos());
SC_METHOD(display_variable);
sensitive<<f<<a<<b;
dont_initialize();
}
};
在sc_main中将其实例化并创建波形记录文件;
int sc_main(int i, char* argv[])
{
sc_signal<bool> signal_a;
sc_signal<bool> signal_b;
sc_signal<bool> signal_f;
sc_clock clk("Clk", 20, SC_NS);
nand2 N2("Nand2");
N2.A(signal_a);
N2.B(signal_b);
N2.F(signal_f);
tb tb1("tb");
tb1.clk(clk);
tb1.a(signal_a);
tb1.b(signal_b);
tb1.f(signal_f);
// waveform trace file creation
sc_trace_file *tf = sc_create_vcd_trace_file("Nand2");
sc_trace(tf, N2.A, "A");
sc_trace(tf, N2.B, "B");
sc_trace(tf, N2.F, "F");
sc_start(200, SC_NS);
sc_close_vcd_trace_file(tf);
return 0;
}
使用如下命令进行编译:
g++ hello.cpp -I${SYSTEMC_HOME}/include/ -L${SYSTEMC_HOME}/lib-linux64 -o hello -lsystemc
然后使用如下命令执行:
./hello
然后可以成功看到打印:
然后可以看到生成了对应的波形文件
将其打开可以看到信号的变化