我正在尝试调试我写的更大的程序,我提取了一个线程,它基本上是将24个值的数组写入fifo,另一个端是另一个应该只读取数据的线程完成所有这些之后。
Transmit.h
#include "stdafx.h"
#include <iostream>
SC_MODULE(Transmit){
sc_inout <bool> ServerTx;
sc_fifo_out<int> PacketTx;
void Tx();
SC_CTOR(Transmit){
sc_fifo<int> PacketTx(24);
SC_THREAD(Tx){}
}
};
Transmit.cpp
#include "stdafx.h"
#include "Transmit.h"
void Transmit::Tx(){
int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 };
while (1){
if (ServerTx == 0){
cout << "ServerTx Before Write: " << ServerTx << endl;
for (int i = 0; i < 24; i++){
cout << "Transmit Value: " << imageInfo[i] << endl;
PacketTx.write(imageInfo[i]);
}
ServerTx = 1;
cout << "ServerTx After Write: " << ServerTx << endl;
}
else{
cout << "Done Transmitting Packet." << endl;
}
}
}
Main.cpp的
#include "stdafx.h"
#include "Transmit.h"
int _tmain(int argc, _TCHAR* argv[])
{
sc_signal <bool> ServerTx;
sc_fifo<int> Packet(24);
Transmit t1("Transmit");
t1.PacketTx(Packet);
t1.ServerTx(ServerTx);
ServerTx = 0;
sc_start();
return 0;
}
我所看到的是,无论何种类型,我声明我的信号ServerTx
,它永远不会更新其值。我不知道systemC是否有延迟更新信号值,但我不知道该怎么做。我将这个简单的握手扩展到我写的更大的程序中,如果这不起作用,那么我可能不得不废弃整个事情。
这是我看到的调试打印输出。我期望ServerTx
等于1,因为我只是设置它的值但是它保持为0.不知道发生了什么或者是否误解了SystemC中的某些内容。
更新
在while循环之后添加wait(SC_ZERO_TIME);
有助于更改ServerTx
的值,但现在当我添加我的接收代码时,我收到以下错误:
这是我的接收代码:
#include "stdafx.h"
#include "Receive.h"
void Receive::Rx(){
while (1){
if (ServerTx == 1){
cout << "ServerTx before Read: " << ServerTx << endl;
for (int i = 0; i < 24; i++){
imageInfo[i] = PacketRx.read();
cout << "Receive Value: " << imageInfo[i] << endl;
}
ServerTx = 0; //Done reading server packet data
cout << "ServerTx after Read: " << ServerTx << endl;
}
else{
wait(10, SC_NS);
}
wait(SC_ZERO_TIME);
}
}
我将Main.cpp更改为以下内容:
#include "stdafx.h"
#include "Receive.h"
#include "Transmit.h"
int _tmain(int argc, _TCHAR* argv[])
{
sc_signal <bool> ServerTx;
sc_fifo<int> Packet(24);
Receive r1("Receive");
r1.PacketRx(Packet);
r1.ServerTx(ServerTx);
Transmit t1("Transmit");
t1.PacketTx(Packet);
t1.ServerTx(ServerTx);
ServerTx = 0;
sc_start();
return 0;
}
答案 0 :(得分:1)
在Transmit::Tx
线程中,您不允许控制权返回SystemC内核。
SystemC是一个合作的多任务模拟环境。这意味着您需要定期将模拟状态与SystemC内核同步。
在Transmit.cpp中尝试此修改,以在模拟中添加增量延迟:
#include "stdafx.h"
#include "Transmit.h"
void Transmit::Tx(){
int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 };
while (1){
if (ServerTx == 0){
cout << "ServerTx Before Write: " << ServerTx << endl;
for (int i = 0; i < 24; i++){
cout << "Transmit Value: " << imageInfo[i] << endl;
PacketTx.write(imageInfo[i]);
}
ServerTx = 1;
cout << "ServerTx After Write: " << ServerTx << endl;
}
else{
cout << "Done Transmitting Packet." << endl;
}
wait(SC_ZERO_TIME); //< Delta Delay
}
}
备注:强>
参考:第2章第2.4节第29页关于SystemC仿真内核。 (或者查看Google图书快照here)。