我正在用SystemC开发一个简单的NAND模块。根据规范,它应该有4 ns的延迟,所以我尝试用一个带有"wait“语句和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;
}代码在编译和模拟时没有错误,但是当在gtkwave中可视化.vcd文件时,输出(F)被卡在1中,只显示模拟开始时的延迟。
为了测试代码中是否有任何错误,我删除了"wait“语句,并在nand.h文件中将SC_THREAD更改为SC_METHOD,然后再次模拟,现在得到了正确的结果,当然没有延迟。
我做错了什么?
发布于 2014-10-01 04:55:44
刚刚解决了这个问题:
不是使用
wait(4, SC_NS); 使用SC_THREAD时,我使用
next_trigger(4, SC_NS);使用SC_METHOD,它工作得很好。
发布于 2015-10-27 17:11:51
最好是对process do_nand2使用SC_METHOD,它对输入很敏感。线程内部通常有一个无限循环,它在整个模拟过程中运行。当触发时,一个方法从头到尾只运行一次。线程主要用于刺激或并发进程,线程可能对任何事件敏感,也可能对任何事件不敏感。
https://stackoverflow.com/questions/26125756
复制相似问题