概述
Sytemc 数据类型的实现
1. 在SystemC中新增数据类型的声明sc_bv<8>
sc_bv的在源码中的原型,其中位宽为W
template <int W>
class sc_bv
: public sc_bv_base
{
public:
// constructors
sc_bv():sc_bv_base( W ) {}
}
1.1 template的应用
知道位宽是怎么传递进入的了吧? 这里采用了C++的模板函数。通常所见的template的用法都是传递一个数据类型或者class type。这里传递了一个Int类型的width(W)。在进行数据类型声明的时候 sc_bv<8>就传递到了其基类sc_bv_base中。
在systemC的源代码中,多数地方都采用了template的通常用法。 例子:带template的构造函数,但是类的声明并没有template。
class sc_bv_base
: publicsc_proxy<sc_bv_base>
{
friend class sc_lv_base;
sc_bv_base( constchar* a, int length_ );
template <classX> sc_bv_base( const sc_proxy<X>& a )
: m_len( 0), m_size( 0 ), m_data( 0 )
{ init(a.back_cast().length() ); base_type::assign_( a ); }
2. 变量的赋值
2.1 赋值过程追踪
Sc_bv<8> test;
Test = 12;
赋值过程
#0 sc_dt::sc_bv_base::set_word (this=0x7ffff7f5dee0, i=0, w=12) sc_bv_base.h:241
#1 sc_dt::set_words_<sc_dt::sc_bv_base> sc_proxy.h:720
#2 sc_dt::sc_proxy<sc_dt::sc_bv_base>::assign_ (this=0x7ffff7f5dee0,a=12) bit/sc_proxy.h:931
#3 sc_dt::sc_bv_base::operator= (this=0x7ffff7f5dee0, a=12) bit/sc_bv_base.h:179
#4 sc_dt::sc_bv<8>::operator= (this=0x7ffff7f5dee0, a=12) bit/sc_bv.h:187
#5 fft::entry (this=0x7fffffffc780) at fft.cpp:46
#6 semantics (this=0x64def0) at ../../../src/sysc/kernel/sc_process.h:668
#7 sc_core::sc_thread_cor_fn (arg=0x64def0) at sc_thread_process.cpp:114
#8 0x00007ffff7afd781in qt_blocki () at qtmds.s:71
重载操作符 “=”
sc_bv_base&operator = ( unsigned int a )
{base_type::assign_( a ); return *this; }
sc_bv<W>& operator = ( unsigned int a )
{sc_bv_base::operator = ( a ); return *this; }
class sc_bv_base
: publicsc_proxy<sc_bv_base>
{
typedefsc_proxy<sc_bv_base> base_type;
真正的赋值是在sc_bv_base的基类,也就是sc_proxy<sc_bv_base>中实现的。
具体函数为assign_
在赋值完成后返回了一个类的实例,也就是该赋值操作其实是new了一个新的instance,然后赋值给test这个sc_bv<8>的变量。
2.2. sc_proxy类(文件datatypes/bit/sc_proxy.h)
首先来看看源代码中对该类的作用的描述:
sc_proxy.h -- Proxybase class for vector data types.
Thisclass is created for several purposes:
1) hiding operators from the global namespace that would be
otherwise found by Koenig lookup
2)avoiding repeating the same operations in every class
including proxies that could also beachieved by common
base class, but this method allows
3)improve performance by using non-virtual functions
总的来说就是对所有的类似操作设计一个基类,避免重复的代码编写。但是同virtual function相比,又能够提高性能。
2.3 输出流的重载 “<<”
Cout<< test的过程,总的来说也是对操作符<<的重载,映射到 sc_proxy中的print函数,并调用to_string函数,最后调用系统调用cout进行数据该string
#0 sc_dt::sc_proxy<sc_dt::sc_bv_base>::to_string(this=0x7ffff7f5dee0) at ../../../../include/sysc/datatypes/bit/sc_proxy.h:1388
#1 sc_dt::sc_proxy<sc_dt::sc_bv_base>::print (this=0x7ffff7f5dee0,os=...) at ../../../../include/sysc/datatypes/bit/sc_proxy.h:519
#2 sc_dt::operator<< <sc_dt::sc_bv_base> (os=..., a=...) at../../../../include/sysc/datatypes/bit/sc_proxy.h:1591
#3 ft::entry (this=0x7fffffffc780) at fft.cpp:47
#4 semantics (this=0x64def0) at ../../../src/sysc/kernel/sc_process.h:668
#5 sc_core::sc_thread_cor_fn (arg=0x64def0) at sc_thread_process.cpp:114
#6 0x00007ffff7afd781in qt_blocki () at qtmds.s:71
具体调用的to_string 函数 如下
template <class X>
inline const std::string sc_proxy<X>::to_string() const
{
const X& x =back_cast();
int len =x.length();
std::string s; //( len + 1 );
for( int i = 0; i< len; ++ i ) {
s +=sc_logic::logic_to_char[x.get_bit( len - i - 1 )];
}
return s;
}
Logic_to_char 为一个查表操作,将数字转换为字符
const char sc_logic::logic_to_char[4] = { '0', '1', 'Z', 'X'};
最后
以上就是个性银耳汤为你收集整理的SystemC分析(1)-基本数据类型的实现的全部内容,希望文章能够帮你解决SystemC分析(1)-基本数据类型的实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复