Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
FMC DEL 1ns 4cha
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
2
Issues
2
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
FMC DEL 1ns 4cha
Commits
e4ad4327
Commit
e4ad4327
authored
Aug 13, 2012
by
Tomasz Wlostowski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
include: lots of fixes in simulation models (for VME top level)
parent
41a9236d
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
683 additions
and
202 deletions
+683
-202
acam_model.svh
hdl/include/acam_model.svh
+41
-39
if_wishbone.sv
hdl/include/if_wishbone.sv
+0
-159
mc100ep195.vh
hdl/include/mc100ep195.vh
+6
-3
random_pulse_gen.svh
hdl/include/random_pulse_gen.svh
+1
-1
timestamp.svh
hdl/include/timestamp.svh
+5
-0
sn74vmeh22501.v
hdl/include/vme64x_bfm/components/sn74vmeh22501.v
+41
-0
svec_vme_buffers.svh
hdl/include/vme64x_bfm/svec_vme_buffers.svh
+180
-0
vme64x_bfm.svh
hdl/include/vme64x_bfm/vme64x_bfm.svh
+409
-0
No files found.
hdl/include/acam_model.svh
View file @
e4ad4327
...
...
@@ -74,6 +74,9 @@ module acam_model
task
master_reset
;
int
i
;
if
(
g_verbose
)
$
display
(
"Acam::MasterReset"
)
;
q_start
=
new
(
16384
)
;
q_stop1
=
new
(
16384
)
;
...
...
@@ -119,7 +122,7 @@ module acam_model
always
@
(
posedge
DStart
)
if
(
PuResN
&&
!
StartDis
&&
!
start_disabled_int
)
begin
if
(
g_verbose
)$
display
(
"acam::start %d"
,
t
)
;
//
if(g_verbose)$display("acam::start %d", t);
q_start
.
put
(
t
)
;
start_disabled_int
<=
r_StartDisStart
;
...
...
@@ -127,7 +130,7 @@ module acam_model
always
@
(
posedge
DStop1
)
if
(
PuResN
&&
!
StopDis
[
1
])
begin
if
(
g_verbose
)$
display
(
"acam::stop1 %d"
,
t
)
;
if
(
g_verbose
)$
display
(
"acam::stop1 %d"
,
t
)
;
q_stop1
.
put
(
t
)
;
end
...
...
@@ -140,7 +143,7 @@ module acam_model
always
@
(
negedge
RDN
)
if
(
!
CSN
&&
WRN
)
begin
if
(
g_verbose
)$
display
(
"acam::read reg %x val %x
\n
"
,
Adr
,
RB
[
Adr
])
;
if
(
g_verbose
)$
display
(
"acam::read reg %x val %x
\n
"
,
Adr
,
RB
[
Adr
])
;
if
(
Adr
==
8
)
begin
int
hit
;
...
...
@@ -157,48 +160,47 @@ module acam_model
for
(
i
=
0
;
i
<
14
;
i
++
)
RB
[
i
]
<=
0
;
end
assign
D
=
(
!
OEN
)
?
DQ
:
28'bz
;
assign
D
=
(
!
CSN
&&
!
RDN
)
?
DQ
:
28'bz
;
initial
forever
always
@
(
posedge
RefClk
)
begin
int
t_start
,
t_stop1
,
n_starts
,
tmp
,
hit
;
#
1
;
q_stop1
.
get
(
t_stop1
)
;
while
(
q_start
.
num
()
>
0
)
begin
q_start
.
peek
(
t_start
)
;
if
(
t_start
<
t_stop1
)
begin
q_start
.
get
(
tmp
)
;
end
else
break
;
end
if
(
t_stop1
-
t_start
>
3780
)
hit
=
(
t_stop1
-
t_start
)
-
(
128
ns
/
g_rmode_resolution
)
+
rmode_start_offset
*
3
;
else
hit
=
t_stop1
-
t_start
+
rmode_start_offset
*
3
;
if
(
q_stop1
.
num
()
>
0
)
begin
q_stop1
.
get
(
t_stop1
)
;
while
(
q_start
.
num
()
>
0
)
begin
q_start
.
peek
(
t_start
)
;
if
(
t_start
<
t_stop1
)
begin
q_start
.
get
(
tmp
)
;
end
else
break
;
end
if
(
t_stop1
-
t_start
>
3780
)
hit
=
(
t_stop1
-
t_start
)
-
(
128
ns
/
g_rmode_resolution
)
+
rmode_start_offset
*
3
;
else
hit
=
t_stop1
-
t_start
+
rmode_start_offset
*
3
;
if
(
g_verbose
)$
display
(
"acam::hit1 %d t_stop1 %d t_start %d"
,
hit
,
t_stop1
,
t_start
)
;
if
(
g_verbose
)$
display
(
"acam::hit1 %d t_stop1 %d t_start %d"
,
hit
,
t_stop1
,
t_start
)
;
if
(
q_hit
.
num
()
==
0
)
begin
#(
c_empty_flag_delay
)
;
end
if
(
q_hit
.
num
()
==
0
)
begin
#(
c_empty_flag_delay
)
;
end
q_hit
.
put
(
hit
)
;
end
q_hit
.
put
(
hit
)
;
end
// if (q_stop1.num() > 0)
end
// always@ (posedge RefClk)
reg
fifo_empty
=
1
;
reg
fifo_notempty
=
0
;
...
...
hdl/include/if_wishbone.sv
deleted
100644 → 0
View file @
41a9236d
//
// Title : Software Wishbone master unit for testbenches
//
// File : if_wishbone.sv
// Author : Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
// Created : Tue Mar 23 12:19:36 2010
// Standard : SystemVerilog
//
// Default values of certain WB parameters.
`include
"simdrv_defs.sv"
interface
IWishbone
(
input
clk_i
,
input
rst_n_i
)
;
parameter
g_data_width
=
32
;
parameter
g_addr_width
=
32
;
/* Interface signals */
logic
[
g_addr_width
-
1
:
0
]
adr
;
logic
[
g_data_width
-
1
:
0
]
dat_o
;
logic
[
3
:
0
]
sel
;
// FIXME: 32-bit only
wire
[
g_data_width
-
1
:
0
]
dat_i
;
wire
ack
;
logic
cyc
;
logic
stb
;
logic
we
;
wire
stall
;
initial
begin
adr
=
0
;
dat_o
=
0
;
sel
=
0
;
cyc
=
0
;
stb
=
0
;
we
=
0
;
end
time
last_access_t
=
0
;
reg
[
g_data_width
-
1
:
0
]
dummy
;
// enables/disables displaying information about each read/write operation.
int
tb_verbose
=
0
;
task
verbose
(
int
onoff
)
;
tb_verbose
=
onoff
;
endtask
// wb_verbose
task
classic_single_rw_generic
;
input
[
g_addr_width
-
1
:
0
]
trans_addr
;
input
[
g_data_width
-
1
:
0
]
trans_wdata
;
output
[
g_data_width
-
1
:
0
]
trans_rdata
;
input
rw
;
input
[
3
:
0
]
size
;
begin
:
rw_generic_main
if
(
tb_verbose
&&
rw
)
$
display
(
"WB write %s: addr %x, data %x"
,
(
size
==
1
?
"byte"
:
((
size
==
2
)
?
"short"
:
"int"
))
,
trans_addr
,
trans_wdata
)
;
if
($
time
!=
last_access_t
)
begin
@
(
posedge
clk_i
)
;
end
stb
<=
1
;
cyc
<=
1
;
adr
<=
{
2'b00
,
trans_addr
[
31
:
2
]
};
we
<=
rw
;
if
(
rw
)
begin
case
(
size
)
4
:
begin
dat_o
<=
trans_wdata
;
sel
<=
4'b1111
;
end
2
:
begin
if
(
adr
[
1
])
begin
dat_o
[
31
:
16
]
<=
trans_wdata
[
15
:
0
]
;
sel
<=
4'b1100
;
end
else
begin
dat_o
[
15
:
0
]
<=
trans_wdata
[
15
:
0
]
;
sel
<=
4'b0011
;
end
end
1
:
begin
case
(
adr
[
1
:
0
])
0
:
begin
dat_o
[
31
:
24
]
<=
trans_wdata
[
7
:
0
]
;
sel
<=
4'b1000
;
end
1
:
begin
dat_o
[
23
:
16
]
<=
trans_wdata
[
7
:
0
]
;
sel
<=
4'b0100
;
end
2
:
begin
dat_o
[
15
:
8
]
<=
trans_wdata
[
7
:
0
]
;
sel
<=
4'b0010
;
end
3
:
begin
dat_o
[
7
:
0
]
<=
trans_wdata
[
7
:
0
]
;
sel
<=
4'b0001
;
end
endcase
// case(addr[1:0])
end
endcase
// case(size)
end
// if (rw)
@
(
posedge
clk_i
)
;
if
(
ack
==
0
)
begin
while
(
ack
==
0
)
begin
@
(
posedge
clk_i
)
;
end
end
trans_rdata
=
dat_i
;
cyc
<=
0
;
we
<=
0
;
stb
<=
0
;
if
(
tb_verbose
&&
!
rw
)
$
display
(
"WB read %s: addr %x, data %x"
,
(
size
==
1
?
"byte"
:
((
size
==
2
)
?
"short"
:
"int"
))
,
trans_addr
,
trans_rdata
)
;
last_access_t
=
$
time
;
end
endtask
// rw_generic
task
write32
;
input
[
g_addr_width
-
1
:
0
]
addr
;
input
[
31
:
0
]
data_i
;
begin
classic_single_rw_generic
(
addr
,
data_i
,
dummy
,
1
,
4
)
;
end
endtask
// write32
task
read32
;
input
[
g_addr_width
-
1
:
0
]
addr
;
output
[
31
:
0
]
data_o
;
begin
:
read32_body
reg
[
g_data_width
-
1
:
0
]
rval
;
classic_single_rw_generic
(
addr
,
0
,
rval
,
0
,
4
)
;
data_o
=
rval
[
31
:
0
]
;
end
endtask
// write32
modport
master
(
output
adr
,
output
dat_o
,
output
sel
,
output
cyc
,
output
stb
,
output
we
,
input
ack
,
input
dat_i
,
input
stall
)
;
endinterface
// IWishbone
hdl/include/mc100ep195.
sv
→
hdl/include/mc100ep195.
vh
View file @
e4ad4327
...
...
@@ -18,9 +18,12 @@ module mc100ep195
assign o = o_reg;
always
@
(
len
)
if
(
!
len
)
cur_dly
<=
delay
;
always@(posedge len)
begin
cur_dly <= delay;
end
always@(i)
o_reg <= #(c_min_delay + cur_dly * c_time_per_tap) i;
...
...
hdl/include/random_pulse_gen.svh
View file @
e4ad4327
...
...
@@ -25,7 +25,7 @@ module random_pulse_gen
end
else
begin
pulse_o
<=
1'b0
;
#
1
;
@
(
posedge
enable_i
)
;
end
endmodule
// random_pulse_gen
hdl/include/timestamp.svh
View file @
e4ad4327
...
...
@@ -21,6 +21,11 @@ class Timestamp;
return
real
'
(
utc
)
*
real
'
(
coarse_range
*
8
)
+
real
'
(
coarse
)
*
8.0
+
(
real
'
(
frac
)
/
4096.0
*
8.0
)
;
endfunction
// flatten
task
from_ps
(
int
x
)
;
unflatten
(
uint64_t
'
(
x
)
*
4096
/
8000
)
;
endtask
// from_ps
task
unflatten
(
int
x
)
;
int
t
;
t
=
x
;
...
...
hdl/include/vme64x_bfm/components/sn74vmeh22501.v
0 → 100644
View file @
e4ad4327
`timescale
1
ns
/
1
ns
module
sn74vmeh22501
(
input
oeab1
,
oeby1_n
,
a1
,
output
y1
,
inout
b1
,
input
oeab2
,
oeby2_n
,
a2
,
output
y2
,
inout
b2
,
input
oe_n
,
input
dir
,
clkab
,
le
,
clkba
,
inout
[
1
:
8
]
a3
,
inout
[
1
:
8
]
b3
)
;
assign
b1
=
oeab1
?
a1
:
1'bz
;
assign
y1
=
oeby1_n
?
1'bz
:
b1
;
assign
b2
=
oeab2
?
a2
:
1'bz
;
assign
y2
=
oeby2_n
?
1'bz
:
b2
;
reg
[
1
:
8
]
b3LFF
;
always
@
(
posedge
clkab
)
if
(
~
le
)
b3LFF
<=
#
1
a3
;
always
@*
if
(
le
)
b3LFF
=
a3
;
assign
b3
=
(
~
oe_n
&&
dir
)
?
b3LFF
:
8
'
hz
;
reg
[
1
:
8
]
a3LFF
;
always
@
(
posedge
clkba
)
if
(
~
le
)
a3LFF
<=
#
1
b3
;
always
@*
if
(
le
)
a3LFF
=
b3
;
assign
a3
=
(
~
oe_n
&&
~
dir
)
?
a3LFF
:
8
'
hz
;
endmodule
hdl/include/vme64x_bfm/svec_vme_buffers.svh
0 → 100644
View file @
e4ad4327
`include
"components/sn74vmeh22501.v"
`include
"vme64x_bfm.svh"
module
bidir_buf
(
a
,
b
,
dir
,
/* 0: a->b, 1: b->a */
oe_n
)
;
parameter
g_width
=
1
;
inout
[
g_width
-
1
:
0
]
a
,
b
;
input
dir
,
oe_n
;
assign
b
=
(
!
dir
&&
!
oe_n
)
?
a
:
'bz
;
assign
a
=
(
dir
&&
!
oe_n
)
?
b
:
'bz
;
endmodule
// bidir_buf
module
svec_vme_buffers
(
output
VME_AS_n_o
,
output
VME_RST_n_o
,
output
VME_WRITE_n_o
,
output
[
5
:
0
]
VME_AM_o
,
output
[
1
:
0
]
VME_DS_n_o
,
output
[
5
:
0
]
VME_GA_o
,
input
VME_BERR_i
,
input
VME_DTACK_n_i
,
input
VME_RETRY_n_i
,
input
VME_RETRY_OE_i
,
inout
VME_LWORD_n_b
,
inout
[
31
:
1
]
VME_ADDR_b
,
inout
[
31
:
0
]
VME_DATA_b
,
output
VME_BBSY_n_o
,
input
[
6
:
0
]
VME_IRQ_n_i
,
output
VME_IACKIN_n_o
,
input
VME_IACKOUT_n_i
,
output
VME_IACK_n_o
,
input
VME_DTACK_OE_i
,
input
VME_DATA_DIR_i
,
input
VME_DATA_OE_N_i
,
input
VME_ADDR_DIR_i
,
input
VME_ADDR_OE_N_i
,
IVME64X
.
slave
slave
)
;
pullup
(
slave
.
as_n
)
;
pullup
(
slave
.
rst_n
)
;
pullup
(
slave
.
irq_n
[
0
])
;
pullup
(
slave
.
irq_n
[
1
])
;
pullup
(
slave
.
irq_n
[
2
])
;
pullup
(
slave
.
irq_n
[
3
])
;
pullup
(
slave
.
irq_n
[
4
])
;
pullup
(
slave
.
irq_n
[
5
])
;
pullup
(
slave
.
irq_n
[
6
])
;
pullup
(
slave
.
iack_n
)
;
pullup
(
slave
.
dtack_n
)
;
pullup
(
slave
.
retry_n
)
;
pullup
(
slave
.
ds_n
[
1
])
;
pullup
(
slave
.
ds_n
[
0
])
;
pullup
(
slave
.
lword_n
)
;
pullup
(
slave
.
berr_n
)
;
pullup
(
slave
.
write_n
)
;
pulldown
(
slave
.
bbsy_n
)
;
pullup
(
slave
.
iackin_n
)
;
assign
VME_RST_n_o
=
slave
.
rst_n
;
assign
VME_AS_n_o
=
slave
.
as_n
;
assign
VME_GA_o
=
slave
.
ga
;
assign
VME_WRITE_n_o
=
slave
.
write_n
;
assign
VME_AM_o
=
slave
.
am
;
assign
VME_DS_n_o
=
slave
.
ds_n
;
assign
VME_BBSY_n_o
=
slave
.
bbsy_n
;
assign
VME_IACKIN_n_o
=
slave
.
iackin_n
;
assign
VME_IACK_n_o
=
slave
.
iack_n
;
bidir_buf
#(
1
)
b0
(
slave
.
lword_n
,
VME_LWORD_n_b
,
VME_ADDR_DIR_i
,
VME_ADDR_OE_N_i
)
;
bidir_buf
#(
31
)
b1
(
slave
.
addr
,
VME_ADDR_b
,
VME_ADDR_DIR_i
,
VME_ADDR_OE_N_i
)
;
bidir_buf
#(
33
)
b2
(
slave
.
data
,
VME_DATA_b
,
VME_DATA_DIR_i
,
VME_DATA_OE_N_i
)
;
pulldown
(
VME_BERR_i
)
;
pulldown
(
VME_ADDR_DIR_i
)
;
pulldown
(
VME_ADDR_OE_N_i
)
;
pulldown
(
VME_DATA_DIR_i
)
;
pulldown
(
VME_DATA_OE_N_i
)
;
assign
slave
.
dtack_n
=
VME_DTACK_n_i
;
assign
slave
.
berr_n
=
~
VME_BERR_i
;
assign
slave
.
retry_n
=
VME_RETRY_n_i
;
endmodule
`define
DECLARE_VME_BUFFERS
(
iface
)
\
wire VME_AS_n
;
\
wire VME_RST_n
;
\
wire VME_WRITE_n
;
\
wire
[
5
:
0
]
VME_AM
;
\
wire
[
1
:
0
]
VME_DS_n
;
\
wire VME_BERR
;
\
wire VME_DTACK_n
;
\
wire VME_RETRY_n
;
\
wire VME_RETRY_OE
;
\
wire VME_LWORD_n
;
\
wire
[
31
:
1
]
VME_ADDR
;
\
wire
[
31
:
0
]
VME_DATA
;
\
wire VME_BBSY_n
;
\
wire
[
6
:
0
]
VME_IRQ_n
;
\
wire VME_IACKIN_n
,
VME_IACK_n
;
\
wire VME_IACKOUT_n
;
\
wire VME_DTACK_OE
;
\
wire VME_DATA_DIR
;
\
wire VME_DATA_OE_N
;
\
wire VME_ADDR_DIR
;
\
wire VME_ADDR_OE_N
;
\
svec_vme_buffers U_VME_Bufs
(
\
.
VME_AS_n_o
(
VME_AS_n
),
\
.
VME_RST_n_o
(
VME_RST_n
),
\
.
VME_WRITE_n_o
(
VME_WRITE_n
),
\
.
VME_AM_o
(
VME_AM
),
\
.
VME_DS_n_o
(
VME_DS_n
),
\
.
VME_BERR_i
(
VME_BERR
),
\
.
VME_DTACK_n_i
(
VME_DTACK_n
),
\
.
VME_RETRY_n_i
(
VME_RETRY_n
),
\
.
VME_RETRY_OE_i
(
VME_RETRY_OE
),
\
.
VME_LWORD_n_b
(
VME_LWORD_n
),
\
.
VME_ADDR_b
(
VME_ADDR
),
\
.
VME_DATA_b
(
VME_DATA
),
\
.
VME_BBSY_n_o
(
VME_BBSY_n
),
\
.
VME_IRQ_n_i
(
VME_IRQ_n
),
\
.
VME_IACK_n_o
(
VME_IACK_n
),
\
.
VME_IACKIN_n_o
(
VME_IACKIN_n
),
\
.
VME_IACKOUT_n_i
(
VME_IACKOUT_n
),
\
.
VME_DTACK_OE_i
(
VME_DTACK_OE
),
\
.
VME_DATA_DIR_i
(
VME_DATA_DIR
),
\
.
VME_DATA_OE_N_i
(
VME_DATA_OE_N
),
\
.
VME_ADDR_DIR_i
(
VME_ADDR_DIR
),
\
.
VME_ADDR_OE_N_i
(
VME_ADDR_OE_N
),
\
.
slave
(
iface
)
\
)
;
function
automatic
bit
[
5
:
0
]
_
gen_ga
(
int
slot
)
;
bit
[
4
:
0
]
slot_id
=
slot
;
return
{^
slot_id
,
~
slot_id
};
endfunction
// _gen_ga
`define
WIRE_VME_PINS
(
slot_id
)
\
.
VME_AS_n_i
(
VME_AS_n
),
\
.
VME_RST_n_i
(
VME_RST_n
),
\
.
VME_WRITE_n_i
(
VME_WRITE_n
),
\
.
VME_AM_i
(
VME_AM
),
\
.
VME_DS_n_i
(
VME_DS_n
),
\
.
VME_GA_i
(
_gen_ga
(
slot_id
)),
\
.
VME_BERR_o
(
VME_BERR
),
\
.
VME_DTACK_n_o
(
VME_DTACK_n
),
\
.
VME_RETRY_n_o
(
VME_RETRY_n
),
\
.
VME_RETRY_OE_o
(
VME_RETRY_OE
),
\
.
VME_LWORD_n_b
(
VME_LWORD_n
),
\
.
VME_ADDR_b
(
VME_ADDR
),
\
.
VME_DATA_b
(
VME_DATA
),
\
.
VME_BBSY_n_i
(
VME_BBSY_n
),
\
.
VME_IRQ_n_o
(
VME_IRQ_n
),
\
.
VME_IACK_n_i
(
VME_IACK_n
),
\
.
VME_IACKIN_n_i
(
VME_IACKIN_n
),
\
.
VME_IACKOUT_n_o
(
VME_IACKOUT_n
),
\
.
VME_DTACK_OE_o
(
VME_DTACK_OE
),
\
.
VME_DATA_DIR_o
(
VME_DATA_DIR
),
\
.
VME_DATA_OE_N_o
(
VME_DATA_OE_N
),
\
.
VME_ADDR_DIR_o
(
VME_ADDR_DIR
),
\
.
VME_ADDR_OE_N_o
(
VME_ADDR_OE_N
)
\ No newline at end of file
hdl/include/vme64x_bfm/vme64x_bfm.svh
0 → 100644
View file @
e4ad4327
`ifndef
__
VME64X_BFM_SVH
`define
__VME64X_BFM_SVH 1
`timescale
1
ns
/
1
ps
`include
"simdrv_defs.svh"
`define
assert_wait
(
name
,
condition
,
timeout
)
\
begin\
time t
=
$
time
;
\
while
(!(
condition
))
begin\
#
1ns
;
\
if
($
time
-
t
>
timeout
)
begin\
$
display
("
Wait timeout
:
",
`"
name
`")
;
\
//
$
stop
;
\
break
;
\
end\
end\
end
interface
IVME64X
(
input
sys_rst_n_i
)
;
wire
as_n
;
wire
rst_n
;
wire
write_n
;
wire
[
5
:
0
]
am
;
wire
[
1
:
0
]
ds_n
;
wire
[
5
:
0
]
ga
;
wire
berr_n
,
dtack_n
;
wire
retry_n
;
wire
lword_n
;
wire
[
31
:
1
]
addr
;
wire
[
31
:
0
]
data
;
wire
bbsy_n
;
wire
[
6
:
0
]
irq_n
;
wire
iackin_n
,
iackout_n
,
iack_n
;
logic
q_as_n
=
1'bz
;
logic
q_rst_n
=
1'bz
;
logic
q_write_n
=
1'bz
;
logic
[
5
:
0
]
q_am
=
6'bz
;
logic
[
1
:
0
]
q_ds_n
=
2'bz
;
logic
[
5
:
0
]
q_ga
=
6'bz
;
logic
q_berr_n
=
1'bz
,
q_dtack_n
=
1'bz
;
logic
q_retry_n
=
1'bz
;
logic
q_lword_n
=
1'bz
;
logic
[
31
:
1
]
q_addr
=
31'bz
;
logic
[
31
:
0
]
q_data
=
32'bz
;
logic
q_bbsy_n
=
1'bz
;
logic
[
6
:
0
]
q_irq_n
=
7'bz
;
logic
q_iackin_n
=
1'bz
,
q_iackout_n
=
1'bz
,
q_iack_n
=
1'bz
;
/* SystemVerilog does not allow pullups inside interfaces or on logic type */
assign
as_n
=
q_as_n
;
assign
rst_n
=
q_rst_n
;
assign
write_n
=
q_write_n
;
assign
am
=
q_am
;
assign
ds_n
=
q_ds_n
;
assign
ga
=
q_ga
;
assign
berr_n
=
q_berr_n
;
assign
dtack_n
=
q_dtack_n
;
assign
retry_n
=
q_retry_n
;
assign
lword_n
=
q_lword_n
;
assign
addr
=
q_addr
;
assign
data
=
q_data
;
assign
bbsy_n
=
q_bbsy_n
;
assign
irq_n
=
q_irq_n
;
assign
iackin_n
=
q_iackin_n
;
assign
iackout_n
=
q_iackout_n
;
assign
iack_n
=
q_iack_n
;
// VME Master
modport
tb
(
output
as_n
,
output
rst_n
,
output
write_n
,
output
am
,
output
ds_n
,
output
ga
,
output
bbsy_n
,
output
iackin_n
,
output
iack_n
,
input
berr_n
,
input
irq_n
,
input
iackout_n
,
inout
addr
,
inout
data
,
inout
lword_n
,
inout
retry_n
,
inout
dtack_n
,
input
q_as_n
,
input
q_rst_n
,
input
q_write_n
,
input
q_am
,
input
q_ds_n
,
input
q_ga
,
input
q_bbsy_n
,
input
q_iackin_n
,
input
q_iack_n
,
input
q_berr_n
,
input
q_irq_n
,
input
q_iackout_n
,
input
q_addr
,
input
q_data
,
input
q_lword_n
,
input
q_retry_n
,
input
q_dtack_n
)
;
modport
master
(
output
as_n
,
output
rst_n
,
output
write_n
,
output
am
,
output
ds_n
,
output
ga
,
output
bbsy_n
,
output
iackin_n
,
output
iack_n
,
input
berr_n
,
input
irq_n
,
input
iackout_n
,
inout
addr
,
inout
data
,
inout
lword_n
,
inout
retry_n
,
inout
dtack_n
)
;
// VME Slave
modport
slave
(
input
as_n
,
input
rst_n
,
input
write_n
,
input
am
,
input
ds_n
,
input
ga
,
input
bbsy_n
,
input
iackin_n
,
input
iack_n
,
output
berr_n
,
output
irq_n
,
output
iackout_n
,
inout
addr
,
inout
data
,
inout
lword_n
,
inout
retry_n
,
inout
dtack_n
)
;
initial
forever
begin
@
(
posedge
sys_rst_n_i
)
;
#
100
ns
;
q_rst_n
=
0
;
#
100
ns
;
q_rst_n
=
1
;
end
endinterface
// IVME64x
const
uint64_t
CSR_BAR
=
'h7FFFF
;
const
uint64_t
CSR_BIT_SET_REG
=
'h7FFFB
;
const
uint64_t
CSR_BIT_CLR_REG
=
'h7FFF7
;
const
uint64_t
CSR_CRAM_OWNER
=
'h7FFF3
;
const
uint64_t
CSR_USR_BIT_SET_REG
=
'h7FFEF
;
const
uint64_t
CSR_USR_BIT_CLR_REG
=
'h7FFEB
;
typedef
enum
{
DONT_CARE
=
'h100
,
A16
=
'h200
,
A24
=
'h300
,
A32
=
'h400
,
A64
=
'h500
}
vme_addr_size_t
;
typedef
enum
{
SINGLE
=
'h10
,
CR_CSR
=
'h20
,
MBLT
=
'h30
,
BLT
=
'h40
,
LCK
=
'h50
,
TwoeVME
=
'h60
,
TwoeSST
=
'h70
}
vme_xfer_type_t
;
typedef
enum
{
D08Byte0
=
'h1
,
D08Byte1
=
'h2
,
D08Byte2
=
'h3
,
D08Byte3
=
'h4
,
D16Byte01
=
'h5
,
D16Byte23
=
'h6
,
D32
=
'h7
}
vme_data_type_t
;
class
CBusAccessor_VME64x
extends
CBusAccessor
;
const
bit
[
3
:
0
]
dt_map
[
vme_data_type_t
]
=
'
{
D08Byte0
:
4'b0101
,
D08Byte1
:
4'b1001
,
D08Byte2
:
4'b0111
,
D08Byte3
:
4'b1011
,
D16Byte01
:
4'b0001
,
D16Byte23
:
4'b0011
,
D32
:
4'b0000
};
protected
bit
[
7
:
0
]
m_ba
;
protected
bit
[
4
:
0
]
m_ga
;
virtual
IVME64X
.
tb
vme
;
function
new
(
virtual
IVME64X
.
tb
_
vme
)
;
vme
=
_
vme
;
m_ga
=
6'b010111
;
vme
.
q_ga
=
m_ga
;
m_ba
=
8'b10000000
;
endfunction
// new
protected
task
set_address
(
uint64_t
addr_in
,
vme_addr_size_t
asize
,
vme_xfer_type_t
xtype
)
;
bit
[
63
:
0
]
a
=
addr_in
;
bit
[
31
:
0
]
a_out
;
const
bit
[
5
:
0
]
am_map
[
int
]
=
'
{
A32
|
CR_CSR
:
6'b101111
,
A24
|
CR_CSR
:
6'b101111
,
A16
|
SINGLE
:
6'b101001
,
A16
|
LCK
:
6'b101100
,
A24
|
SINGLE
:
6'b111001
,
A24
|
BLT
:
6'b111011
,
A24
|
MBLT
:
6'b111000
,
A24
|
LCK
:
6'b110010
,
A32
|
SINGLE
:
6'b001001
,
A32
|
BLT
:
6'b001011
,
A32
|
MBLT
:
6'b001000
,
A32
|
LCK
:
6'b000101
,
A64
|
SINGLE
:
6'b000001
,
A64
|
BLT
:
6'b000011
,
A64
|
MBLT
:
6'b000000
,
A64
|
LCK
:
6'b001000
,
A32
|
TwoeVME
:
6'b100000
,
A64
|
TwoeVME
:
6'b100000
,
A32
|
TwoeSST
:
6'b100000
,
A64
|
TwoeSST
:
6'b100000
};
vme
.
q_am
=
am_map
[
asize
|
xtype
]
;
if
(
xtype
==
CR_CSR
)
a_out
=
{
8'h0
,
~
m_ga
[
4
:
0
]
,
a
[
18
:
0
]
};
else
case
(
asize
)
A16:
a_out
=
{
16'h0
,
m_ba
[
7
:
3
]
,
a
[
10
:
2
]
,
2'b00
};
A24:
a_out
=
{
8'h0
,
m_ba
[
7
:
3
]
,
a
[
18
:
2
]
,
2'b00
};
A32:
a_out
=
{
m_ba
[
7
:
3
]
,
a
[
26
:
2
]
,
2'b00
};
endcase
// case (xtype)
vme
.
q_addr
[
31
:
2
]
=
a_out
[
31
:
2
]
;
endtask
// set_address
protected
task
release_bus
()
;
vme
.
q_as_n
=
1'bz
;
vme
.
q_write_n
=
1'bz
;
vme
.
q_ds_n
=
2'bzz
;
vme
.
q_lword_n
=
1'bz
;
vme
.
q_addr
=
0
;
vme
.
q_data
=
32'bz
;
endtask
// release_bus
/* Simple generic VME read/write: single, BLT and CSR xfers */
protected
task
rw_generic
(
bit
write
,
uint64_t
_
addr
,
ref
uint64_t
_
data
[]
,
input
vme_addr_size_t
asize
,
input
vme_xfer_type_t
xtype
,
vme_data_type_t
dtype
)
;
bit
[
3
:
0
]
dt
;
int
i
;
`assert_wait
(
tmo_rws_bus_free
,
vme
.
dtack_n
&&
vme
.
berr_n
,
10u
s
)
release_bus
()
;
#
40
ns
;
set_address
(
_
addr
,
asize
,
xtype
)
;
dt
=
dt_map
[
dtype
]
;
vme
.
q_lword_n
=
dt
[
0
]
;
vme
.
q_addr
[
1
]
=
dt
[
1
]
;
vme
.
q_write_n
=
!
write
;
#
100
ns
;
vme
.
q_as_n
=
0
;
#
40
ns
;
// $display("RWG %x\n", _data.size());
for
(
i
=
0
;
i
<
_
data
.
size
()
;
i
++
)
begin
if
(
write
)
vme
.
q_data
=
(
dtype
==
D08Byte0
||
dtype
==
D08Byte2
)
?
(
_
data
[
i
]
<<
8
)
:
(
_
data
[
i
])
;
#
100
ns
;
vme
.
q_ds_n
=
dt
[
3
:
2
]
;
`assert_wait
(
tmo_rws_bus_idle
,
!
vme
.
dtack_n
||
!
vme
.
berr_n
,
4u
s
)
if
(
!
vme
.
berr_n
)
$
error
(
"[rw_simple_generic]: VME bus error."
)
;
if
(
!
write
)
_
data
[
i
]
=
(
dtype
==
D08Byte0
||
dtype
==
D08Byte2
)
?
(
vme
.
data
>>
8
)
:
(
vme
.
data
)
;
#
40
ns
;
end
// for (i=0;i<_data.size();i++)
release_bus
()
;
endtask
// rw_generic
protected
task
extract_xtype
(
int
s
,
ref
vme_xfer_type_t
xtype
,
vme_addr_size_t
asize
,
vme_data_type_t
dtype
)
;
xtype
=
vme_xfer_type_t
'
(
s
&
'h0f0
)
;
asize
=
vme_addr_size_t
'
(
s
&
'hf00
)
;
dtype
=
vme_data_type_t
'
(
s
&
'h00f
)
;
endtask
// extract_xtype
protected
int
m_default_modifiers
=
A32
|
SINGLE
|
D32
;
task
set_default_modifiers
(
int
mods
)
;
m_default_modifiers
=
mods
;
endtask
// set_default_modifiers
task
writem
(
uint64_t
addr
[]
,
uint64_t
data
[]
,
input
int
size
=
m_default_modifiers
,
ref
int
result
)
;
int
i
;
vme_addr_size_t
asize
;
vme_data_type_t
dtype
;
vme_xfer_type_t
xtype
;
extract_xtype
(
size
,
xtype
,
asize
,
dtype
)
;
if
(
xtype
==
SINGLE
||
xtype
==
CR_CSR
)
for
(
i
=
0
;
i
<
addr
.
size
()
;
i
++
)
begin
uint64_t
tmp
[]
;
tmp
=
new
[
1
]
;
tmp
[
0
]
=
data
[
i
]
;
rw_generic
(
1
,
addr
[
i
]
,
tmp
,
asize
,
xtype
,
dtype
)
;
end
else
if
(
xtype
==
BLT
)
rw_generic
(
1
,
addr
[
0
]
,
data
,
asize
,
xtype
,
dtype
)
;
endtask
// writem
task
readm
(
uint64_t
addr
[]
,
ref
uint64_t
data
[]
,
input
int
size
=
m_default_modifiers
,
ref
int
result
)
;
int
i
;
vme_addr_size_t
asize
;
vme_data_type_t
dtype
;
vme_xfer_type_t
xtype
;
extract_xtype
(
size
,
xtype
,
asize
,
dtype
)
;
if
(
xtype
==
SINGLE
||
xtype
==
CR_CSR
)
for
(
i
=
0
;
i
<
addr
.
size
()
;
i
++
)
begin
uint64_t
tmp
[]
;
tmp
=
new
[
1
]
;
rw_generic
(
0
,
addr
[
i
]
,
tmp
,
asize
,
xtype
,
dtype
)
;
data
[
i
]
=
tmp
[
0
]
;
end
endtask
// readm
task
read
(
uint64_t
addr
,
ref
uint64_t
data
,
input
int
size
=
m_default_modifiers
,
ref
int
result
=
_
null
)
;
int
res
;
uint64_t
aa
[
1
]
,
da
[]
;
//$display("AM=%x", size);
da
=
new
[
1
]
;
aa
[
0
]
=
addr
;
readm
(
aa
,
da
,
size
,
res
)
;
data
=
da
[
0
]
;
endtask
task
write
(
uint64_t
addr
,
uint64_t
data
,
input
int
size
=
m_default_modifiers
,
ref
int
result
=
_
null
)
;
uint64_t
aa
[]
,
da
[]
;
aa
=
new
[
1
]
;
da
=
new
[
1
]
;
// $display("VMEWrite s %x", size);
aa
[
0
]
=
addr
;
da
[
0
]
=
data
;
writem
(
aa
,
da
,
size
,
result
)
;
endtask
endclass
// CBusAccessor_VME64x
`endif
// `ifndef __VME64X_BFM_SVH
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