2

SystemC で単純な NAND モジュールを開発しています。仕様では4nsの遅延が必要なので、SC_THREAD次のように「待機」ステートメントとを含むプロセスで記述しようとしました。

//file: nand.h
#include "systemc.h"

SC_MODULE(nand2){
    sc_in<bool> A, B; 
    sc_out<bool> F; 

    void do_nand2(){
        bool a, b, f;
        a = A.read();
        b = B.read();
        f = !(a && b);
        wait(4, SC_NS);
        F.write(f);
    }

    SC_CTOR(nand2){
        SC_THREAD(do_nand2);
        sensitive << A << B;
    }
};

シミュレートするために、次のように、NAND の刺激を出力する別のモジュールを作成しました。

//file: stim.h
#include "systemc.h"

SC_MODULE(stim){
    sc_out<bool> A, B;
    sc_in<bool> Clk;

    void stimGen(){
        wait();
        A.write(false);
        B.write(false);
        wait();
        A.write(false);
        B.write(true);
        wait();
        A.write(true);
        B.write(true);
        wait();
        A.write(true);
        B.write(false);
    }

    SC_CTOR(stim){
        SC_THREAD(stimGen);
        sensitive << Clk.pos();
    }
};

これら 2 つのモジュールを説明すると、最上位のモジュール (ある場所sc_main) は次のようになります。

//file: top.cpp    
#include "systemc.h"
#include "nand.h"
#include "stim.h"

int sc_main(int argc, char* argv[]){
    sc_signal<bool> ASig, BSig, FSig;
    sc_clock Clk("Clock", 100, SC_NS, 0.5);

    stim Stim("Stimulus");
    Stim.A(ASig); Stim.B(BSig); Stim.Clk(Clk);

    nand2 nand2("nand2");
    nand2.A(ASig); nand2.B(BSig); nand2.F(FSig);

    sc_trace_file *wf = sc_create_vcd_trace_file("sim");
    sc_trace(wf, Stim.Clk, "Clock");
    sc_trace(wf, nand2.A, "A");
    sc_trace(wf, nand2.B, "B");
    sc_trace(wf, nand2.F, "F");

    sc_start(400, SC_NS);

    sc_close_vcd_trace_file(wf);

    return 0;
}

コードはエラーなしでコンパイルおよびシミュレートされ.vcdましたが、gtkwave でファイルを視覚化すると、出力 (F) が 1 でスタックし、シミュレーションの最初の遅延のみが表示されます。

コードにエラーがあるかどうかをテストするために、「待機」ステートメントを削除してファイルに変更SC_THREADし、再度シミュレートしました。正しい結果が得られましたが、もちろん遅延はありませんでした。SC_METHODnand.h

私は何を間違っていますか?

4

2 に答える 2

3

問題を解決しました:

使用する代わりに

wait(4, SC_NS); 

私がSC_THREAD使った

next_trigger(4, SC_NS);

SC_METHOD、うまくいきました。

于 2014-09-30T20:55:44.220 に答える
3

入力に敏感なSC_METHODfor processを使用するのが最善です。do_nand2スレッドは通常、その内部に無限ループを持ち、シミュレーション全体にわたって実行されます。メソッドは、トリガーされると最初から最後まで 1 回だけ実行されます。スレッドは主に刺激または同時プロセスに使用され、スレッドはイベントに敏感な場合とそうでない場合があります。

于 2015-10-27T09:11:51.003 に答える