
SystemC/TLM
文章平均质量分 75
systemc/TLM2
123axj
这个作者很懒,什么都没留下…
展开
-
使用set_actions过滤掉特定的SystemC Wraning &Error Message
替换代码如下,其中,sc_core::SC_ID_SIMULATION_START_UNEXPECTED_ 这个宏 就是E554的 string描述 : sc_start called unexpectedly。不使用 sc_core::sc_gen_unique_name 情况下,systemc 会自动给 module的不同实例的name赋值,第一个 被例化的实例 name 就是 用户定义的your_name,第二个实例的name会被赋值为 your_name_0,依次类推。原创 2022-09-14 20:59:01 · 565 阅读 · 1 评论 -
blocking & non-blocking transport之间的相互转换
(实际执行的是 tlm_utils/simple_target_socket.h中的 b_transport函数 )的时候,我们发现 b_transport函数中有如下的逻辑,可以得知,m_b_transport_ptr 是空指针,m_nb_transport_ptr是有指向的,此时进行 b2nb 的转换,simple_target_socket.h中的b2nb_thread() 是用于 b2nb转换的sc_thread。如果使用的是诸如AXI之类的其他接口协议,则不能。...原创 2022-08-25 22:27:33 · 902 阅读 · 0 评论 -
sc_semaphore
sc_semaphore的构造函数中需要给定一个初始的semaphore value ( int,必须配置为大于等于0的值 )。wait() 和trywait() 函数用来申请资源,如果成功则value -- (前提是当前value > 0),trywait()会返回0;如果此时value == 0,则申请失败,wait()函数会被block住,等待其他process调用post()让value > 0;post() 函数用来 释放资源,++value,notify等待的process。原创 2022-08-24 21:39:43 · 487 阅读 · 0 评论 -
std::mutex & sc_core::sc_mutex
调用lock时,如果mutex处于lock状态,说明其他线程正在使用,则此线程需要等待,直到使用的那个线程调用了unlock,让mutex处于unlock状态后,本线程等待结束,调用lock成功。否则执行lock的动作,返回true。需要注意的是,调用unlock的前提必须是当前thread调用了lock或try_lock使mutex处于lock状态,否则将会导致不可预知的问题。如果当前mutex是lock状态,但是由其他process 执行的lock/ try_lock导致的,则返回-1;原创 2022-08-24 21:37:56 · 469 阅读 · 0 评论 -
sc_signal / sc_in / sc_out
其中,sc_out 和sc_inout 提供了write 和read 的API,而sc_in只提供了read的API,这些API中,会访问 与之绑定的sc_interface的read/write 函数,比如与sc_signal绑定时,访问的就是sc_signal的read/write 函数。sc_clock / sc_signal / sc_fifo / sc_mutex / sc_event_queue / sc_semaphore 都属于sc_interface 的子类。原创 2022-08-24 21:36:13 · 1847 阅读 · 0 评论 -
systemC/TLM:peq_with_cb_and_phase的简单用法
构造函数中的OWNER*一般设置为this,参数cb是一个callback function的指针,这个callback函数的形式为void (OWNER::*cb)(tlm_payload_type&, const tlm_phase_type&);peq有peq_with_get 和peq_with_cb_and_phase (cb是callback的简称) 两种形式。peq_with_cb_and_phase是一个模板类,两个模板参数,其中第二个默认为 tlm phase;原创 2022-08-24 21:27:58 · 926 阅读 · 0 评论 -
SystemC/TLM: blocking & non-blocking transport
tlm_core/tlm_2/tlm_generic_payload/tlm_phase.h 中定义了四种最基本的phase : BEGIN_REQ=1, END_REQ, BEGIN_RESP, END_RESP。比如要模拟AXI 协议的5个channel,则可以新增 BEGIN_ { AXI_AW / AXI_AR / AXI_W / AXI_R / AXI_B } 和 END_ { AXI_AW / AXI_AR / AXI_W / AXI_R / AXI_B } 这 10个phase。原创 2022-08-24 21:22:07 · 3043 阅读 · 0 评论 -
使用set_handler过滤掉特定的SystemC Wraning &Error Message
SystemC 定义了一些 warning 和error的场景,这些场景在编译的时候是不会报错的,但在执行过程中会报出类似Error: (E554) sc_start called unexpectedly的错误,其中E表示Error,W表示warning,554为错误的编号,“sc_start called unexpectedly”为错误对应的message输出。在源码中搜 SC_DEFINE_MESSAGE 就可以查到所有定义的message信息,以及对应的错误编号。主要的文件有以下几个,文件名都以原创 2022-06-30 19:18:40 · 307 阅读 · 0 评论 -
SystemC 实现round-robin仲裁
Round-robin(轮询)是一种常用的、也是最基本的仲裁策略(Arbitration),用在多进一出的mux结构中;其基本思路是 有一个last gnt id记录上一次的仲裁结果,下一次则先从last gnt id +1 处开始查询是否此input是否有申请仲裁,如果有则其获胜,如果其没有申请仲裁,则轮询下一个input,依次类推。Round-robin是一种非常公平的仲裁策略,可以保证每个input都有相同的概率获取到output的权利。但有些时候,某些request比较紧急,优先级较高,我们需要原创 2022-05-28 11:01:16 · 1415 阅读 · 0 评论 -
sc_port / sc_interface / sc_export (part 4)
总结允许的绑定关系:sc_port.bind(sc_port)sc_port.bind(sc_interface)sc_port.bind(sc_export)sc_export.bind(sc_export)sc_export.bind(sc_interface)不允许的绑定关系:sc_export.bind(sc_port)sc_interface.bind(sc_interface)sc_interface.bind(sc_port)sc_interfa原创 2022-05-02 21:44:58 · 1392 阅读 · 0 评论 -
sc_port / sc_interface / sc_export (part 3)
sc_exportsc_export的一个主要作用是,在层次化的绑定过程中,给submodule内的interface提供了一个可以对外与sc_port绑定的方法。Class sc_export allows a module to provide an interface to its parent module. An export forwards interface method calls to the channel to which the export is bound.sc_e原创 2022-05-02 21:40:55 · 865 阅读 · 0 评论 -
sc_port / sc_interface / sc_export (part 2)
sc_port bindport 绑定时,有如下这两个函数,其中,operator()的实现需要通过调用虚成员函数bind来实现。函数参数可以为 interface,也可以是sc_export (如spec中的解释,其实是调用了 隐式类型转换sc_export<IF>::operator IF&)。void operator() ( IF& );virtual void bind( IF& );Each of these two functions sha原创 2022-05-02 21:37:34 · 1095 阅读 · 0 评论 -
sc_port / sc_interface / sc_export (part 1)
一个复杂的系统我们一般会将其分为很多个比较小的模块,对于SystemC建模,每个模块一般就是一个sc_module的子类。模块间有一些交互的信息 一般通过 port/interface/channel/export 来进行传递,传递的过程其实本质上就是调用了对方的接口函数(通过operator-> 和operator[] 来实现)。也就是说,port的主要作用是 做到了解耦,比如,Module A 和Module B通过port这套方法在顶层进行了bind,那么Module A本身不需要看到Modul原创 2022-05-02 21:35:05 · 1553 阅读 · 0 评论 -
SystemC/TLM: sc_fifo 的简单使用
sc_core::sc_fifo可以设置深度,默认深度为16。 explicit sc_fifo( int size_ = 16 ) : sc_prim_channel( sc_gen_unique_name( "fifo" ) ), m_data_read_event( sc_event::kernel_event, "read_event" ), m_data_written_event( sc_event::kernel_event, "writ原创 2022-05-01 11:59:10 · 2539 阅读 · 0 评论 -
SystemC/TLM: sc_vector
因为sc_module没有默认构造函数(有一个不带默认值的参数name),所以不能直接使用std::vector来定义一个sc_module 子类 的数组。为了方便定义一个sc_module 子类 的数组,sc_vector就应用而生了。如果子类只有一个name的参数,则初始化的时候直接init (num)就行了,但如果子类包含除name外的其他参数,此时就需要自己创建一个 create 函数,将函数指针传作为int函数的第2个参数。// execute: // g++ -g -W原创 2022-05-01 11:44:16 · 1455 阅读 · 0 评论 -
sc_spawn / sc_pawn_options / sc_process_handle
sc_spawn ; sc_pawn_options; sc_process_handle ; sc_get_current_process_handle原创 2022-03-27 16:39:24 · 2690 阅读 · 0 评论 -
sc_port 和 sc_signal bind的一个奇怪用法
有些时候,我们会发现有这样的用法:A 模块定义了一个sc_port<sc_signal<bool> > m_port_in ; 且在 一个sc_thread 中 进行 readB 模块定义了一个 sc_signal<bool> m_signal ;且在 一个sc_thread 中 进行 write然后在顶层进行绑定 m_port_in.bind(m_signal)这跟我们常见的 信息传输方向 不太一样:常见的sc_port 一般作为 ini...原创 2022-03-27 09:56:52 · 1310 阅读 · 1 评论 -
tlm::tlm_analysis_port & tlm::tlm_analysis_if
在SystemC/TLM建模中,我们经常需要加一些payload monitor来进行performance counter的统计,或者使用data checker来进行unit test。很多情况下,为了保持代码的整洁和提高仿真速度,我们不希望将monitor和checker的代码直接写在module内部。此时,就可以使用tlm提供的analysis port,然后根据需求来添加特定的monitor或checker。一个tlm::tlm_analysis_port可以绑定0个 /1个或多个tlm::tlm原创 2022-03-27 09:48:22 · 668 阅读 · 0 评论 -
SystemC: sc_bv and sc_uint
在SystemC model和RTL进行co-sim的时候,model中经常需要用到SystemC的sc_bv 类型数据与System Verilog代码进行交互。sc_bv 是 bit vector的简称,在namespace sc_dt (data types)中定义。sc_bv继承于sc_bv_base,sc_bv_base继承于sc_proxy<sc_bv_base>。sc_bv是一个模板类,定义时需要传入一个int参数,表示位宽。对sc_bv类型赋值,可以使用bool /原创 2022-03-27 09:45:19 · 2510 阅读 · 0 评论 -
致SystemC初学者:第一个程序
// execute: // g++ -g -Wall -lsystemc -m64 -pthread main.cpp // -L/$(your systemc path)/lib-linux64 // -I/$(your systemc path)/include -I/$(your systemc path)/src/tlm_utils -o sim#include <sy..原创 2022-05-04 12:27:30 · 5004 阅读 · 0 评论 -
SystemC中的Wait 函数
SystemC中SC_THREAD必须依靠wait 来进行仿真时间的推进;SC_METHOD中则必须保证不能出现任何显式或隐式的wait调用。wait 有多个重载函数。void wait() 中不加任何参数,表述wait此SC_THREAD的敏感列表事件,比如在构造函数中有这样的语句SC_THREAD( function); sensitive << evt; 这样在 SC_THREAD 的函数中 遇到wait() 就相当于wait(evt)。void wait(int n) 简单的原创 2022-02-27 21:43:26 · 2893 阅读 · 0 评论 -
SystemC:SC_THREAD和SC_METHOD
SC_THREAD / SC_METHOD都是spec中提到的processes,SC_CTHREAD很少使用,这里不太讨论。SC_THREAD / SC_METHOD本身是一个SystemC定义的宏,在源码中我们可以找到其对应的实际执行语句,其实就是将括号中对应的函数添加到SystemC kernel中的调度列表中。SC_THREAD / SC_METHOD必须在一个module的构造函数或before_end_of_elaboration / end_of_elaboration中使用。如果想在Si原创 2022-02-27 21:42:28 · 3805 阅读 · 0 评论 -
SystemC Simulation调度机制
默认情况下,我们直接使用源码中提供的CMake编译参数编译.so文件,那么我们在跑一个SystemC程序的时候,即使代码中有很多SC_THREAD / SC_METHOD的注册函数,也会发现程序只占用一个物理CPU core。如果我们在编译时 enable了SC_USE_PTHREADS这个宏,则会出现不同的现象:每一个SC_THREAD / SC_METHOD都会创建一个CPU线程;但这种情况对我们的仿真速度其实影响很大,当我们代码中的SC_THREAD / SC_METHOD特别多时,会严重拖慢我们原创 2022-02-27 21:41:16 · 1842 阅读 · 6 评论 -
SystemC time
首先要区分SystemC 仿真时间 和 机器执行时间,机器执行时间 是我们CPU物理机跑程序所花费的物理时间,这个时间就是我们真是感受到的时间,1s,1min … ;而SystemC 仿真时间是SystemC程序执行过程中kernel调度的时间,SystemC仿真时间跟物理执行时间没有任何粒度上的对应关系,比如一个程序,在SystemC 仿真时间 从0ns到 100 ns过程中花费了CPU物理时间为10s;并不能推算出从100ns到200ns过程中也需要花费10s的物理时间。对于1G Hz的silico原创 2022-02-27 21:40:07 · 1864 阅读 · 0 评论 -
SystemC的运行阶段
SystemC 运行阶段 elaboration原创 2022-02-27 21:37:53 · 1459 阅读 · 0 评论 -
systemc学习资料
systemC 官网: https://www.accellera.org/downloads/standards/systemcgithub 源码:https://github.com/accellera-official/systemcsystemc 的一个视频 https://space.bilibili.com/413496168?spm_id_from=333.788.b_765f7570696e666f.2 systemC 学习网站 http://www.learnsyst原创 2021-08-16 15:26:54 · 1577 阅读 · 0 评论 -
TLM/SystemC: tlm socket 绑定问题
在systemc编程中,如果程序run过程中出现以下两种报错,则说明系统中有port没有正确绑定。Error: (E126) sc_export instance already bound: xxxxxxIn file: xxxx/sysc/sysc/communication/sc_export.h:188 (systemc 2.3.3)In file: xxxx/sysc/sysc/communication/sc_export.h:179 (systemc 2.3.1)Err..原创 2021-05-08 14:35:24 · 2759 阅读 · 0 评论 -
Systemc 常见错误
错误类型 编译错误 错误提示 systemc-2.3.1/include/sysc/datatypes/int/sc_uint_base.h:842: undefined reference to `sc_dt::sc_uint_base::to_string systemc-2.3.1/include/sysc/communication/sc_signal_ports.h:1802: undefined reference ...原创 2021-04-27 21:15:58 · 2571 阅读 · 1 评论 -
SystemC使用sc_report_handler处理log打印
sc_severity是在每次需要打印信息的时候,根据本次信息的类型(info、warning提示,error报错,fatal报错)进行选择。sc_verbosity只在sc_severity为SC_INFO的情况下才有效,这是因为通常情况下,warning/error/fatal信息不会太多,而info信息则比较多,且info信息很多是为了debug使用的,故需要对info信息进行等级区分。对应sc_severity的枚举类型,分别定义了4个基本宏,另外还有一个针对SC_INFO的增强型宏:SC_原创 2021-04-27 21:11:39 · 1227 阅读 · 0 评论 -
systemC: sc_signal cannot have more than one driver
如题,systemc规则中,同一个sc_signal不允许有多个驱动,也就是说,同一个sc_signal,只能在一个SC_METHOD或SC_THREAD中被write赋值,如果在多个SC_THREAD或SC_METHOD中write同一个信号,编译没问题,执行时就会报如题的错误,并给出提示,是哪两个thread/method。同一个sc_signal可以在多个SC_METHOD或SC_THREAD中被read。 这样的规则,是为了同RTL一致。RTL中,一个信号就是只能在一...原创 2020-05-13 20:57:19 · 1155 阅读 · 0 评论 -
systemc: sc_event和sc_event_finder
在使用systemC模拟RTL的时序行为时,往往需要将clock的上升沿作为SC_METHOD的敏感事件列表。而设置敏感事件列表时,我们会遇到sensitive << sc_in_clk.pos() 和sensitive << sc_in_clk. posedge_event () 两种形式。那pos()和posedge_event ()有什么区别呢?查阅systemc使...原创 2020-04-11 16:56:53 · 3125 阅读 · 1 评论 -
SC_THREAD 和SC_METHOD对信号操作的交互问题
SC_THREAD 和SC_METHOD如果需要对同一个信号( sc_signal /sc_in/ sc_out)进行操作,比如在thread中进行write,在method中读,可能会打破SC_METHOD的clock触发机制,使得当拍write的值在当拍就能被read到。如文章最后源码中,TestThread在2ns 对m_sig赋值为1,按照正常逻辑,2ns 的read值依然是0,3ns才...原创 2020-04-05 22:22:02 · 1746 阅读 · 1 评论 -
systemc: next_trigger在SC_METHOD中的用法
之前的博客中有提到过,SC_METHOD在同一拍只能被执行一次,其实这句话成立需要加一个前提,就是在没有Next_trigger参与的情况下。有next_trigger参与的情况下,SC_METHOD是可以在同一拍被执行两次的,且只能是被静态敏感事件触发一次,被动态敏感事件触发一次。Next_trigger 只能在SC_METHOD函数中使用,不能在SC_THREAD和SC_CTHREAD中使用...原创 2020-03-31 21:16:19 · 2441 阅读 · 4 评论 -
systemc实现RTL的并行设计
systemc调度策略可以使得C++代码很好地模拟RTL的并行执行效果,轻松实现寄存器的功能。假设有这样一个模块:两个10bit的输入信号,经过一个加法器,计算结果经过寄存器打一拍后输出。以下分别用verilog和systemc来实现,源代码见文章末尾。Systemc实现:sc_clock 和sc_in_clock为时钟,前者产生时钟,初始化时需要配置period,默认占空比为50%。信号...原创 2020-03-28 18:33:32 · 2547 阅读 · 0 评论 -
systemc-2.3.1/include/sysc/datatypes/int/sc_uint_base.h:842: undefined reference to_string
ubuntu16.04环境下,make一个systemc程序,发现编译错误:systemc-2.3.1/include/sysc/datatypes/int/sc_uint_base.h:842: undefined reference to sc_dt::sc_uint_base::to_string(sc_dt::sc_numrep, bool) const' systemc-2.3.1/i...原创 2020-03-26 21:30:20 · 457 阅读 · 0 评论 -
SystemC/TLM:SC_METHOD 和敏感列表的关系
SC_THREAD和SC_METHOD是在systemC/TLM编程中实现 模拟RTL并行执行的关键所在。SC_METHOD的实现主体中不能有wait,所以它必须配合sensitive敏感列表一起使用,当敏感列表中的event被notify时,SC_METHOD的函数主体 被执行一次。并且,Method同一拍只能被执行一次。在SC_METHOD的使用过程中,经常会犯一个错误,就是敏感事件被多次...原创 2020-03-16 20:15:24 · 4327 阅读 · 2 评论 -
systemC/TLM:peq_with_get的简单用法
在systemC/TLM编程中,peq是一个非常重要的工具,尤其是在模拟RTL中的pipeline等场景下,是必不可少的。我们可以认为peq是一个可以设置路径延时的管道,一个transaction在入口处设置好延时,延时一到就从出口处可以看到这个transaction了。同一拍可以在Peq的出口处get到多个transaction。peq的好处是,不管在在入口处push了多少transact...原创 2020-03-15 13:24:58 · 2900 阅读 · 5 评论 -
虚拟机安装systemc
Systemc是芯片公司系统软件工程师( ESL 方向)必备的软件,也许称之为一个C++拓展包更合适。SystemC 可以用于ESL精准时序建模,在芯片架构探索、性能比对和分析等方面具有不可替代的作用。如何在windows系统下使用systemc和TLM编写代码呢,本篇就来介绍其环境的搭建过程。首先,需要准备必需的软件:VM-workstations 、ubuntu-16.04.6-des...原创 2020-03-08 17:07:01 · 1107 阅读 · 0 评论