SystemC 仿真错过了第一次迭代
SystemC simulation misses the first iteration
我在启动模拟时遇到困难。
每当我开始 for
循环时,我总是错过循环的第一次迭代。
这是我的代码:
#include <systemc.h>
#include <iostream>
using namespace std;
SC_MODULE(cpu){
sc_in_clk clk { "cpu_clk" };
sc_in<bool> rw { "cpu_rw" };
sc_inout<sc_lv<16>> dbus { "cpu_dbus" };
sc_out<sc_lv<20>> abus { "cpu_abus" };
void cpu_loop();
SC_CTOR(cpu){
SC_CTHREAD(cpu_loop, clk.pos());
}
};
void cpu::cpu_loop(){
while(1){
wait();
cout << "cpu" << endl;
}
}
SC_MODULE(sram){
sc_in_clk clk { "sram_clk" };
sc_in<bool> rw { "sram_rw" };
sc_inout<sc_lv<16>> dbus { "sram_dbus" };
sc_in<sc_lv<20>> abus { "sram_abus" };
void sram_loop();
SC_CTOR(sram){
SC_CTHREAD(sram_loop, clk.pos());
}
};
void sram::sram_loop(){
while(1){
wait();
cout << "sram" << endl;
}
}
int sc_main(int argc, char* argv[]) {
int i;
sc_signal<sc_lv<16>, SC_MANY_WRITERS> dbus { "main_dbus" };
sc_signal<sc_lv<20>, SC_MANY_WRITERS> abus { "main_abus" };
sc_signal<bool> clk { "main_clk" };
sc_signal<bool> rw { "main_rw" };
cpu custom_cpu("custom_cpu");
sram custom_sram ("custom_sram");
custom_cpu.abus(abus);
custom_cpu.dbus(dbus);
custom_cpu.clk(clk);
custom_cpu.rw(rw);
custom_sram.abus(abus);
custom_sram.dbus(dbus);
custom_sram.clk(clk);
custom_sram.rw(rw);
sc_start(1, SC_MS);
clk = 0;
for(i = 0; i < 10; i++){
cout << "============== " << i << "==============" << endl;
clk = 1;
sc_start(1, SC_MS);
clk = 0;
sc_start(1, SC_MS);
}
return 0;
}
这是输出:
============== 0==============
============== 1==============
cpu
sram
============== 2==============
cpu
sram
============== 3==============
cpu
sram
============== 4==============
cpu
sram
============== 5==============
cpu
sram
============== 6==============
cpu
sram
============== 7==============
cpu
sram
============== 8==============
cpu
sram
============== 9==============
cpu
sram
我已经搜索了一个答案,但似乎没有其他人有这个问题,所以我假设我做错了什么。
如果在 while
循环中调用 wait
之前 在 之前打印出来,就会得到预期的输出。这与 for
循环一致。
例如:
void cpu::cpu_loop(){
while(1){
cout << "cpu" << endl;
wait();
}
}
这在 EDA playgrpound.
上运行
我在启动模拟时遇到困难。
每当我开始 for
循环时,我总是错过循环的第一次迭代。
这是我的代码:
#include <systemc.h>
#include <iostream>
using namespace std;
SC_MODULE(cpu){
sc_in_clk clk { "cpu_clk" };
sc_in<bool> rw { "cpu_rw" };
sc_inout<sc_lv<16>> dbus { "cpu_dbus" };
sc_out<sc_lv<20>> abus { "cpu_abus" };
void cpu_loop();
SC_CTOR(cpu){
SC_CTHREAD(cpu_loop, clk.pos());
}
};
void cpu::cpu_loop(){
while(1){
wait();
cout << "cpu" << endl;
}
}
SC_MODULE(sram){
sc_in_clk clk { "sram_clk" };
sc_in<bool> rw { "sram_rw" };
sc_inout<sc_lv<16>> dbus { "sram_dbus" };
sc_in<sc_lv<20>> abus { "sram_abus" };
void sram_loop();
SC_CTOR(sram){
SC_CTHREAD(sram_loop, clk.pos());
}
};
void sram::sram_loop(){
while(1){
wait();
cout << "sram" << endl;
}
}
int sc_main(int argc, char* argv[]) {
int i;
sc_signal<sc_lv<16>, SC_MANY_WRITERS> dbus { "main_dbus" };
sc_signal<sc_lv<20>, SC_MANY_WRITERS> abus { "main_abus" };
sc_signal<bool> clk { "main_clk" };
sc_signal<bool> rw { "main_rw" };
cpu custom_cpu("custom_cpu");
sram custom_sram ("custom_sram");
custom_cpu.abus(abus);
custom_cpu.dbus(dbus);
custom_cpu.clk(clk);
custom_cpu.rw(rw);
custom_sram.abus(abus);
custom_sram.dbus(dbus);
custom_sram.clk(clk);
custom_sram.rw(rw);
sc_start(1, SC_MS);
clk = 0;
for(i = 0; i < 10; i++){
cout << "============== " << i << "==============" << endl;
clk = 1;
sc_start(1, SC_MS);
clk = 0;
sc_start(1, SC_MS);
}
return 0;
}
这是输出:
============== 0==============
============== 1==============
cpu
sram
============== 2==============
cpu
sram
============== 3==============
cpu
sram
============== 4==============
cpu
sram
============== 5==============
cpu
sram
============== 6==============
cpu
sram
============== 7==============
cpu
sram
============== 8==============
cpu
sram
============== 9==============
cpu
sram
我已经搜索了一个答案,但似乎没有其他人有这个问题,所以我假设我做错了什么。
如果在 while
循环中调用 wait
之前 在 之前打印出来,就会得到预期的输出。这与 for
循环一致。
例如:
void cpu::cpu_loop(){
while(1){
cout << "cpu" << endl;
wait();
}
}
这在 EDA playgrpound.
上运行