2

我正在 SystemC 中开发一个简单的 NAND 模块。按照规范,它应该有 4 ns 的延迟,所以我尝试用一​​个带有“等待”语句的进程来描述它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();
    }
};

描述了这两个模块后,顶部模块(在哪里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 进程do_nand2。线程内部通常有一个无限循环,它会在整个模拟过程中运行。一个方法在触发时从头到尾只运行一次。您主要将线程用于刺激或并发进程,线程可能对任何事件敏感,也可能不敏感。

于 2015-10-27T09:11:51.003 回答