Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ycai
simbricks
Commits
8fd5e8ed
Commit
8fd5e8ed
authored
Apr 22, 2022
by
Antoine Kaufmann
Browse files
sims/nic/corundum: new API refactor
parent
6d86b7a5
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
87 deletions
+77
-87
sims/nic/corundum/corundum_verilator.cc
sims/nic/corundum/corundum_verilator.cc
+75
-86
sims/nic/corundum/rules.mk
sims/nic/corundum/rules.mk
+2
-1
No files found.
sims/nic/corundum/corundum_verilator.cc
View file @
8fd5e8ed
...
@@ -32,10 +32,9 @@
...
@@ -32,10 +32,9 @@
#include <verilated_vcd_c.h>
#include <verilated_vcd_c.h>
#endif
#endif
#include <simbricks/base/cxxatomicfix.h>
extern
"C"
{
extern
"C"
{
#include <simbricks/nicif/nicif.h>
#include <simbricks/nicif/nicif.h>
#include <simbricks/proto/base.h>
#include <simbricks/proto/pcie.h>
}
}
#include "sims/nic/corundum/coord.h"
#include "sims/nic/corundum/coord.h"
...
@@ -48,9 +47,6 @@ extern "C" {
...
@@ -48,9 +47,6 @@ extern "C" {
struct
DMAOp
;
struct
DMAOp
;
static
uint64_t
clock_period
=
4
*
1000ULL
;
// 4ns -> 250MHz
static
uint64_t
clock_period
=
4
*
1000ULL
;
// 4ns -> 250MHz
static
uint64_t
sync_period
=
500
*
1000ULL
;
// 500ns
static
uint64_t
pci_latency
=
500
*
1000ULL
;
// 500ns
static
uint64_t
eth_latency
=
500
*
1000ULL
;
// 500ns
static
volatile
int
exiting
=
0
;
static
volatile
int
exiting
=
0
;
uint64_t
main_time
=
0
;
uint64_t
main_time
=
0
;
...
@@ -370,17 +366,15 @@ void pci_rwcomp_issue(MMIOOp *op) {
...
@@ -370,17 +366,15 @@ void pci_rwcomp_issue(MMIOOp *op) {
wc
=
&
msg
->
writecomp
;
wc
=
&
msg
->
writecomp
;
wc
->
req_id
=
op
->
id
;
wc
->
req_id
=
op
->
id
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
wc
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITECOMP
|
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITECOMP
);
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
else
{
}
else
{
rc
=
&
msg
->
readcomp
;
rc
=
&
msg
->
readcomp
;
memcpy
((
void
*
)
rc
->
data
,
&
op
->
value
,
op
->
len
);
memcpy
((
void
*
)
rc
->
data
,
&
op
->
value
,
op
->
len
);
rc
->
req_id
=
op
->
id
;
rc
->
req_id
=
op
->
id
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
rc
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_READCOMP
|
SIMBRICKS_PROTO_PCIE_D2H_MSG_READCOMP
);
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
}
delete
op
;
delete
op
;
...
@@ -404,18 +398,16 @@ void pci_dma_issue(DMAOp *op) {
...
@@ -404,18 +398,16 @@ void pci_dma_issue(DMAOp *op) {
// TODO(antoinek): check DMA length
// TODO(antoinek): check DMA length
memcpy
((
void
*
)
write
->
data
,
op
->
data
,
op
->
len
);
memcpy
((
void
*
)
write
->
data
,
op
->
data
,
op
->
len
);
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
write
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITE
);
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITE
|
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
else
{
}
else
{
volatile
struct
SimbricksProtoPcieD2HRead
*
read
=
&
msg
->
read
;
volatile
struct
SimbricksProtoPcieD2HRead
*
read
=
&
msg
->
read
;
read
->
req_id
=
(
uintptr_t
)
op
;
read
->
req_id
=
(
uintptr_t
)
op
;
read
->
offset
=
op
->
dma_addr
;
read
->
offset
=
op
->
dma_addr
;
read
->
len
=
op
->
len
;
read
->
len
=
op
->
len
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
read
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_READ
);
SIMBRICKS_PROTO_PCIE_D2H_MSG_READ
|
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
}
pci_dma_pending
.
insert
(
op
);
pci_dma_pending
.
insert
(
op
);
...
@@ -497,9 +489,8 @@ static void h2d_read(MMIOInterface &mmio,
...
@@ -497,9 +489,8 @@ static void h2d_read(MMIOInterface &mmio,
memcpy
((
void
*
)
rc
->
data
,
&
val
,
read
->
len
);
memcpy
((
void
*
)
rc
->
data
,
&
val
,
read
->
len
);
rc
->
req_id
=
read
->
req_id
;
rc
->
req_id
=
read
->
req_id
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
rc
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_READCOMP
|
SIMBRICKS_PROTO_PCIE_D2H_MSG_READCOMP
);
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
else
{
}
else
{
/*printf("read(bar=%u, off=%lu, len=%u) = %lu\n", read->bar, read->offset,
/*printf("read(bar=%u, off=%lu, len=%u) = %lu\n", read->bar, read->offset,
read->len, val);*/
read->len, val);*/
...
@@ -527,9 +518,8 @@ static void h2d_write(MMIOInterface &mmio,
...
@@ -527,9 +518,8 @@ static void h2d_write(MMIOInterface &mmio,
wc
=
&
msg
->
writecomp
;
wc
=
&
msg
->
writecomp
;
wc
->
req_id
=
write
->
req_id
;
wc
->
req_id
=
write
->
req_id
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
wc
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITECOMP
|
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITECOMP
);
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
else
{
}
else
{
mmio
.
issueWrite
(
write
->
req_id
,
write
->
offset
,
write
->
len
,
val
);
mmio
.
issueWrite
(
write
->
req_id
,
write
->
offset
,
write
->
len
,
val
);
}
}
...
@@ -537,13 +527,13 @@ static void h2d_write(MMIOInterface &mmio,
...
@@ -537,13 +527,13 @@ static void h2d_write(MMIOInterface &mmio,
static
void
poll_h2d
(
MMIOInterface
&
mmio
)
{
static
void
poll_h2d
(
MMIOInterface
&
mmio
)
{
volatile
union
SimbricksProtoPcieH2D
*
msg
=
volatile
union
SimbricksProtoPcieH2D
*
msg
=
Simbricks
Nic
IfH2DPoll
(
&
nicif
,
main_time
);
Simbricks
Pcie
IfH2D
In
Poll
(
&
nicif
.
pcie
,
main_time
);
uint8_t
t
;
uint8_t
t
;
if
(
msg
==
NULL
)
if
(
msg
==
NULL
)
return
;
return
;
t
=
msg
->
dummy
.
own_type
&
SIMBRICKS_PROTO_PCIE_H2D_MSG_MASK
;
t
=
SimbricksPcieIfH2DInType
(
&
nicif
.
pcie
,
msg
)
;
// std::cerr << "poll_h2d: polled type=" << (int) t << std::endl;
// std::cerr << "poll_h2d: polled type=" << (int) t << std::endl;
switch
(
t
)
{
switch
(
t
)
{
...
@@ -566,19 +556,18 @@ static void poll_h2d(MMIOInterface &mmio) {
...
@@ -566,19 +556,18 @@ static void poll_h2d(MMIOInterface &mmio) {
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_DEVCTRL
:
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_DEVCTRL
:
break
;
break
;
case
SIMBRICKS_PROTO_
PCIE_H2D_MSG
_SYNC
:
case
SIMBRICKS_PROTO_
MSG_TYPE
_SYNC
:
break
;
break
;
default:
default:
std
::
cerr
<<
"poll_h2d: unsupported type="
<<
t
<<
std
::
endl
;
std
::
cerr
<<
"poll_h2d: unsupported type="
<<
t
<<
std
::
endl
;
}
}
SimbricksNicIfH2DDone
(
&
nicif
,
msg
);
SimbricksPcieIfH2DInDone
(
&
nicif
.
pcie
,
msg
);
SimbricksNicIfH2DNext
(
&
nicif
);
}
}
static
volatile
union
SimbricksProtoPcieD2H
*
d2h_alloc
(
void
)
{
static
volatile
union
SimbricksProtoPcieD2H
*
d2h_alloc
(
void
)
{
return
Simbricks
Nic
IfD2HAlloc
(
&
nicif
,
main_time
);
return
Simbricks
Pcie
IfD2H
Out
Alloc
(
&
nicif
.
pcie
,
main_time
);
}
}
class
EthernetTx
{
class
EthernetTx
{
...
@@ -592,21 +581,18 @@ class EthernetTx {
...
@@ -592,21 +581,18 @@ class EthernetTx {
}
}
void
packet_done
()
{
void
packet_done
()
{
volatile
union
SimbricksProtoNet
D2N
*
msg
=
volatile
union
SimbricksProtoNet
Msg
*
msg
=
SimbricksN
icIfD2N
Alloc
(
&
nicif
,
main_time
);
SimbricksN
etIfOut
Alloc
(
&
nicif
.
net
,
main_time
);
volatile
struct
SimbricksProtoNet
D2NSend
*
send
;
volatile
struct
SimbricksProtoNet
MsgPacket
*
packet
;
if
(
!
msg
)
if
(
!
msg
)
throw
"completion alloc failed"
;
throw
"completion alloc failed"
;
send
=
&
msg
->
send
;
packet
=
&
msg
->
packet
;
memcpy
((
void
*
)
send
->
data
,
packet_buf
,
packet_len
);
memcpy
((
void
*
)
packet
->
data
,
packet_buf
,
packet_len
);
send
->
len
=
packet_len
;
packet
->
len
=
packet_len
;
send
->
timestamp
=
main_time
+
eth_latency
;
// WMB();
SimbricksNetIfOutSend
(
&
nicif
.
net
,
msg
,
SIMBRICKS_PROTO_NET_MSG_PACKET
);
send
->
own_type
=
SIMBRICKS_PROTO_NET_D2N_MSG_SEND
|
SIMBRICKS_PROTO_NET_D2N_OWN_NET
;
#ifdef ETH_DEBUG
#ifdef ETH_DEBUG
std
::
cerr
<<
main_time
<<
" EthernetTx: packet len="
<<
std
::
hex
std
::
cerr
<<
main_time
<<
" EthernetTx: packet len="
<<
std
::
hex
...
@@ -731,34 +717,32 @@ class EthernetRx {
...
@@ -731,34 +717,32 @@ class EthernetRx {
};
};
static
void
n2d_recv
(
EthernetRx
&
rx
,
static
void
n2d_recv
(
EthernetRx
&
rx
,
volatile
struct
SimbricksProtoNet
N2DRecv
*
recv
)
{
volatile
struct
SimbricksProtoNet
MsgPacket
*
packet
)
{
rx
.
packet_received
((
const
void
*
)
recv
->
data
,
recv
->
len
);
rx
.
packet_received
((
const
void
*
)
packet
->
data
,
packet
->
len
);
}
}
static
void
poll_n2d
(
EthernetRx
&
rx
)
{
static
void
poll_n2d
(
EthernetRx
&
rx
)
{
volatile
union
SimbricksProtoNet
N2D
*
msg
=
volatile
union
SimbricksProtoNet
Msg
*
msg
=
SimbricksN
icIfN2D
Poll
(
&
nicif
,
main_time
);
SimbricksN
etIfIn
Poll
(
&
nicif
.
net
,
main_time
);
uint8_t
t
;
uint8_t
t
;
if
(
msg
==
NULL
)
if
(
msg
==
NULL
)
return
;
return
;
t
=
msg
->
dummy
.
own_type
&
SIMBRICKS_PROTO_NET_N2D_MSG_MASK
;
t
=
SimbricksNetIfInType
(
&
nicif
.
net
,
msg
);
switch
(
t
)
{
switch
(
t
)
{
case
SIMBRICKS_PROTO_NET_
N2D_MSG_RECV
:
case
SIMBRICKS_PROTO_NET_
MSG_PACKET
:
n2d_recv
(
rx
,
&
msg
->
recv
);
n2d_recv
(
rx
,
&
msg
->
packet
);
break
;
break
;
case
SIMBRICKS_PROTO_
NET_N2D_MSG
_SYNC
:
case
SIMBRICKS_PROTO_
MSG_TYPE
_SYNC
:
break
;
break
;
default:
default:
std
::
cerr
<<
"poll_n2d: unsupported type="
<<
t
<<
std
::
endl
;
std
::
cerr
<<
"poll_n2d: unsupported type="
<<
t
<<
std
::
endl
;
}
}
SimbricksNicIfN2DDone
(
&
nicif
,
msg
);
SimbricksNetIfInDone
(
&
nicif
.
net
,
msg
);
SimbricksNicIfN2DNext
(
&
nicif
);
}
}
void
pci_msi_issue
(
uint8_t
vec
)
{
void
pci_msi_issue
(
uint8_t
vec
)
{
...
@@ -773,9 +757,8 @@ void pci_msi_issue(uint8_t vec) {
...
@@ -773,9 +757,8 @@ void pci_msi_issue(uint8_t vec) {
intr
->
vector
=
vec
;
intr
->
vector
=
vec
;
intr
->
inttype
=
SIMBRICKS_PROTO_PCIE_INT_MSI
;
intr
->
inttype
=
SIMBRICKS_PROTO_PCIE_INT_MSI
;
// WMB();
SimbricksPcieIfD2HOutSend
(
&
nicif
.
pcie
,
msg
,
intr
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_INTERRUPT
|
SIMBRICKS_PROTO_PCIE_D2H_MSG_INTERRUPT
);
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
}
static
void
msi_step
(
Vinterface
&
top
,
PCICoordinator
&
coord
)
{
static
void
msi_step
(
Vinterface
&
top
,
PCICoordinator
&
coord
)
{
...
@@ -797,30 +780,33 @@ static void msi_step(Vinterface &top, PCICoordinator &coord) {
...
@@ -797,30 +780,33 @@ static void msi_step(Vinterface &top, PCICoordinator &coord) {
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
{
char
*
vargs
[
2
]
=
{
argv
[
0
],
NULL
};
char
*
vargs
[
2
]
=
{
argv
[
0
],
NULL
};
Verilated
::
commandArgs
(
1
,
vargs
);
Verilated
::
commandArgs
(
1
,
vargs
);
int
sync_mode
=
SIMBRICKS_PROTO_SYNC_SIMBRICKS
;
struct
SimbricksBaseIfParams
netParams
;
struct
SimbricksBaseIfParams
pcieParams
;
#ifdef TRACE_ENABLED
#ifdef TRACE_ENABLED
Verilated
::
traceEverOn
(
true
);
Verilated
::
traceEverOn
(
true
);
#endif
#endif
if
(
argc
<
4
&&
argc
>
10
)
{
SimbricksNetIfDefaultParams
(
&
netParams
);
SimbricksPcieIfDefaultParams
(
&
pcieParams
);
if
(
argc
<
4
&&
argc
>
9
)
{
fprintf
(
stderr
,
fprintf
(
stderr
,
"Usage: corundum_verilator PCI-SOCKET ETH-SOCKET "
"Usage: corundum_verilator PCI-SOCKET ETH-SOCKET "
"SHM
[SYNC-MODE]
[START-TICK] [SYNC-PERIOD] [PCI-LATENCY] "
"SHM [START-TICK] [SYNC-PERIOD] [PCI-LATENCY] "
"[ETH-LATENCY] [CLOCK-FREQ-MHZ]
\n
"
);
"[ETH-LATENCY] [CLOCK-FREQ-MHZ]
\n
"
);
return
EXIT_FAILURE
;
return
EXIT_FAILURE
;
}
}
if
(
argc
>=
5
)
sync_mode
=
strtol
(
argv
[
4
],
NULL
,
0
);
if
(
argc
>=
6
)
if
(
argc
>=
6
)
main_time
=
strtoull
(
argv
[
5
],
NULL
,
0
);
main_time
=
strtoull
(
argv
[
4
],
NULL
,
0
);
if
(
argc
>=
7
)
if
(
argc
>=
7
)
sync_period
=
strtoull
(
argv
[
6
],
NULL
,
0
)
*
1000ULL
;
netParams
.
sync_interval
=
pcieParams
.
sync_interval
=
strtoull
(
argv
[
5
],
NULL
,
0
)
*
1000ULL
;
if
(
argc
>=
8
)
if
(
argc
>=
8
)
pci_latency
=
strtoull
(
argv
[
7
],
NULL
,
0
)
*
1000ULL
;
pci
eParams
.
link
_latency
=
strtoull
(
argv
[
6
],
NULL
,
0
)
*
1000ULL
;
if
(
argc
>=
9
)
if
(
argc
>=
9
)
et
h
_latency
=
strtoull
(
argv
[
8
],
NULL
,
0
)
*
1000ULL
;
n
et
Params
.
link
_latency
=
strtoull
(
argv
[
7
],
NULL
,
0
)
*
1000ULL
;
if
(
argc
>=
10
)
if
(
argc
>=
10
)
clock_period
=
1000000ULL
/
strtoull
(
argv
[
9
],
NULL
,
0
);
clock_period
=
1000000ULL
/
strtoull
(
argv
[
8
],
NULL
,
0
);
struct
SimbricksProtoPcieDevIntro
di
;
struct
SimbricksProtoPcieDevIntro
di
;
memset
(
&
di
,
0
,
sizeof
(
di
));
memset
(
&
di
,
0
,
sizeof
(
di
));
...
@@ -835,24 +821,15 @@ int main(int argc, char *argv[]) {
...
@@ -835,24 +821,15 @@ int main(int argc, char *argv[]) {
di
.
pci_revision
=
0x00
;
di
.
pci_revision
=
0x00
;
di
.
pci_msi_nvecs
=
32
;
di
.
pci_msi_nvecs
=
32
;
struct
SimbricksNicIfParams
nsparams
;
pcieParams
.
sock_path
=
argv
[
1
];
nsparams
.
sync_pci
=
1
;
netParams
.
sock_path
=
argv
[
2
];
nsparams
.
sync_eth
=
1
;
nsparams
.
pci_socket_path
=
argv
[
1
];
if
(
SimbricksNicIfInit
(
&
nicif
,
argv
[
3
],
&
netParams
,
&
pcieParams
,
&
di
))
{
nsparams
.
eth_socket_path
=
argv
[
2
];
nsparams
.
shm_path
=
argv
[
3
];
nsparams
.
pci_latency
=
pci_latency
;
nsparams
.
eth_latency
=
eth_latency
;
nsparams
.
sync_delay
=
sync_period
;
assert
(
sync_mode
==
SIMBRICKS_PROTO_SYNC_SIMBRICKS
||
sync_mode
==
SIMBRICKS_PROTO_SYNC_BARRIER
);
nsparams
.
sync_mode
=
sync_mode
;
if
(
SimbricksNicIfInit
(
&
nicif
,
&
nsparams
,
&
di
))
{
return
EXIT_FAILURE
;
return
EXIT_FAILURE
;
}
}
std
::
cout
<<
"sync_pci="
<<
nsparams
.
sync_pci
int
sync_pci
=
SimbricksBaseIfSyncEnabled
(
&
nicif
.
pcie
.
base
);
<<
" sync_eth="
<<
nsparams
.
sync_eth
<<
std
::
endl
;
int
sync_eth
=
SimbricksBaseIfSyncEnabled
(
&
nicif
.
net
.
base
);
std
::
cout
<<
"sync_pci="
<<
sync_pci
<<
" sync_eth="
<<
sync_eth
<<
std
::
endl
;
signal
(
SIGINT
,
sigint_handler
);
signal
(
SIGINT
,
sigint_handler
);
signal
(
SIGUSR1
,
sigusr1_handler
);
signal
(
SIGUSR1
,
sigusr1_handler
);
...
@@ -957,17 +934,29 @@ int main(int argc, char *argv[]) {
...
@@ -957,17 +934,29 @@ int main(int argc, char *argv[]) {
top
->
rst
=
0
;
top
->
rst
=
0
;
while
(
!
exiting
)
{
while
(
!
exiting
)
{
while
(
SimbricksNicIfSync
(
&
nicif
,
main_time
))
{
int
done
;
std
::
cerr
<<
"warn: SimbricksNicIfSync failed (t="
<<
main_time
<<
")"
do
{
<<
std
::
endl
;
done
=
1
;
}
if
(
SimbricksPcieIfD2HOutSync
(
&
nicif
.
pcie
,
main_time
)
<
0
)
{
SimbricksNicIfAdvanceEpoch
(
&
nicif
,
main_time
);
std
::
cerr
<<
"warn: SimbricksPcieIfD2HOutSync failed (t="
<<
main_time
<<
")"
<<
std
::
endl
;
done
=
0
;
}
if
(
SimbricksNetIfOutSync
(
&
nicif
.
net
,
main_time
)
<
0
)
{
std
::
cerr
<<
"warn: SimbricksNetIfOutSync failed (t="
<<
main_time
<<
")"
<<
std
::
endl
;
done
=
0
;
}
}
while
(
!
done
);
do
{
do
{
poll_h2d
(
mmio
);
poll_h2d
(
mmio
);
poll_n2d
(
rx
);
poll_n2d
(
rx
);
}
while
((
nsparams
.
sync_pci
||
nsparams
.
sync_eth
)
&&
}
while
(
!
exiting
&&
SimbricksNicIfNextTimestamp
(
&
nicif
)
<=
main_time
&&
!
exiting
);
((
sync_pci
&&
SimbricksPcieIfH2DInTimestamp
(
&
nicif
.
pcie
)
<=
main_time
)
||
(
sync_eth
&&
SimbricksNetIfInTimestamp
(
&
nicif
.
net
)
<=
main_time
)));
/* falling edge */
/* falling edge */
top
->
clk
=
!
top
->
clk
;
top
->
clk
=
!
top
->
clk
;
...
...
sims/nic/corundum/rules.mk
View file @
8fd5e8ed
...
@@ -44,7 +44,8 @@ $(verilator_src_corundum): $(vsrcs_corundum)
...
@@ -44,7 +44,8 @@ $(verilator_src_corundum): $(vsrcs_corundum)
-y
$(dir_corundum)
lib/axi/rtl
\
-y
$(dir_corundum)
lib/axi/rtl
\
-y
$(dir_corundum)
lib/eth/lib/axis/rtl/
\
-y
$(dir_corundum)
lib/eth/lib/axis/rtl/
\
-y
$(dir_corundum)
lib/pcie/rtl
\
-y
$(dir_corundum)
lib/pcie/rtl
\
$(dir_corundum)
rtl/interface.v
--exe
$(
abspath
$(srcs_corundum)
)
$(
abspath
$(lib_nicif)
)
$(dir_corundum)
rtl/interface.v
--exe
$(
abspath
$(srcs_corundum)
)
\
$(
abspath
$(lib_nicif)
$(lib_netif)
$(lib_pcie)
$(lib_base)
)
$(verilator_bin_corundum)
:
$(verilator_src_corundum) $(srcs_corundum)
\
$(verilator_bin_corundum)
:
$(verilator_src_corundum) $(srcs_corundum)
\
$(lib_nicif)
$(lib_nicif)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment