Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tapasco
tapasco
Commits
da0b7e83
Commit
da0b7e83
authored
Oct 30, 2018
by
Jaco Hofmann
Browse files
Adds x16 support for PCIe
parent
3d3b0409
Pipeline
#668
passed with stage
in 8 minutes and 17 seconds
Changes
21
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
common/common_ip.tcl
View file @
da0b7e83
# create a dictionary of compatible VLNVs
dict set stdcomps axi_ic vlnv
"xilinx.com:ip:axi_interconnect:2.1"
dict set stdcomps axi_sc vlnv
"xilinx.com:ip:smartconnect:1.0"
dict set stdcomps ps vlnv
"xilinx.com:ip:processing_system7:5.5"
dict set stdcomps ps_bfm vlnv
"xilinx.com:ip:processing_system7_bfm:2.0"
dict set stdcomps axi_irqc vlnv
"xilinx.com:ip:axi_intc:4.1"
dict set stdcomps axi_cache vlnv
"xilinx.com:ip:system_cache:3.0"
dict set stdcomps xlconcat vlnv
"xilinx.com:ip:xlconcat:2.1"
dict set stdcomps xlslice vlnv
"xilinx.com:ip:xlslice:1.0"
dict set stdcomps xlconst vlnv
"xilinx.com:ip:xlconstant:1.1"
dict set stdcomps rst_gen vlnv
"xilinx.com:ip:proc_sys_reset:5.0"
dict set stdcomps proto_conv vlnv
"xilinx.com:ip:axi_protocol_converter:2.1"
dict set stdcomps bincnt vlnv
"xilinx.com:ip:c_counter_binary:12.0"
dict set stdcomps bluedma vlnv
"esa.informatik.tu-darmstadt.de:user:BlueDMA:1.0"
dict set stdcomps msixusptrans vlnv
"esa.informatik.tu-darmstadt.de:user:MSIxUSPTranslator:1.0"
dict set stdcomps oled_ctrl vlnv
"esa.cs.tu-darmstadt.de:user:oled_pc:1.0"
dict set stdcomps mm_to_lite vlnv
"esa.cs.tu-darmstadt.de:user:mm_to_lite:1.0"
dict set stdcomps system_cache vlnv
"xilinx.com:ip:system_cache:3.1"
dict set stdcomps mig_core vlnv
"xilinx.com:ip:mig_7series:4.0"
dict set stdcomps axi_pcie3_0 vlnv
"xilinx.com:ip:axi_pcie3:3.0"
dict set stdcomps tapasco_status vlnv
"esa.cs.tu-darmstadt.de:tapasco:tapasco_status:1.4"
dict set stdcomps axi_pcie3_0_usp vlnv
"xilinx.com:ip:xdma:3.1"
dict set stdcomps clk_wiz vlnv
"xilinx.com:ip:clk_wiz:5.4"
dict set stdcomps msix_intr_ctrl vlnv
"esa.informatik.tu-darmstadt.de:user:MSIXIntrCtrl:1.0"
dict set stdcomps axioffset vlnv
"esa.informatik.tu-darmstadt.de:user:AXIOffset:1.0"
dict set stdcomps axi_reg_slice vlnv
"xilinx.com:ip:axi_register_slice:2.1"
dict set stdcomps dwidth_conv vlnv
"xilinx.com:ip:axi_dwidth_converter:2.1"
dict set stdcomps system_ila vlnv
"xilinx.com:ip:system_ila:1.0"
dict set stdcomps aximm_intf vlnv
"xilinx.com:interface:aximm_rtl:1.0"
dict set stdcomps us_ddr vlnv
"xilinx.com:ip:ddr4:2.2"
dict set stdcomps logic_vector vlnv
"xilinx.com:ip:util_vector_logic:2.0"
dict set stdcomps ultra_ps vlnv
"xilinx.com:ip:zynq_ultra_ps_e:3.1"
dict set stdcomps 10g_mac vlnv
"xilinx.com:ip:axi_10g_ethernet:3.1"
dict set stdcomps axi_iic vlnv
"xilinx.com:ip:axi_iic:2.0"
dict set stdcomps util_buf vlnv
"xilinx.com:ip:util_ds_buf:2.1"
dict set stdcomps axi_ic vlnv
"xilinx.com:ip:axi_interconnect:2.1"
dict set stdcomps axi_sc vlnv
"xilinx.com:ip:smartconnect:1.0"
dict set stdcomps ps vlnv
"xilinx.com:ip:processing_system7:5.5"
dict set stdcomps ps_bfm vlnv
"xilinx.com:ip:processing_system7_bfm:2.0"
dict set stdcomps axi_irqc vlnv
"xilinx.com:ip:axi_intc:4.1"
dict set stdcomps axi_cache vlnv
"xilinx.com:ip:system_cache:3.0"
dict set stdcomps xlconcat vlnv
"xilinx.com:ip:xlconcat:2.1"
dict set stdcomps xlslice vlnv
"xilinx.com:ip:xlslice:1.0"
dict set stdcomps xlconst vlnv
"xilinx.com:ip:xlconstant:1.1"
dict set stdcomps rst_gen vlnv
"xilinx.com:ip:proc_sys_reset:5.0"
dict set stdcomps proto_conv vlnv
"xilinx.com:ip:axi_protocol_converter:2.1"
dict set stdcomps bincnt vlnv
"xilinx.com:ip:c_counter_binary:12.0"
dict set stdcomps bluedma vlnv
"esa.informatik.tu-darmstadt.de:user:BlueDMA:1.0"
dict set stdcomps bluedma_x16 vlnv
"esa.informatik.tu-darmstadt.de:user:BlueDMA_x16:1.0"
dict set stdcomps msixusptrans vlnv
"esa.informatik.tu-darmstadt.de:user:MSIxUSPTranslator:1.0"
dict set stdcomps oled_ctrl vlnv
"esa.cs.tu-darmstadt.de:user:oled_pc:1.0"
dict set stdcomps mm_to_lite vlnv
"esa.cs.tu-darmstadt.de:user:mm_to_lite:1.0"
dict set stdcomps system_cache vlnv
"xilinx.com:ip:system_cache:3.1"
dict set stdcomps mig_core vlnv
"xilinx.com:ip:mig_7series:4.0"
dict set stdcomps axi_pcie3_0 vlnv
"xilinx.com:ip:axi_pcie3:3.0"
dict set stdcomps tapasco_status vlnv
"esa.cs.tu-darmstadt.de:tapasco:tapasco_status:1.4"
dict set stdcomps axi_pcie3_0_usp vlnv
"xilinx.com:ip:xdma:3.1"
dict set stdcomps clk_wiz vlnv
"xilinx.com:ip:clk_wiz:5.4"
dict set stdcomps msix_intr_ctrl vlnv
"esa.informatik.tu-darmstadt.de:user:MSIXIntrCtrl:1.0"
dict set stdcomps axioffset vlnv
"esa.informatik.tu-darmstadt.de:user:AXIOffset:1.0"
dict set stdcomps axi_reg_slice vlnv
"xilinx.com:ip:axi_register_slice:2.1"
dict set stdcomps dwidth_conv vlnv
"xilinx.com:ip:axi_dwidth_converter:2.1"
dict set stdcomps system_ila vlnv
"xilinx.com:ip:system_ila:1.0"
dict set stdcomps aximm_intf vlnv
"xilinx.com:interface:aximm_rtl:1.0"
dict set stdcomps us_ddr vlnv
"xilinx.com:ip:ddr4:2.2"
dict set stdcomps logic_vector vlnv
"xilinx.com:ip:util_vector_logic:2.0"
dict set stdcomps ultra_ps vlnv
"xilinx.com:ip:zynq_ultra_ps_e:3.1"
dict set stdcomps 10g_mac vlnv
"xilinx.com:ip:axi_10g_ethernet:3.1"
dict set stdcomps axi_iic vlnv
"xilinx.com:ip:axi_iic:2.0"
dict set stdcomps util_buf vlnv
"xilinx.com:ip:util_ds_buf:2.1"
dict set stdcomps pciebridgetolite vlnv
"esa.informatik.tu-darmstadt.de:user:PCIeBridgeToLite:1.0"
dict set stdcomps pciebridgetolite_x16 vlnv
"esa.informatik.tu-darmstadt.de:user:PCIeBridgeToLite_x16:1.0"
\ No newline at end of file
common/ip/BlueDMA_x16/component.xml
0 → 100644
View file @
da0b7e83
This diff is collapsed.
Click to expand it.
common/ip/BlueDMA_x16/constraints/bluedma.tcl
0 → 100644
View file @
da0b7e83
##
## set properties to help out clock domain crossing analysis
##
foreach pat
{
"reset_hold_reg
[
*
]
"
"sGEnqPtr*_reg
[
*
]
"
"dGDeqPtr*_reg
[
*
]
"
"sSyncReg*_reg
[
*
]
"
"dSyncReg*_reg
[
*
]
"
"dEnqPtr*_reg
[
*
]
"
}
{
set cells
[
get_cells -hier $pat
]
if
{[
llength $cells
]
> 0
}
{
puts
"ASYNC_REG
$cells
"
set_property ASYNC_REG 1 $cells
}
}
common/ip/BlueDMA_x16/constraints/bluedma.xdc
0 → 100644
View file @
da0b7e83
##
## set properties to help out clock domain crossing analysis
##
set s_clk [get_clocks -of_objects [get_ports -scoped_to_current_instance m32_axi_aclk]]
set m_clk [get_clocks -of_object [get_ports -scoped_to_current_instance m64_axi_aclk]]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance m32_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance m64_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $s_clk]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance m64_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance m32_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $m_clk]
set g_clk [get_clocks -of_objects [get_ports -scoped_to_current_instance s_axi_aclk]]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance m32_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance s_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $s_clk]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance s_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance m32_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $g_clk]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance m64_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance s_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $m_clk]
set_max_delay -from [filter [all_fanout -from [get_ports -scoped_to_current_instance s_axi_aclk] -flat -endpoints_only] {IS_LEAF}] -to [filter [all_fanout -from [get_ports -scoped_to_current_instance m64_axi_aclk] -flat -only_cells] {IS_SEQUENTIAL && (NAME !~ *dout_i_reg[*])}] -datapath_only [get_property -min PERIOD $g_clk]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *reset_hold_reg*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *sGEnqPtr*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dGDeqPtr*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *sSyncReg*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dSyncReg*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dEnqPtr*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dEnqToggle*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dDeqToggle*}] {IS_SEQUENTIAL}]
set_false_path -through [get_ports -scoped_to_current_instance -filter {NAME =~ *_axi_aresetn}] -to [filter [get_cells -hier -filter {NAME =~ *dNotEmpty*}] {IS_SEQUENTIAL}]
\ No newline at end of file
common/ip/BlueDMA_x16/src/FIFO1.v
0 → 100644
View file @
da0b7e83
// Copyright (c) 2000-2012 Bluespec, Inc.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// $Revision$
// $Date$
`ifdef
BSV_ASSIGNMENT_DELAY
`else
`define
BSV_ASSIGNMENT_DELAY
`endif
`ifdef
BSV_POSITIVE_RESET
`define
BSV_RESET_VALUE 1
'
b1
`define
BSV_RESET_EDGE posedge
`else
`define
BSV_RESET_VALUE 1
'
b0
`define
BSV_RESET_EDGE negedge
`endif
`ifdef
BSV_ASYNC_RESET
`define
BSV_ARESET_EDGE_META or
`
BSV_RESET_EDGE RST
`else
`define
BSV_ARESET_EDGE_META
`endif
`ifdef
BSV_RESET_FIFO_HEAD
`define
BSV_ARESET_EDGE_HEAD
`
BSV_ARESET_EDGE_META
`else
`define
BSV_ARESET_EDGE_HEAD
`endif
// Depth 1 FIFO
module
FIFO1
(
CLK
,
RST
,
D_IN
,
ENQ
,
FULL_N
,
D_OUT
,
DEQ
,
EMPTY_N
,
CLR
);
parameter
width
=
1
;
parameter
guarded
=
1
;
input
CLK
;
input
RST
;
input
[
width
-
1
:
0
]
D_IN
;
input
ENQ
;
input
DEQ
;
input
CLR
;
output
FULL_N
;
output
[
width
-
1
:
0
]
D_OUT
;
output
EMPTY_N
;
reg
[
width
-
1
:
0
]
D_OUT
;
reg
empty_reg
;
assign
EMPTY_N
=
empty_reg
;
`ifdef
BSV_NO_INITIAL_BLOCKS
`else
// not BSV_NO_INITIAL_BLOCKS
// synopsys translate_off
initial
begin
D_OUT
=
{
((
width
+
1
)
/
2
)
{
2'b10
}}
;
empty_reg
=
1'b0
;
end
// initial begin
// synopsys translate_on
`endif
// BSV_NO_INITIAL_BLOCKS
assign
FULL_N
=
!
empty_reg
;
always
@
(
posedge
CLK
`BSV_ARESET_EDGE_META
)
begin
if
(
RST
==
`BSV_RESET_VALUE
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
end
// if (RST == `BSV_RESET_VALUE)
else
begin
if
(
CLR
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
end
// if (CLR)
else
if
(
ENQ
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
end
// if (ENQ)
else
if
(
DEQ
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
end
// if (DEQ)
end
// else: !if(RST == `BSV_RESET_VALUE)
end
// always@ (posedge CLK or `BSV_RESET_EDGE RST)
always
@
(
posedge
CLK
`BSV_ARESET_EDGE_HEAD
)
begin
`ifdef
BSV_RESET_FIFO_HEAD
if
(
RST
==
`BSV_RESET_VALUE
)
begin
D_OUT
<=
`BSV_ASSIGNMENT_DELAY
{
width
{
1'b0
}}
;
end
else
`endif
begin
if
(
ENQ
)
D_OUT
<=
`BSV_ASSIGNMENT_DELAY
D_IN
;
end
// else: !if(RST == `BSV_RESET_VALUE)
end
// always@ (posedge CLK or `BSV_RESET_EDGE RST)
// synopsys translate_off
always
@
(
posedge
CLK
)
begin:
error_checks
reg
deqerror
,
enqerror
;
deqerror
=
0
;
enqerror
=
0
;
if
(
RST
==
!
`BSV_RESET_VALUE
)
begin
if
(
!
empty_reg
&&
DEQ
)
begin
deqerror
=
1
;
$
display
(
"Warning: FIFO1: %m -- Dequeuing from empty fifo"
)
;
end
if
(
!
FULL_N
&&
ENQ
&&
(
!
DEQ
||
guarded
)
)
begin
enqerror
=
1
;
$
display
(
"Warning: FIFO1: %m -- Enqueuing to a full fifo"
)
;
end
end
// if (RST == ! `BSV_RESET_VALUE)
end
// synopsys translate_on
endmodule
common/ip/BlueDMA_x16/src/FIFO2.v
0 → 100644
View file @
da0b7e83
// Copyright (c) 2000-2012 Bluespec, Inc.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// $Revision$
// $Date$
`ifdef
BSV_ASSIGNMENT_DELAY
`else
`define
BSV_ASSIGNMENT_DELAY
`endif
`ifdef
BSV_POSITIVE_RESET
`define
BSV_RESET_VALUE 1
'
b1
`define
BSV_RESET_EDGE posedge
`else
`define
BSV_RESET_VALUE 1
'
b0
`define
BSV_RESET_EDGE negedge
`endif
`ifdef
BSV_ASYNC_RESET
`define
BSV_ARESET_EDGE_META or
`
BSV_RESET_EDGE RST
`else
`define
BSV_ARESET_EDGE_META
`endif
`ifdef
BSV_RESET_FIFO_HEAD
`define
BSV_ARESET_EDGE_HEAD
`
BSV_ARESET_EDGE_META
`else
`define
BSV_ARESET_EDGE_HEAD
`endif
// Depth 2 FIFO
module
FIFO2
(
CLK
,
RST
,
D_IN
,
ENQ
,
FULL_N
,
D_OUT
,
DEQ
,
EMPTY_N
,
CLR
);
parameter
width
=
1
;
parameter
guarded
=
1
;
input
CLK
;
input
RST
;
input
[
width
-
1
:
0
]
D_IN
;
input
ENQ
;
input
DEQ
;
input
CLR
;
output
FULL_N
;
output
EMPTY_N
;
output
[
width
-
1
:
0
]
D_OUT
;
reg
full_reg
;
reg
empty_reg
;
reg
[
width
-
1
:
0
]
data0_reg
;
reg
[
width
-
1
:
0
]
data1_reg
;
assign
FULL_N
=
full_reg
;
assign
EMPTY_N
=
empty_reg
;
assign
D_OUT
=
data0_reg
;
// Optimize the loading logic since state encoding is not power of 2!
wire
d0di
=
(
ENQ
&&
!
empty_reg
)
||
(
ENQ
&&
DEQ
&&
full_reg
)
;
wire
d0d1
=
DEQ
&&
!
full_reg
;
wire
d0h
=
((
!
DEQ
)
&&
(
!
ENQ
))
||
(
!
DEQ
&&
empty_reg
)
||
(
!
ENQ
&&
full_reg
)
;
wire
d1di
=
ENQ
&
empty_reg
;
`ifdef
BSV_NO_INITIAL_BLOCKS
`else
// not BSV_NO_INITIAL_BLOCKS
// synopsys translate_off
initial
begin
data0_reg
=
{
((
width
+
1
)
/
2
)
{
2'b10
}}
;
data1_reg
=
{
((
width
+
1
)
/
2
)
{
2'b10
}}
;
empty_reg
=
1'b0
;
full_reg
=
1'b1
;
end
// initial begin
// synopsys translate_on
`endif
// BSV_NO_INITIAL_BLOCKS
always
@
(
posedge
CLK
`BSV_ARESET_EDGE_META
)
begin
if
(
RST
==
`BSV_RESET_VALUE
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
full_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
end
// if (RST == `BSV_RESET_VALUE)
else
begin
if
(
CLR
)
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
full_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
end
// if (CLR)
else
if
(
ENQ
&&
!
DEQ
)
// just enq
begin
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
full_reg
<=
`BSV_ASSIGNMENT_DELAY
!
empty_reg
;
end
else
if
(
DEQ
&&
!
ENQ
)
begin
full_reg
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
empty_reg
<=
`BSV_ASSIGNMENT_DELAY
!
full_reg
;
end
// if ( DEQ && ! ENQ )
end
// else: !if(RST == `BSV_RESET_VALUE)
end
// always@ (posedge CLK or `BSV_RESET_EDGE RST)
always
@
(
posedge
CLK
`BSV_ARESET_EDGE_HEAD
)
begin
`ifdef
BSV_RESET_FIFO_HEAD
if
(
RST
==
`BSV_RESET_VALUE
)
begin
data0_reg
<=
`BSV_ASSIGNMENT_DELAY
{
width
{
1'b0
}}
;
data1_reg
<=
`BSV_ASSIGNMENT_DELAY
{
width
{
1'b0
}}
;
end
else
`endif
begin
data0_reg
<=
`BSV_ASSIGNMENT_DELAY
{
width
{
d0di
}}
&
D_IN
|
{
width
{
d0d1
}}
&
data1_reg
|
{
width
{
d0h
}}
&
data0_reg
;
data1_reg
<=
`BSV_ASSIGNMENT_DELAY
d1di
?
D_IN
:
data1_reg
;
end
// else: !if(RST == `BSV_RESET_VALUE)
end
// always@ (posedge CLK or `BSV_RESET_EDGE RST)
// synopsys translate_off
always
@
(
posedge
CLK
)
begin:
error_checks
reg
deqerror
,
enqerror
;
deqerror
=
0
;
enqerror
=
0
;
if
(
RST
==
!
`BSV_RESET_VALUE
)
begin
if
(
!
empty_reg
&&
DEQ
)
begin
deqerror
=
1
;
$
display
(
"Warning: FIFO2: %m -- Dequeuing from empty fifo"
)
;
end
if
(
!
full_reg
&&
ENQ
&&
(
!
DEQ
||
guarded
)
)
begin
enqerror
=
1
;
$
display
(
"Warning: FIFO2: %m -- Enqueuing to a full fifo"
)
;
end
end
end
// always@ (posedge CLK)
// synopsys translate_on
endmodule
common/ip/BlueDMA_x16/src/SizedFIFO.v
0 → 100644
View file @
da0b7e83
// Copyright (c) 2000-2012 Bluespec, Inc.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// $Revision$
// $Date$
`ifdef
BSV_ASSIGNMENT_DELAY
`else
`define
BSV_ASSIGNMENT_DELAY
`endif
`ifdef
BSV_POSITIVE_RESET
`define
BSV_RESET_VALUE 1
'
b1
`define
BSV_RESET_EDGE posedge
`else
`define
BSV_RESET_VALUE 1
'
b0
`define
BSV_RESET_EDGE negedge
`endif
`ifdef
BSV_ASYNC_RESET
`define
BSV_ARESET_EDGE_META or
`
BSV_RESET_EDGE RST
`else
`define
BSV_ARESET_EDGE_META
`endif
`ifdef
BSV_RESET_FIFO_HEAD
`define
BSV_ARESET_EDGE_HEAD
`
BSV_ARESET_EDGE_META
`else
`define
BSV_ARESET_EDGE_HEAD
`endif
`ifdef
BSV_RESET_FIFO_ARRAY
`define
BSV_ARESET_EDGE_ARRAY
`
BSV_ARESET_EDGE_META
`else
`define
BSV_ARESET_EDGE_ARRAY
`endif
// Sized fifo. Model has output register which improves timing
module
SizedFIFO
(
CLK
,
RST
,
D_IN
,
ENQ
,
FULL_N
,
D_OUT
,
DEQ
,
EMPTY_N
,
CLR
);
parameter
p1width
=
1
;
// data width
parameter
p2depth
=
3
;
parameter
p3cntr_width
=
1
;
// log(p2depth-1)
// The -1 is allowed since this model has a fast output register
parameter
guarded
=
1
;
localparam
p2depth2
=
(
p2depth
>=
2
)
?
(
p2depth
-
2
)
:
0
;
input
CLK
;
input
RST
;
input
CLR
;
input
[
p1width
-
1
:
0
]
D_IN
;
input
ENQ
;
input
DEQ
;
output
FULL_N
;
output
EMPTY_N
;
output
[
p1width
-
1
:
0
]
D_OUT
;
reg
not_ring_full
;
reg
ring_empty
;
reg
[
p3cntr_width
-
1
:
0
]
head
;
wire
[
p3cntr_width
-
1
:
0
]
next_head
;
reg
[
p3cntr_width
-
1
:
0
]
tail
;
wire
[
p3cntr_width
-
1
:
0
]
next_tail
;
// if the depth is too small, don't create an ill-sized array;
// instead, make a 1-sized array and let the initial block report an error
(
*
RAM_STYLE
=
"DISTRIBUTED"
*
)
reg
[
p1width
-
1
:
0
]
arr
[
0
:
p2depth2
];
reg
[
p1width
-
1
:
0
]
D_OUT
;
reg
hasodata
;
wire
[
p3cntr_width
-
1
:
0
]
depthLess2
=
p2depth2
[
p3cntr_width
-
1
:
0
]
;
wire
[
p3cntr_width
-
1
:
0
]
incr_tail
;
wire
[
p3cntr_width
-
1
:
0
]
incr_head
;
assign
incr_tail
=
tail
+
1'b1
;
assign
incr_head
=
head
+
1'b1
;
assign
next_head
=
(
head
==
depthLess2
)
?
{
p3cntr_width
{
1'b0
}}
:
incr_head
;
assign
next_tail
=
(
tail
==
depthLess2
)
?
{
p3cntr_width
{
1'b0
}}
:
incr_tail
;
assign
EMPTY_N
=
hasodata
;
assign
FULL_N
=
not_ring_full
;
`ifdef
BSV_NO_INITIAL_BLOCKS
`else
// not BSV_NO_INITIAL_BLOCKS
// synopsys translate_off
initial
begin
:
initial_block
integer
i
;
D_OUT
=
{
((
p1width
+
1
)
/
2
)
{
2'b10
}}
;
ring_empty
=
1'b1
;
not_ring_full
=
1'b1
;
hasodata
=
1'b0
;
head
=
{
p3cntr_width
{
1'b0
}}
;
tail
=
{
p3cntr_width
{
1'b0
}}
;
for
(
i
=
0
;
i
<=
p2depth2
;
i
=
i
+
1
)
begin
arr
[
i
]
=
D_OUT
;
end
end
// synopsys translate_on
`endif
// BSV_NO_INITIAL_BLOCKS
always
@
(
posedge
CLK
`BSV_ARESET_EDGE_META
)
begin
if
(
RST
==
`BSV_RESET_VALUE
)
begin
head
<=
`BSV_ASSIGNMENT_DELAY
{
p3cntr_width
{
1'b0
}}
;
tail
<=
`BSV_ASSIGNMENT_DELAY
{
p3cntr_width
{
1'b0
}}
;
ring_empty
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
not_ring_full
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
hasodata
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
end
// if (RST == `BSV_RESET_VALUE)
else
begin
casez
(
{
CLR
,
DEQ
,
ENQ
,
hasodata
,
ring_empty
}
)
// Clear operation
5'b1????
:
begin
head
<=
`BSV_ASSIGNMENT_DELAY
{
p3cntr_width
{
1'b0
}}
;
tail
<=
`BSV_ASSIGNMENT_DELAY
{
p3cntr_width
{
1'b0
}}
;
ring_empty
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
not_ring_full
<=
`BSV_ASSIGNMENT_DELAY
1'b1
;
hasodata
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;
end
// -----------------------
// DEQ && ENQ case -- change head and tail if added to ring
5'b011?0
:
begin
tail
<=
`BSV_ASSIGNMENT_DELAY
next_tail
;
head
<=
`BSV_ASSIGNMENT_DELAY
next_head
;
end
// -----------------------
// DEQ only and NO data is in ring
5'b010?1
:
begin
hasodata
<=
`BSV_ASSIGNMENT_DELAY
1'b0
;