Lishengxie logo Lishengxie

Always on the way

  • 文章
  • 关于我
  • 归档
  • 联系
  1. 首页
  2. 文章
  3. SystemC学习

SystemC学习

2023-04-30 SystemC Lishengxie

视频教程

教程链接

创建模块

#include <systemc.h>

// SC_MODULE声明模块,and2对应模块名
SC_MODULE(and2){
	// sc_in声明输入端口,DT对应端口变量数据类型
	sc_in<DT> a;
	sc_in<DT> b;
	// 声明时钟信号
	sc_in<bool> clk;
	// sc_out声明输出端口
	sc_out<DT> f;

	void func() {
		// 输入端口读数据.read()
		// 输出端口写数据.write()
		f.write(a.read() & b.read());
	}
	
	// 模块构造函数
	SC_CTOR(and2){
		// 声明线程
		SC_METHOD(func);
		// 线程声明后紧接着声明敏感信号列表,以 << 号隔开
		// 声明a和b为敏感信号
		sensitive << a << b;
		// 声明clk的上升沿为敏感信号,下降沿为.neg()
		// sensitive << clk.pos();
	}
}

Threads

  • A function made to act like a hardware process

    • Run concurrently;
    • Sensitive to signals, clock edges or fixed amounts of simulation time;
    • Not called by the user, always active
  • 支持三种threads

    • SC_METHOD()

      • Executes once every sensitive event

      • Run continuously

      • 类似于Verilog @always block

      • 可综合

        • 组合逻辑或者简单时序逻辑
    • SC_THREAD()

      • 只在simulation开始时运行一次

      • 可以使用无限循环来以固定频率执行代码段

      • 类似于Verilog @initial block

      • 不可综合

        • 在testbench中用于初始化、描述时钟等
    • SC_CTHREAD()

      • “clocked thread”
      • Run continuously
      • References a clock edge
      • 可综合
      • Can take one or more clock cycles to execute a single iteration
  • Datatypes

    • SystemC has bit-accurate

    • Integer Datatypes

      • Unsigned and signed

        • sc_uint<N>
          • N是位宽
        • sc_int<N>

SC_CTHREAD Clocked Threads

  • SC_METHOD限制

    • Limited to one cycle
    • Fine for counters or simple sequential designs
    • Not much different than hand coded RTL
    • Can’t handle multi-cycle algorithms
  • SC_CTHREAD

    • Not limited to one cycle

    • Can contain continuous loops

    • Can contain large blocks of code with operations or control

    • Great for behavioral synthesis

    • SC_CTHREAD是SC_CTHREAD的一种特殊情况,SC_CTHREAD能产生更好的综合效果。SC_CTHREAD中可以使用wait()函数。

    • SC_CTHREAD中第二个参数需要传入时钟参数,(clk,pos()/clk.neg())

      SC_CTHREAD(fir_main, clk.pos());
      reset_signal_is(rst, true);
      

Testbench

  • Top level structural module

    • sc_main() funciton定义程序主函数

    • sc_signal<> 用于定义信号线连接模块之间的端口

    • sc_clock 定义clock信号

      sc_clk clk_sig;
      // 构造函数中传入时钟信号,这里SC_NS指ns,10表示10ns为一个时钟周期
      SC_CTOR(SYSTEM):clk_sig("clk_sig", 10, SC_NS)
      
  • sc_start()、sc_stop()开始和终止仿真

Handshaking

  • valid/ready信号组

Latency

// 记录时间
sc_time start_time, end_time, clk_period;
start_time = sc_time_stamp();
// 获取时钟周期, clk是之前声明的时钟信号
sc_clock *clk_p = DCAST<sc_clock*>(clk.get_interface());
clock_period = clk_p -> period();

C++ Segmentation Fault

https://zhuanlan.zhihu.com/p/397148839

SystemC 硬件建模

本文目录

    • 视频教程
    • 创建模块
    • Threads
    • SC_CTHREAD Clocked Threads
    • Testbench
    • Handshaking
    • Latency
    • C++ Segmentation Fault

精选文章

  • 分布式ID生成方案全解析:从数据库到雪花算法
  • Redis ziplist、quicklist 和 listpack
  • 多目标优化问题及两种常用解法

按主题探索

  • Redis 数据结构
    从存储布局理解实现
  • Linux 与部署
    服务器、证书与建站实践
  • 算法与深度学习
    解题方法、优化与公式推导
  • SNN / NoC 论文
    互连网络与映射算法

名言警句

学而时习之,不亦说乎?《论语·学而》学而不思则罔,思而不学则殆。《论语·为政》知之为知之,不知为不知,是知也。《论语·为政》三人行,必有我师焉。《论语·述而》工欲善其事,必先利其器。《论语·卫灵公》不积跬步,无以至千里。《荀子·劝学》千里之行,始于足下。《老子·第六十四章》纸上得来终觉浅,绝知此事要躬行。陆游《冬夜读书示子聿》
学而时习之,不亦说乎?
《论语·学而》 一言
← 云服务器软件安装 Windows常见问题记录 →
皖ICP备2023003716号-1 | 公安备案皖公网安备34012202341113 | 违法和不良信息举报邮箱:1141751053@qq.com
Powered by Hugo & Explore Theme & Theme by SimonAKing.