SystemC Study

本文详细介绍了SystemC在硬件架构探索、验证、设计和软件开发中的角色,包括如何安装和使用SystemC,以及其基本概念如SC_MODULE、进程、端口和通道。此外,还讨论了SystemC与UVM通过DPI的交互,以及TLM2接口。文章提供了一个简单的SystemC示例,并涵盖了SystemC与Verilog之间的接口和通信。

简介

  SystemC的意义,网上能查到,这里总结一下,System C是C++的library,类似UVM是systemverilog的library

下图是SystemC在整个项目中的角色

  • 硬件架构探索,创建算法、性能模型;
  • 验证工程师做为参考模型(经过DPI接口调用);
  • 设计工程师将其做为design spec,设计RTL;
  • 软件工程师做为软件开发的硬件模型;
  • 使多种提早测试成为可能

一 按照

去官网下载tar包, SystemC

我下载的是SystemC 2.3.3 (Includes TLM), Core SystemC Language and Examples (tar.gz)

在linux上安装

1.放到linux 任意路径,tar -zxvf 解包

2.在systemc-2.3.3中有一个INSTALL的文件,安装步骤就可以了

    2.1 mkdir objdir; 2.2 cd objdir;  2.3 export CXX=g++ or setenv CXX g++ 2.4 ../configure --prefix=/usr/local/systemc (重新指定安装路径) 2.5 make; 2.6 make check 2.7 make install 2.9 cleean

example 测试

在安装的文件下有 example, 进入make,

如果报错的话根据提示看一下就好,遇到了TARGET_ARCH, 使用的机器是linux64, default 这个变量是空的

二 Start with example

这里写了一个简单的hello world, 并自己写了一个makefile

example: hello world

  例子没什么好说的,System C电子系统设计一开始就把code show出来了

#ifndef _HELLO_H
#define _HELLO_H
#include "systemc.h"

SC_MODULE(hello) {
  SC_CTOR(hello) {
    cout<<"Hello SystemC!"<<endl;
  }
};
#endif

#include "hello.h"

int sc_main(int argc, char * argv[]) {
  hello h("hello");
  return 0;
}

makefile

g++ -O2 -Wall -Werror -Wno-unused-variable -Isrc -I/user/systemc/include -c main.cpp -o main.o
g++ -O2 -Wall -Werror -Wno-unused-variable -L/user/systemc/lib-linux64 -Wl,-rpath=/user/systemc/lib-linux64 -lsystemc -lm -o com main.o

这里可能会报找不到.so, 需要加入-Wl,-rpath=xxx, 把路径指过去,或者设置环境变量LD_LIBRARY_PATH

某些公司是module load systemc, 然后echo $SYSTEMC_HOME,试试

CXX := g++
GCCVERSION := $(shell expr `gcc -dumpversion`)

#FLAGS_STRICT = -pedantic -Wno-long-long

DEBUG   = -g
CXXFLAGS= -O2 -Wall -Werror -Wno-unused-variable
SYSTEMC = /user/systemc
INCDIR  = -Isrc -I$(SYSTEMC)/include
LIBDIR  = -L$(SYSTEMC)/lib-linux64
LIBS    = -lsystemc -lm
RPATH   = $(SYSTEMC)/lib-linux64

SRCS := $(wildcard ./*.cpp)

OBJS = $(patsubst %cpp, %o, $(SRCS)) main.o

%.o: %.cpp
	echo "Compile " $< " to " $@
	$(CXX) $(CXXFLAGS) $(INCDIR) -c $< -o $@

all: $(OBJS)
	$(CXX) $(CXXFLAGS) $(LIBDIR) -Wl,-rpath=$(RPATH) $(LIBS) -o $@ $^ 
    ./all

clean:
    rm -rf *.o *.out ./com

 example: nand2 with testbench

这个例子来自于System C电子系统设计,这里记录遇到的问题

1.sc_start(100, SC_NS); // 2.3.3版本需要把clock 单位加上

2.vcd 文档打开,simvision/verdi, open database 打开就行

三 基本概念

SC_MODULE

SC_MODULE(module)

实际上SC_MODULE的code如下: #define SC_MODULE(module_name) struct module_name : public sc_module, 所以也可以使用C++的方式定义module,class module : public sc_module; 两者区别是前者默认所有的成员是public的,而后者是private的

构造函数和析构函数

1. SC_CTOR

    SC_CTOR(module_name) 中定义了SC_METHOD等3个进程所需要的一些定义

2.传统C++的方式

   SC_AS_PROCESS(module_name);

  module_name ( sc_module_name n): sc_module(n) {...}

析构函数: ~module_name(){...}

端口

sc_in<sc_uint< 8 >> din; // sc_in< sc_logic > a[32];

sc_out<sc_uint<8>>dout;

sc_inout<sc_uint<8>> dinout;

sc_in_clk clk;

sc_signal<bool> S1, S2, S3; 

方法

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

write()

时钟

typedef sc_in<bool> sc_in_clk; 所以sc_in_clk 跟sc_in<bool>是等价的

sc_clock 类: 参数(name, period, 时间单位, 占空比, 开始时间, 第一个逻辑是低电平还是高电平)

eg: sc_clock clk("fclk", 20, SC_NS, 0.5, 5, true); 

推荐写法: 1. sc_clock clk1("clk1", 20, SC_NS); 2. sc_clock clk2("clk2", 20, SC_NS, 0.5);

基本数据类型

操作符:

, : (a, b) 将a, b 串起来, 类似位拼接

range(left, range): 位选

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值