1.计算机体系结构研究仿真之SystemC基础(一)
2.gem5 源码阅读 之 event
3.å¦ä½å¨linuxä¸ä½¿ç¨systemc
4.关于电脑的英语词语
5.Verilator简介与使用
计算机体系结构研究仿真之SystemC基础(一)
本文将深入介绍SystemC的使用方法,旨在帮助读者快速掌握SystemC的基础知识。通过参考learnsystemc网站的相关教程,本系列文章将逐步引导您了解SystemC的理论背景及实践应用。
首先,搭建SystemC的免费vf源码实验环境是必要的。SystemC实质上是C++的一个扩展库,因此安装过程类似于安装一个C++库。通用的安装命令如下:
一旦完成安装,您可以通过修改变量或添加-I参数来解决找不到SystemC库的问题。
接下来,让我们通过一个简单的Hello World示例来了解SystemC的基本输出方法。SystemC提供了两种输出到命令行的方法,其中第二种方法是在SystemC的模块中使用C++语法进行输出。
在编写SystemC代码时,引入SystemC头文件是非常重要的,通常有两种方法。源码转反码 在线第一种方法会将SystemC的所有命名空间引入当前文件,适用于与老版本的SystemC兼容,但在未来可能不再支持。第二种方法则不包括命名空间,需要手动引入所需命名空间。
值得注意的是,SystemC的入口点并非main函数,而是sc_main函数。这是因为在SystemC库中已经定义了main函数,sc_main函数会调用它。
下面,我们通过一个简单的Hello World源码来展示SystemC的应用。
当运行这段代码后,您将看到输出“Hello World!”。
SystemC模块具有以下特点。定义模块的arc源码回传方法有多种,而使用示例代码可以帮助我们理解模块的特性。
在使用SystemC时,需要遵循一些注意事项。确保模块的name在实例化对象时正确提供,这是构造函数中的唯一参数。此外,SystemC提供了一系列宏来简化模块的定义和使用。
例如,使用SC_STOR宏可以方便地声明和定义module的构造函数,而SC_HAS_PROCESS宏仅用于注册模块,需要配合构造函数的定义。
下面的示例代码展示了如何使用这些宏来简化模块的创建。
运行这段代码后,您将观察到预期的结果。
SystemC中的Simulation Process是指在仿真环境中运行的过程。注册Simulation Process的模拟交通源码方法以及何时进行注册是系统级编程的关键。示例代码将帮助您理解如何正确注册Simulation Process。
Systemc应用操作通常包括三个阶段,执行到最后一个阶段需要满足特定条件。在elaboration和simulation的各个阶段中,仿真内核会调用四个回调函数,这些函数用于跟踪状态和执行逻辑。示例代码展示了如何在这些阶段中插入操作。
时间在SystemC中扮演着重要角色。系统中时间的测量采用两种标准,并且sc_time类型用于跟踪仿真时间。了解sc_time的用法,包括赋值、计算和比较操作,对于编写高效的SystemC代码至关重要。
最后,本文提供的如何下载源码包参考资料将帮助您进一步学习SystemC的基础和高级特性,以支持芯片系统建模和验证。
gem5 源码阅读 之 event
Event在gem5中扮演核心角色,本文将聚焦几个关键问题的解答:
gem5作为事件驱动型仿真器,能高效处理每个动作或响应,无需频繁检查全局时间,显著降低执行时间。每个继承自EventManager的SimObject实例均可承担事件管理职责。
SimObject的schedule方法将事件排序并插入全局EventQueue,构建全局事件树。Event执行基于排序后的when+priority值,确保事件有序执行。
以cache为例,事件注册流程始于DCachePort的recvTimingResp函数中的tickEvent自身调用schedule方法,进一步由cpu调用schedule,实际上就是EventManager的schedule函数,将事件插入到event queue中。
事件的执行时机取决于其特性,如cache中的tickEvent执行数据传输动作,通常在recvTimingResp函数中触发,此时代表完整数据请求完成的事件点。
事件树的执行依赖于event queue管理,主event queue在doSimLoop中处理,其他event queue通过thread_loop并行处理,并通过threadBarrier同步所有线程,确保事件同时执行。
全局eventqueue通过getEventQueue函数生成,参数index指定queue索引,第一次使用时创建新对象,每个queue与一个线程关联,执行相关事件。
EventQueue创建在不同使用场景中,例如cxx_config方式下,在main.cc文件中直接调用getEventQueue,生成全局eventqueue;gem5 within systemc方式下,在main.cc中实例化SimControl对象,进而调用simulate函数,管理全局eventqueue。
在Python配置文件中,如fs.py,通过build_test_system函数构建系统组件,cpu的eventq_index参数用于创建全局eventqueue,确保所有相关组件事件同步。
综上所述,gem5通过事件驱动机制高效仿真系统行为,事件注册、执行、管理流程贯穿整个系统仿真过程,确保复杂系统行为的准确模拟。
å¦ä½å¨linuxä¸ä½¿ç¨systemc
1ã./configure ;2ãmake ;3ã make install;SystemCä¹ä¸ä¾å¤ãå°ä¸è½½çæºç 解åå°æ件夹å¦ï¼/home/user/DirAï¼userä»£è¡¨ä½ çç¨æ·åï¼DirAè¡¨ç¤ºä½ å建çæ个ç®å½ï¼
1 cd /home/user/DirA
2
3 ./configure -prefix=INSTALL_DIR //ç¨-prefix=æå®è¦å®è£ å°çç®å½è·¯å¾ï¼æ¤è·¯å¾å¿ 须已ç»åå¨ï¼
4
5 make
6
7 make install
åºæ¬å°±å¯ä»¥äºï¼ææ¯å¨èææºä¸çå°çº¢å¸½ï¼æçå®è£ éå°ä¸äºå°çé误ï¼ä¸»è¦æ¯example没æå®è£ è¿å»ï¼docsä¹æ²¡æï¼ä½ç±»åºé½å·²ç»å®è£ 好äºï¼
æ§è¡ make check æ£æ¥å®è£ æ¯å¦æåï¼make check æå就没é®é¢äºï¼æçæ¯æåç¶æã
æåçå®è£ ç®å½å¦ä¸ï¼
2ãVC6++/VS SystemC使ç¨
åé¢è¯´è¿ï¼SystemCå®é ä¸æ¯ä¸ä¸ªC++ç±»åºï¼å æ¤ï¼VCæè VSä¸ä½¿ç¨SystemCå°±æ¯å¤é¨åºç使ç¨ã
åºç¼è¯ï¼ä¸è½½è§£ååçsystemc-versionä¸æmsvcçç®å½ï¼ä¸é¢æå·¥ç¨æ件ï¼ç´æ¥å¯ä»¥æå¼ç¼è¯å³å¯å¾å°SystemCçåºã
æ°å»ºå·¥ç¨ï¼
åºæ·»å ï¼
1ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-è¿æ¥å¨-常è§ï¼æ·»å é件åºç®å½
2ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-è¿æ¥å¨-è¾å ¥ï¼æ·»å åº
3ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-C/C++-常è§ï¼æ·»å 头æ件æå¨ç®å½
ç¼åsc_hello.cpp代ç å¦ä¸å¹¶æ·»å å°å·¥ç¨ï¼
1 // sc_helloworld.cpp : å®ä¹æ§å¶å°åºç¨ç¨åºçå ¥å£ç¹ã
2 //
3
4 #include "systemc.h"
5 SC_MODULE(hello)
6 {
7 sc_in<bool> clock;
8 void run()
9 {
cout << "@"<<sc_simulation_time<<" hello world" <<endl;
}
SC_CTOR(hello)
{
SC_METHOD(run);
sensitive<<clock.pos();
}
};
int sc_main(int argc, char* argv[])
{
sc_clock clk("clock",,SC_NS);
hello h("hello");
h.clock(clk);
sc_start(,SC_NS);
system("pause");
return 0;
}
关于电脑的英语词语
CPU central processing unit 中央处理器
ASCII American Standard Code for Information Interchange
美国信息交换标准代码
ALU arithmetic/logic unit 算术/逻辑部件
RAM random-access memory 随机存储器
ROM read-only memory 只读存储器
LCD liquid crystal display 液晶显示器
CRT cathode-ray tube 阴极射线管
LIFO Last-In/First-Out 后进先出
FIFO First-In/First-out 先进先出
HPIFO Highest-Priority In/First-Out 最高优先级先进先出
OS Operating System
IOCS input/output control system
GUI Graphic User Interface
SQL Structured Query Language
DBMS data base management system
C/S Client/Server
IBM International Business Machine
RDBMS Relational DataBase Management System
IE Internet Explorer
3D three Dimension
EDI Electronic Data Interchange
URL Uniform Resource Location
OSI/RM open system interconnection reference model
TCP/IP transmissinon control protocol/internet protrcol
UDP user datagram protocol
WAN wide area network
LAN local area network
ISDN Integrated Services Digital Network
WWW World Wide Web
HTTP HyperText Transfer Protocol
HTML Hyper Text Markup Language
FTP File Transfer Protocol
BASIC Beginners All-Purpose Symbolic Instruction Code 初学者通用符号指令代码
主存储器 primary storage
辅助存储器 secondary storage
显示屏 disply screen
指令 instruction
兆赫(MHz) megahertz
字长 word length
机器语言 machine language
磁盘驱动器 disk drive
软盘 floppy disk
象素 pixel
分辨率 resolution
数据类型 data type
结构化数据类型 structured data type
目录文件 object file
源代码 source code
可执行程序 executable program
顺序结构 sequence structure
选择结构 selection structure
循环结构 loop structure
办公自动化 office automation
电路交换网 circuit switched networks
专用网 leased line networks
分组交换网 packet switching networks
Verilator简介与使用
Verilator是一个开源的Verilog和System Verilog翻译器,专为快速模拟而设计,能执行lint代码质量检查,并编译为多线程C++或SystemC。
在使用Verilator时,通常需要配合Makefile,通过一个简单的Hello World示例来理解。首先,创建一个名为our.v的Verilog程序,然后编写sim_main.cpp,它负责调用Verilator处理后的模型。在Ubuntu环境下,通过Verilator将our.v翻译并生成一系列cpp和h文件,这些文件存储在--Mdir指定的目录或默认的"obj_dir"中。
编译生成的C++源代码,执行后,你会看到控制台输出"Hello World",这表明Verilator翻译后的程序行为与原始Verilog一致。Verilator的作用是将Verilog或System Verilog代码转换成可编译的形式,便于仿真和结果分析。
Verilator的执行过程涉及静态代码检查,将代码编译成多线程模型,提供C++/SystemC接口,并支持用户编写驱动程序。它能提供与商业模拟器类似甚至更好的性能,特别是在单线程和多线程环境下。例如,它能在单线程下比解释式模拟器快倍,多线程情况下速度提升更显著。
翻译后的代码结构包括Vour.h头文件,定义了用户应实例化的模型接口,以及Vour.cpp和内部.h/cpp文件。通过Vour.mk文件,配合Make构建静态库。C++模式下,用户编写C++ wrapper,而在SystemC模式下,模型会直接融入System C网表。
以FIFO为例,通过C++或SystemC实例化,可以看到Sim_main.cpp在不同输出模式下的驱动程序效果。最终,仿真结果可通过GTKwave等工具查看。
对于Verilator的使用和功能,如有任何疑问,可以参考官方手册:Veripool。