-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathtest_mif_array_with_ptr2.cpp
130 lines (103 loc) · 2.62 KB
/
test_mif_array_with_ptr2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/******************************************************************************
* Copyright (c) 2020, Intel Corporation. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception.
*
*****************************************************************************/
//
// Created by mmoiseev on 06/14/19.
//
#include <systemc.h>
// Array of modular interface pointers with port/signal pointers
struct mod_if : public sc_module, sc_interface
{
sc_in_clk clk;
sc_in<bool> rst;
sc_in<int>* in;
sc_out<int>* out;
sc_signal<int>* p;
sc_signal<int>* q;
sc_uint<4>* vp;
SC_CTOR(mod_if)
{
in = new sc_in<int>("in");
out = new sc_out<int>("out");
p = new sc_signal<int>("p");
q = new sc_signal<int>("q");
vp = sc_new<sc_uint<4>>();
SC_METHOD(ptrProc);
sensitive << *p << *in;
SC_CTHREAD(thrProc, clk.pos());
async_reset_signal_is(rst, true);
}
void ptrProc() {
*out = *in;
*out = *p;
*vp = 3;
}
void thrProc() {
*p = 2;
wait();
while (true) {
p->write(in->read());
wait();
}
}
int getP() {
return p->read();
}
void setQ(int val) {
*q = val;
}
};
SC_MODULE(Top) {
sc_in_clk clk{"clk"};
sc_signal<bool> rst;
sc_signal<int> t;
sc_signal<int> z;
mod_if* minst[2];
SC_CTOR(Top) {
for (int i = 0; i < 2; i++) {
minst[i] = new mod_if("mod_if");
minst[i]->clk(clk);
minst[i]->rst(rst);
}
minst[0]->in->bind(t);
minst[1]->in->bind(z);
minst[0]->out->bind(t);
minst[1]->out->bind(z);
SC_METHOD(top_method);
sensitive << t << *minst[0]->p;
SC_CTHREAD(top_thread, clk.pos());
async_reset_signal_is(rst, true);
}
void top_method()
{
int j = 0;
for (int i = 0; i < 2; i++) {
j += minst[i]->getP();
}
}
void top_thread()
{
int j = 0;
for (int i = 0; i < 2; i++) {
j += minst[i]->getP();
}
wait();
while(true) {
for (int i = 0; i < 2; i++) {
minst[i]->setQ(i);
}
wait();
}
}
};
int sc_main(int argc, char **argv)
{
sc_clock clk {"clk", sc_time(1, SC_NS)};
Top top{"top"};
top.clk(clk);
sc_start();
return 0;
}