Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
M
mock-turtle
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
hdl-core-lib
mock-turtle
Commits
15fc894f
Commit
15fc894f
authored
Jul 26, 2018
by
Tristan Gingold
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix eth ep test.
parent
e798aa45
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
115 additions
and
193 deletions
+115
-193
Manifest.py
hdl/testbench/mt_eth_ep/Manifest.py
+2
-1
main.sv
hdl/testbench/mt_eth_ep/main.sv
+81
-83
rmq-udp-send.c
tests/firmware/rmq-udp-send/rmq-udp-send.c
+32
-109
No files found.
hdl/testbench/mt_eth_ep/Manifest.py
View file @
15fc894f
...
...
@@ -13,8 +13,9 @@ vcom_opt = "-93 -mixedsvvh"
include_dirs
=
[
"../include/"
,
"../include/regs/"
,
"../../ip_cores/urv-core/rtl/"
,
"../../ip_cores/wr-cores/sim"
,
"../../ip_cores/general-cores/sim/"
,
"../../ip_cores/urv-core/rtl/"
,
]
files
=
[
...
...
hdl/testbench/mt_eth_ep/main.sv
View file @
15fc894f
...
...
@@ -24,6 +24,10 @@
`include
"mock_turtle_driver.svh"
`include
"vhd_wishbone_master.svh"
`include
"if_wb_master.svh"
`include
"if_wb_slave.svh"
`include
"wb_packet_sink.svh"
`include
"wb_packet_source.svh"
import
mock_turtle_pkg
::*;
...
...
@@ -31,50 +35,8 @@ import wr_fabric_pkg::*;
import
mt_mqueue_pkg
::*;
`include
"stream_mon.svh"
`include
"string_utils.svh"
`timescale
1
ns
/
1
ps
typedef
byte
byte_vector_t
[$]
;
function
automatic
byte_vector_t
loadPacketFromFile
(
string
name
)
;
integer
fd
;
byte_vector_t
rv
;
fd
=
$
fopen
(
name
,
"r"
)
;
if
(
fd
==
0
)
$
error
(
"Can't open '%s'"
,
name
)
;
while
(
1
)
begin
string
s
;
int
n
,
i
;
string_array_t
tokens
;
n
=
$
fgets
(
s
,
fd
)
;
if
(
n
<=
0
)
break
;
tokens
=
tokenizeString
(
s
)
;
for
(
i
=
1
;
i
<
tokens
.
size
()
;
i
++
)
rv
.
push_back
(
parseHex
(
tokens
[
i
]
)
)
;
end
return
rv
;
endfunction
// loadPacketFromFile
module
main
;
reg
rst_n
=
0
;
...
...
@@ -94,11 +56,49 @@ module main;
rst_n
=
1
;
end
//`undef USE_INTEGRATED_ENDPOINT
mock_turtle_core
#
IWishboneMaster
#(
.
g_data_width
(
16
)
,
.
g_addr_width
(
2
))
U_wrf_source
(
)
.
clk_i
(
clk_sys
)
,
.
rst_n_i
(
rst_n
)
)
;
assign
eth_snk_in
.
adr
=
U_wrf_source
.
adr
;
assign
eth_snk_in
.
dat
=
U_wrf_source
.
dat_o
;
assign
eth_snk_in
.
cyc
=
U_wrf_source
.
cyc
;
assign
eth_snk_in
.
stb
=
U_wrf_source
.
stb
;
assign
eth_snk_in
.
we
=
U_wrf_source
.
we
;
assign
eth_snk_in
.
sel
=
U_wrf_source
.
sel
;
assign
U_wrf_source
.
ack
=
eth_snk_out
.
ack
;
assign
U_wrf_source
.
stall
=
eth_snk_out
.
stall
;
assign
U_wrf_source
.
err
=
eth_snk_out
.
err
;
assign
U_wrf_source
.
rty
=
eth_snk_out
.
rty
;
IWishboneSlave
#(
.
g_data_width
(
16
)
,
.
g_addr_width
(
2
))
U_wrf_sink
(
.
clk_i
(
clk_sys
)
,
.
rst_n_i
(
rst_n
)
)
;
assign
U_wrf_sink
.
adr
=
eth_src_out
.
adr
;
assign
U_wrf_sink
.
dat_i
=
eth_src_out
.
dat
;
assign
U_wrf_sink
.
cyc
=
eth_src_out
.
cyc
;
assign
U_wrf_sink
.
stb
=
eth_src_out
.
stb
;
assign
U_wrf_sink
.
we
=
eth_src_out
.
we
;
assign
U_wrf_sink
.
sel
=
eth_src_out
.
sel
;
assign
eth_src_in
.
ack
=
U_wrf_sink
.
ack
;
assign
eth_src_in
.
stall
=
U_wrf_sink
.
stall
;
assign
eth_src_in
.
err
=
U_wrf_sink
.
err
;
assign
eth_src_in
.
rty
=
U_wrf_sink
.
rty
;
mock_turtle_core
#()
DUT
(
.
clk_i
(
clk_sys
)
,
.
rst_n_i
(
rst_n
)
,
...
...
@@ -122,14 +122,20 @@ module main;
.
console_irq_o
()
)
;
mt_
rmq_ethernet_endpoint
mt_
ep_ethernet_single
EP
(
.
clk_i
(
clk_sys
)
,
.
rst_n_i
(
rst_n
)
,
.
mt_rmq_i
(
mt2ep
)
,
.
mt_rmq_o
(
ep2mt
)
,
.
rmq_src_i
(
mt2ep
.
snk_out
[
0
][
0
])
,
.
rmq_src_o
(
ep2mt
.
snk_in
[
0
][
0
])
,
.
rmq_src_config_i
(
mt2ep
.
snk_config_out
[
0
][
0
])
,
.
rmq_src_config_o
(
ep2mt
.
snk_config_in
[
0
][
0
])
,
.
rmq_snk_i
(
mt2ep
.
src_out
[
0
][
0
])
,
.
rmq_snk_o
(
ep2mt
.
src_in
[
0
][
0
])
,
.
rmq_snk_config_i
(
mt2ep
.
src_config_out
[
0
][
0
])
,
.
rmq_snk_config_o
(
ep2mt
.
src_config_in
[
0
][
0
])
,
.
eth_src_o
(
eth_src_out
)
,
.
eth_src_i
(
eth_src_in
)
,
...
...
@@ -138,33 +144,7 @@ module main;
.
eth_snk_i
(
eth_snk_in
)
)
;
assign
eth_src_in
.
ack
=
1'b1
;
assign
eth_src_in
.
stall
=
1'b0
;
assign
eth_src_in
.
err
=
1'b0
;
assign
eth_src_in
.
rty
=
1'b0
;
// assign eth_snk_in.cyc = 1'b0;
/* stream_mon MonOut
(
.clk_i(clk_sys),
.rst_n_i(rst_n),
.snk_in_i(rmq_src_out[0][0]),
.snk_out_i(rmq_src_in[0][0])
);*/
wr_fabric_master
EthSrc
(
.
clk_i
(
clk_sys
)
,
.
rst_n_i
(
rst_n
)
,
.
src_i
(
eth_snk_out
)
,
.
src_o
(
eth_snk_in
)
)
;
IVHDWishboneMaster
Host
(
clk_sys
,
rst_n
)
;
IVHDWishboneMaster
Host
(
clk_sys
,
rst_n
)
;
IMockTurtleIRQ
IrqMonitor
(
`MT_ATTACH_IRQ
(
DUT
))
;
...
...
@@ -175,11 +155,12 @@ module main;
MockTurtleDriver
drv
;
initial
begin
automatic
byte_vector_t
pkt
=
loadPacketFromFile
(
"1.dump"
)
;
automatic
WBPacketSink
sink
=
new
(
U_wrf_sink
.
get_accessor
())
;
automatic
WBPacketSource
src
=
new
(
U_wrf_source
.
get_accessor
())
;
#
10u
s
;
drv
=
new
(
Host
.
get_accessor
()
,
mt_base
,
IrqMonitor
,
1'b0
)
;
drv
=
new
(
Host
.
get_accessor
()
,
mt_base
,
IrqMonitor
)
;
drv
.
init
()
;
...
...
@@ -194,19 +175,36 @@ module main;
fork
forever
begin
t_notify_queue
ntf
;
// Wait for interrupts
drv
.
update
()
;
// Check notifications.
drv
.
get_cpu_notifications
(
0
,
ntf
)
;
if
(
ntf
.
size
)
begin
$
display
(
"Simulation PASSED"
)
;
$
finish
;
end
#
1u
s
;
end
begin
#
100u
s
;
EthSrc
.
send
(
pkt
)
;
forever
begin
EthPacket
pkt
;
sink
.
recv
(
pkt
)
;
pkt
.
dump
;
for
(
int
i
=
24
;
i
<
pkt
.
payload
.
size
()
;
i
++
)
pkt
.
payload
[
i
]
=
~
pkt
.
payload
[
i
]
;
src
.
send
(
pkt
)
;
end
begin
#
400u
s
;
$
fatal
(
1
,
"Simulation FAILED"
)
;
end
join
end
// initial begin
endmodule
// main
tests/firmware/rmq-udp-send/rmq-udp-send.c
View file @
15fc894f
#include <mockturtle-rt.h>
// maximum payload size of the test packets, in 32-bit words
#define MAX_RMQ_PAYLOAD 128
// maximum header (UDP+IP+Ethernet) size of the test packets, in 32-bit words
#define MAX_RMQ_HEADER 128
#define TEST_MESSAGE_ID 0xdeadbeef
struct
trtl_test_message
{
// Message id (0xdeadbeef)
uint32_t
id
;
// MT CPU that sent the message
uint32_t
cpu
;
// Sequence number
uint32_t
seq
;
// Statistics: total number of packets received by the MT CPU
uint32_t
n_rx
;
// Statistics: number of packets missed (by finding gaps in the sequential numbers)
uint32_t
n_missed
;
// Statistics: number of packets received with errors
uint32_t
n_errors
;
// Payload size in 32-bit words
uint32_t
payload_len
;
uint32_t
payload
[
MAX_RMQ_PAYLOAD
];
};
uint32_t
tx_seq_count
=
0
;
uint32_t
rx_count
=
0
;
uint32_t
rx_last_id
=
-
1
;
uint32_t
rx_missed
=
0
;
uint32_t
rx_errors
=
0
;
void
send_reply
(
int
cpu_id
,
int
rmq
,
int
payload_len
)
static
void
send_pkt
(
int
rmq
,
unsigned
val
)
{
struct
trtl_fw_msg
msg
;
// queue full? wait
if
(
!
mq_claim
(
TRTL_RMQ
,
rmq
))
return
;
while
(
!
mq_claim
(
TRTL_RMQ
,
rmq
))
;
mq_map_out_message
(
TRTL_RMQ
,
rmq
,
&
msg
);
msg
.
header
->
len
=
payload_len
+
7
;
struct
trtl_test_message
*
p
=
msg
.
payload
;
p
->
id
=
TEST_MESSAGE_ID
;
p
->
cpu
=
cpu_id
;
p
->
seq
=
tx_seq_count
++
;
p
->
n_rx
=
rx_count
;
p
->
n_missed
=
rx_missed
;
p
->
n_errors
=
rx_errors
;
p
->
payload_len
=
payload_len
;
unsigned
*
p
=
msg
.
payload
;
msg
.
header
->
len
=
2
;
// make some dummy payload
for
(
int
i
=
0
;
i
<
payload_len
;
i
++
)
{
p
->
payload
[
i
]
=
(((
i
<<
16
)
|
i
)
^
0xffff0000
);
}
p
[
0
]
=
TEST_MESSAGE_ID
;
p
[
1
]
=
val
;
mq_send
(
TRTL_RMQ
,
rmq
);
}
void
handle_rx
(
int
cpu_id
,
int
rmq
)
static
unsigned
handle_rx
(
int
rmq
)
{
if
(
!
mq_poll_in
(
TRTL_RMQ
,
1
<<
rmq
))
return
;
unsigned
res
;
while
(
!
mq_poll_in
(
TRTL_RMQ
,
1
<<
rmq
))
;
struct
trtl_fw_msg
tmsg
;
mq_map_in_message
(
TRTL_RMQ
,
rmq
,
&
tmsg
);
struct
trtl_test_message
*
p
=
tmsg
.
payload
;
if
(
p
->
id
!=
TEST_MESSAGE_ID
)
{
rx_errors
++
;
mq_discard
(
TRTL_RMQ
,
rmq
);
return
;
}
// validate the payload
for
(
int
i
=
0
;
i
<
p
->
payload_len
;
i
++
)
{
if
(
p
->
payload
[
i
]
!=
(((
i
<<
16
)
|
i
)
^
0xffff0000
))
{
rx_errors
++
;
break
;
}
}
// look for missing packets
if
(
p
->
seq
==
0
)
{
rx_missed
=
0
;
tx_seq_count
=
0
;
}
else
if
(
rx_count
!=
0
&&
(
rx_last_id
+
1
)
!=
p
->
seq
)
{
rx_missed
+=
p
->
seq
-
rx_last_id
-
1
;
}
rx_last_id
=
p
->
seq
;
rx_count
++
;
send_reply
(
cpu_id
,
rmq
,
p
->
payload_len
);
unsigned
*
p
=
tmsg
.
payload
;
res
=
p
[
1
];
mq_discard
(
TRTL_RMQ
,
rmq
);
}
pp_printf
(
"Recv id=%x, val=%x
\n
"
,
p
[
0
],
p
[
1
]);
uint32_t
last_ts
=
0
;
mq_discard
(
TRTL_RMQ
,
rmq
)
;
void
print_stats
()
{
uint32_t
ts
=
trtl_get_runtime_milliseconds
();
if
((
last_ts
==
0
)
||
(
ts
>=
(
last_ts
+
1000
)))
{
pp_printf
(
"Stats: RX %"
PRId32
", missed %"
PRId32
", errors %"
PRId32
"
\n\r
"
,
rx_count
,
rx_missed
,
rx_errors
);
last_ts
=
ts
;
}
return
res
;
}
int
main
()
{
int
cpu
=
trtl_get_core_id
()
;
unsigned
v
;
int
rmq
=
0
;
last_ts
=
0
;
struct
trtl_ep_address
bind_addr
;
pp_printf
(
"
TEST for: RMQ UDP send/receive, slot %d, cpu %d
\r\n
"
,
rmq
,
cpu
);
pp_printf
(
"
RMQ UDP EP test
\n
"
);
// set up the RMQ Endpoint
...
...
@@ -147,7 +64,7 @@ int main()
bind_addr
.
dst_mac
[
3
]
=
0xff
;
bind_addr
.
dst_mac
[
4
]
=
0xff
;
bind_addr
.
dst_mac
[
5
]
=
0xff
;
// destination port
bind_addr
.
dst_port
=
12345
;
// source port
...
...
@@ -159,17 +76,23 @@ int main()
bind_addr
.
ethertype
=
0x800
;
// IPv4
// RX filter: we want only UDP packets with matching desination port & IP address.
bind_addr
.
filter
=
TRTL_EP_FILTER_UDP
|
TRTL_EP_FILTER_DST_PORT
|
TRTL_EP_FILTER_DST_IP
;
bind_addr
.
filter
|=
TRTL_EP_FILTER_ENABLE
;
// configure outgoing channel
mq_bind
(
TRTL_RMQ
,
rmq
,
1
,
&
bind_addr
);
// configure incoming channel
mq_bind
(
TRTL_RMQ
,
rmq
,
0
,
&
bind_addr
);
for
(;;)
{
handle_rx
(
cpu
,
rmq
);
print_stats
();
}
send_pkt
(
0
,
0x123
);
v
=
handle_rx
(
0
);
pp_printf
(
"rx(1): %x
\n
"
,
v
);
send_pkt
(
0
,
v
);
v
=
handle_rx
(
0
);
pp_printf
(
"rx(2): %x
\n
"
,
v
);
if
(
v
==
0x123
)
{
lr_writel
(
v
,
MT_CPU_LR_REG_NTF_INT
);
}
return
0
;
}
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