SystemC-sc_in_clk和sc_clock
时钟是同步数字逻辑中必不可少的基本元素。前文中多次提到的sc_in_clk表示将要定义一个时钟输入信号,实际上在Syst内核代码中我们可以找到:
typedef sc_in<bool> sc_in_clk;
因此,sc_in<bool>与sc_in_clk在语法上是等价的。
此外,在Syst中,时钟被作为一个特殊的对象处理,它就是sc_ck类。我们首先来看看它的构造函数,如下所示
- sc_clock();
- explit sc_clock( sc_module_name name_ );
- sc_clock( const char* name_,
- const sc_time& period_,
- double duty_cycle_ = 0.5,
- const sc_time& start_time_ = SC_ZERO_TIME,
- bool posedge_first_ = true );
- sc_clock( const char* name_,
- double period_v_,
- sc_time_unit period_tu_,
- double duty_cycle_ = 0.5 );
- sc_clock( const char* name_,
- double period_v_,
- sc_time_unit period_tu_,
- double duty_cycle_,
- double start_time_v_,
- sc_time_unit start_time_tu_,
- bool posedge_first_ = true );
在SystemC2.2中,sc_clock一共有5个重载的构造函数。name_是时钟的名字,period_ 和period_v_是时钟的,period_tu_是时钟的时间单位,duty_cycle_是占空比,start_time_v_和 start_time_是时钟初始第一逻辑值的持续时间,posedge_first_是第一个逻辑值是高还是低电平。
下面的语句定义的时钟其波形如图所示:
(1)sc_clock clk1("clk1", 20, 0.5, 5, true);
图1 clk1的波形
(2)sc_clock clk2("clk2", 20, 0.5, 0, true);
图2 clk2的波形
在clk1和clk2的定义中,没有给出时钟的具体时间单位,系统默认的时间单位将被采用,不同的系统的默认时间单位可能不同,这将不利于IP核的设计复用。
假设clk1的周期为50M,即时间单位应该为纳秒(ns),则更合适的定义方法为:
sc_clock clk1("clk1", 20, SC_NS,0.5, 5,SC_NS, true);
其它常见的时钟的定义方法如下面的例子所示:
- sc_clock clk3(“Clk3”); //not recommended
- sc_clock clk4(“Clk4”,15);// //not recommended
- sc_clock clk5(“Clk5”,40,SC_NS); // recommended
- sc_clock clk6(“Clk6”,40,SC_NS,0.4); // recommended
- sc_time time1( 20, SC_NS );sc_clock clk7( “clk7”, time1 );//recommanded
在clk7的定义中,首先引入了一个sc_time类型常量time1,然后通过它来初始化clk7。
sc_time是SystemC时间类型,它最常用的构造函数为sc_time( double, sc_time_unit ),第一个参数为时间的长度,第二个参数为时间的单位。

