我是靠谱客的博主 健忘大雁,最近开发中收集的这篇文章主要介绍systemC的同步时序建模,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

systemC的时序逻辑建模

systemc的时序逻辑方法分为两种:
1)  静态时序逻辑:
    使用关键字sensitive,sensitive_pos , sensitive_neg :使得触发为值触发,正跳边沿触发,负跳变沿触发
    这种触发方式为静态触发方式。
2) 动态时序逻辑:
    在挂起的线程函数的wait语句中使用。
    条件为port.posedge_event()  port.negedge_event()  port.value_changed_event() ,
    并且可以结合逻辑操作符和时间表示复杂的逻辑关系。

    ps:  现在已经更改语句了,详情看我的链接

https://blog.51cto.com/13824643/2137344

一般在不复杂的时序逻辑中,都使用静态时序逻辑,并且同组合逻辑相组合。

下面是一个关于检测序列的sc程序,只有当检测到3个连续的1时,流水检测才输出为1:

#include "base.h"
#ifndef STREAMCHECK
#define STREAMCHECK
const int size = 3 ;
SC_MODULE(streamcheck){
    sc_in<bool >stream_in , clk ;
    sc_out<bool> check ;
    sc_signal<sc_uint<size> > reg ;
    void move();
    void getcheck();
    SC_CTOR(streamcheck){
        reg = 0 ;
        SC_METHOD(move);
        sensitive_pos<<clk;    
        //  sequential logic  ,   triggered by the clk !!!
        sc_METHOD(check);
        sensitive<<reg ;       
        //  combinational logic ,  determine by the reg .
        //  Hold one thing ! the sc_signal is equal to the reg type in the verilog hdl .
    }
};
#endif



#include "clkcounter.h"
void clkcounter::reset(){
    counter = 0 ;
}
void clkcounter::count(){
    if( en ){
        sc_uint<5> temp = count.read() ;
        if ( temp > 32 ) carry = 1 ;
        else carry = 0 ;
        count = temp+1
    }
}
void startcount(){
    en = 1 ;
}
void stopcount(){
    en = 0 ;
}

在这种同步的时序下,可以添加只由端口跳变触发的进程函数来达到异步的目的。
同时注意一点:在进程或线程函数的条件分支没有完全覆盖时会产生不必要的锁存器,这时需要通过对其取默认值的方式进行解决。

另外博主再加一个脉冲计数器的模型:

#include "base.h"
#ifndef CLKCOUNTER
#define CLKCOUNTER
SC_MODULE(clk_counter){
    sc_in<bool>  clk , start , stop , reset ;
    sc_out<bool> carry ;
    sc_out<sc_uint<5> > counter ;
    sc_signal<bool> en ;
    void reset() ;
    void count() ;
    void startcount();
    void stopcount();
    SC_CTOR(clk_counter){
        SC_METHOD(reset);     
        //  asynchronous reset port !
        sensitive<<reset;
        SC_METHOD(count);     
        //   triggered by the clk , but need to check the en signal 
        sensitive<<clk;
        SC_METHOD(startcount);    
        // when the start port meet posedge , count process start !
        sensitive_pos<<start;
        SC_METHOD(stopcount);     
        // when the stop port meet  negedge , count process end ! 
        sensitive_neg<<stop;
    }
};
#endif







#include "clkcounter.h"

void clkcounter::reset(){
    counter = 0 ;
}

void clkcounter::count(){
    if( en ){
        sc_uint<5> temp = count.read() ;
        if ( temp > 32 ) carry = 1 ;
        else carry = 0 ;
        count = temp+1
    }
}

void startcount(){
    en = 1 ;
}

void stopcount(){
    en = 0 ;
}

转载于:https://blog.51cto.com/13824643/2137263

最后

以上就是健忘大雁为你收集整理的systemC的同步时序建模的全部内容,希望文章能够帮你解决systemC的同步时序建模所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部